aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Gladkov <gladkov.alexey@gmail.com>2020-04-10 12:23:29 +0200
committerAlexey Gladkov <gladkov.alexey@gmail.com>2020-04-10 12:23:29 +0200
commitbdc74f89c19c258d77c3e19eacf503d6277d3056 (patch)
treea93f9b455a750b808f38617f84875fd0d47d2326
parent5d2c6527b38361635e8068d6e1bd87918778f2ac (diff)
downloadkbd-bdc74f89c19c258d77c3e19eacf503d6277d3056.tar.gz
Move addpair and addseq to separate source
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
-rw-r--r--src/Makefile.am1
-rw-r--r--src/loadunimap.c10
-rw-r--r--src/psffontop.c58
-rw-r--r--src/psffontop.h15
-rw-r--r--src/psfxtable.c65
-rw-r--r--src/unicode.c66
-rw-r--r--src/unicode.h24
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_ */