diff options
author | Alexey Gladkov <gladkov.alexey@gmail.com> | 2020-04-10 12:23:29 +0200 |
---|---|---|
committer | Alexey Gladkov <gladkov.alexey@gmail.com> | 2020-04-10 12:23:29 +0200 |
commit | bdc74f89c19c258d77c3e19eacf503d6277d3056 (patch) | |
tree | a93f9b455a750b808f38617f84875fd0d47d2326 | |
parent | 5d2c6527b38361635e8068d6e1bd87918778f2ac (diff) | |
download | kbd-bdc74f89c19c258d77c3e19eacf503d6277d3056.tar.gz |
Move addpair and addseq to separate source
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/loadunimap.c | 10 | ||||
-rw-r--r-- | src/psffontop.c | 58 | ||||
-rw-r--r-- | src/psffontop.h | 15 | ||||
-rw-r--r-- | src/psfxtable.c | 65 | ||||
-rw-r--r-- | src/unicode.c | 66 | ||||
-rw-r--r-- | src/unicode.h | 24 |
7 files changed, 135 insertions, 104 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 784d8b56..f0409df2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -42,6 +42,7 @@ EXTRA_DIST = \ libfont_a_SOURCES = \ psf.h psffontop.c psffontop.h \ + unicode.c unicode.h \ utf8.c utf8.h \ kdmapop.c kdmapop.h \ loadunimap.c loadunimap.h \ diff --git a/src/loadunimap.c b/src/loadunimap.c index dd2c6593..c4eb2aeb 100644 --- a/src/loadunimap.c +++ b/src/loadunimap.c @@ -144,7 +144,7 @@ static unsigned int listsz = 0; static unsigned int listct = 0; static void -addpair(int fp, int un) +add_unipair(int fp, int un) { if (listct == listsz) { listsz += 4096; @@ -223,7 +223,7 @@ parseline(char *buffer, const char *tblname) if (!strncmp(p, "idem", 4)) { p += 4; for (i = fp0; i <= fp1; i++) - addpair(i, i); + add_unipair(i, i); goto lookattail; } @@ -232,7 +232,7 @@ parseline(char *buffer, const char *tblname) p++; if (*p != '-') { for (i = fp0; i <= fp1; i++) - addpair(i, un0); + add_unipair(i, un0); goto lookattail; } @@ -253,14 +253,14 @@ parseline(char *buffer, const char *tblname) exit(EX_DATAERR); } for (i = fp0; i <= fp1; i++) - addpair(i, un0 - fp0 + i); + add_unipair(i, un0 - fp0 + i); } else { /* no range; expect a list of unicode values for a single font position */ while ((un0 = getunicode(&p)) >= 0) - addpair(fp0, un0); + add_unipair(fp0, un0); } lookattail: while (*p == ' ' || *p == '\t') diff --git a/src/psffontop.c b/src/psffontop.c index ee7a0883..dfd6bc7a 100644 --- a/src/psffontop.c +++ b/src/psffontop.c @@ -12,46 +12,11 @@ #include "libcommon.h" #include "psf.h" +#include "unicode.h" #include "psffontop.h" #include "utf8.h" #include "paths.h" -static void -addpair(struct unicode_list *up, int32_t uc) -{ - struct unicode_list *ul; - struct unicode_seq *us; - - ul = xmalloc(sizeof(struct unicode_list)); - us = xmalloc(sizeof(struct unicode_seq)); - us->uc = uc; - us->prev = us; - us->next = NULL; - ul->seq = us; - ul->prev = up->prev; - ul->prev->next = ul; - ul->next = NULL; - up->prev = ul; -} - -static void -addseq(struct unicode_list *up, int32_t uc) -{ - struct unicode_seq *us; - struct unicode_seq *usl; - struct unicode_list *ul = up->prev; - - usl = ul->seq; - while (usl->next) - usl = usl->next; - us = xmalloc(sizeof(struct unicode_seq)); - us->uc = uc; - us->prev = usl; - us->next = NULL; - usl->next = us; - //ul->seq->prev = us; -} - static uint32_t assemble_uint32(unsigned char *ip) { @@ -114,14 +79,6 @@ assemble_utf8(const unsigned char **inptr, int cnt) return uc; } -static void -clear_uni_entry(struct unicode_list *up) -{ - up->next = NULL; - up->seq = NULL; - up->prev = up; -} - /* * Read description of a single font position. */ @@ -161,10 +118,19 @@ get_uni_entry(const unsigned char **inptr, const unsigned char **endptr, struct continue; } } + + int ret; + if (inseq < 2) - addpair(up, unichar); + ret = addpair(up, unichar); else - addseq(up, unichar); + ret = addseq(up, unichar); + + if (ret < 0) { + fprintf(stderr, "%s\n", strerror(-ret)); + exit(EX_OSERR); + } + if (inseq) inseq++; } diff --git a/src/psffontop.h b/src/psffontop.h index d7785dc1..b36fc5d5 100644 --- a/src/psffontop.h +++ b/src/psffontop.h @@ -4,24 +4,11 @@ #define _PSFFONTOP_H #include <stdint.h> +#include "unicode.h" /* Maximum font size that we try to handle */ #define MAXFONTSIZE 65536 -typedef int32_t unicode; - -struct unicode_seq { - struct unicode_seq *next; - struct unicode_seq *prev; - unicode uc; -}; - -struct unicode_list { - struct unicode_list *next; - struct unicode_list *prev; - struct unicode_seq *seq; -}; - /** * readpsffont reads a PSF font. * diff --git a/src/psfxtable.c b/src/psfxtable.c index 65a763e2..2c5a00c5 100644 --- a/src/psfxtable.c +++ b/src/psfxtable.c @@ -53,39 +53,6 @@ */ struct unicode_list *uclistheads; -static void -addpair(long fontpos, unicode uc) -{ - struct unicode_list *ul; - struct unicode_seq *us; - - ul = xmalloc(sizeof(struct unicode_list)); - us = xmalloc(sizeof(struct unicode_seq)); - us->uc = uc; - us->prev = us; - us->next = NULL; - ul->seq = us; - ul->prev = uclistheads[fontpos].prev; - ul->prev->next = ul; - ul->next = NULL; - uclistheads[fontpos].prev = ul; -} - -static void -addseq(long fontpos, unicode uc) -{ - struct unicode_list *ul; - struct unicode_seq *us; - - ul = uclistheads[fontpos].prev; - us = xmalloc(sizeof(struct unicode_seq)); - us->uc = uc; - us->prev = ul->seq->prev; - us->prev->next = us; - us->next = NULL; - ul->seq->prev = us; -} - static long getunicode(char **p0) { @@ -154,14 +121,21 @@ parse_itab_line(char *buf, unsigned int fontlen) exit(EX_DATAERR); } + int ret = 0; + if (fp1) { /* we have a range; expect the word "idem" or a Unicode range of the same length */ while (*p == ' ' || *p == '\t') p++; if (!strncmp(p, "idem", 4)) { - for (i = fp0; i <= fp1; i++) - addpair(i, i); + for (i = fp0; i <= fp1; i++) { + ret = addpair(uclistheads + i, i); + if (ret < 0) { + fprintf(stderr, "%s\n", strerror(-ret)); + exit(EX_OSERR); + } + } p += 4; } else { un0 = getunicode(&p); @@ -191,14 +165,27 @@ parse_itab_line(char *buf, unsigned int fontlen) un0, un1, fp0, fp1); exit(EX_DATAERR); } - for (i = fp0; i <= fp1; i++) - addpair(i, un0 - fp0 + i); + for (i = fp0; i <= fp1; i++) { + ret = addpair(uclistheads + i, un0 - fp0 + i); + if (ret < 0) { + fprintf(stderr, "%s\n", strerror(-ret)); + exit(EX_OSERR); + } + } } /* not idem */ } else { /* no range */ while ((un0 = getunicode(&p)) >= 0) { - addpair(fp0, un0); + ret = addpair(uclistheads + fp0, un0); + if (ret < 0) { + fprintf(stderr, "%s\n", strerror(-ret)); + exit(EX_OSERR); + } while (*p++ == ',' && (un1 = getunicode(&p)) >= 0) { - addseq(fp0, un1); + ret = addseq(uclistheads + fp0, un1); + if (ret < 0) { + fprintf(stderr, "%s\n", strerror(-ret)); + exit(EX_OSERR); + } } p--; } diff --git a/src/unicode.c b/src/unicode.c new file mode 100644 index 00000000..ee2a2683 --- /dev/null +++ b/src/unicode.c @@ -0,0 +1,66 @@ +#include <stdlib.h> +#include <errno.h> + +#include "unicode.h" + +int +addpair(struct unicode_list *up, unicode uc) +{ + struct unicode_list *ul = NULL; + struct unicode_seq *us = NULL; + + if (!(ul = malloc(sizeof(*ul)))) + goto err; + + if (!(us = malloc(sizeof(*us)))) + goto err; + + us->uc = uc; + us->prev = us; + us->next = NULL; + + ul->seq = us; + ul->prev = up->prev; + ul->prev->next = ul; + ul->next = NULL; + + up->prev = ul; + + return 0; +err: + free(ul); + free(us); + + return -ENOMEM; +} + +int +addseq(struct unicode_list *up, unicode uc) +{ + struct unicode_list *ul = up->prev; + struct unicode_seq *usl = ul->seq; + struct unicode_seq *us = NULL; + + if (!(us = malloc(sizeof(*us)))) + return -ENOMEM; + + while (usl->next) + usl = usl->next; + + us->uc = uc; + us->prev = usl; + us->next = NULL; + + usl->next = us; + ul->seq->prev = us; + + return 0; +} + +void +clear_uni_entry(struct unicode_list *up) +{ + up->next = NULL; + up->seq = NULL; + up->prev = up; +} diff --git a/src/unicode.h b/src/unicode.h new file mode 100644 index 00000000..d1ebb32c --- /dev/null +++ b/src/unicode.h @@ -0,0 +1,24 @@ +#ifndef _UNICODE_H_ +#define _UNICODE_H_ + +#include <stdint.h> + +typedef int32_t unicode; + +struct unicode_seq { + struct unicode_seq *next; + struct unicode_seq *prev; + unicode uc; +}; + +struct unicode_list { + struct unicode_list *next; + struct unicode_list *prev; + struct unicode_seq *seq; +}; + +int addpair(struct unicode_list *up, unicode uc); +int addseq(struct unicode_list *up, unicode uc); +void clear_uni_entry(struct unicode_list *up); + +#endif /* _UNICODE_H_ */ |