loadkeys: Use the output stream as an argument
authorAlexey Gladkov <gladkov.alexey@gmail.com>
Sun, 8 Jul 2012 11:34:19 +0000 (15:34 +0400)
committerAlexey Gladkov <gladkov.alexey@gmail.com>
Sun, 8 Jul 2012 11:34:19 +0000 (15:34 +0400)
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
src/loadkeys.c
src/loadkeys.y

index 5927b6e..205b8e1 100644 (file)
@@ -842,7 +842,8 @@ compose_as_usual(char *charset)
  * mktable.c
  *
  */
-static char *mk_mapname(char modifier)
+static char *
+mk_mapname(char modifier)
 {
        static char *modifiers[8] = {
                "shift", "altgr", "ctrl", "alt", "shl", "shr", "ctl", "ctr"
@@ -862,15 +863,17 @@ static char *mk_mapname(char modifier)
        return buf;
 }
 
-static void outchar(unsigned char c, int comma)
+static void
+outchar(FILE *fd, unsigned char c, int comma)
 {
-       printf("'");
-       printf((c == '\'' || c == '\\') ? "\\%c" : isgraph(c) ? "%c"
+       fprintf(fd, "'");
+       fprintf(fd, (c == '\'' || c == '\\') ? "\\%c" : isgraph(c) ? "%c"
               : "\\%03o", c);
-       printf(comma ? "', " : "'");
+       fprintf(fd, comma ? "', " : "'");
 }
 
-static void attr_noreturn mktable(void)
+static void
+mktable(FILE *fd)
 {
        int j;
        unsigned int i, imax;
@@ -879,46 +882,46 @@ static void attr_noreturn mktable(void)
        unsigned int maxfunc;
        unsigned int keymap_count = 0;
 
-       printf(
+       fprintf(fd,
 /* not to be translated... */
-                     "/* Do not edit this file! It was automatically generated by   */\n");
-       printf
-           ("/*    loadkeys --mktable defkeymap.map > defkeymap.c          */\n\n");
-       printf("#include <linux/types.h>\n");
-       printf("#include <linux/keyboard.h>\n");
-       printf("#include <linux/kd.h>\n\n");
+                   "/* Do not edit this file! It was automatically generated by   */\n");
+       fprintf(fd, "/*    loadkeys --mktable defkeymap.map > defkeymap.c          */\n\n");
+       fprintf(fd, "#include <linux/types.h>\n");
+       fprintf(fd, "#include <linux/keyboard.h>\n");
+       fprintf(fd, "#include <linux/kd.h>\n\n");
 
        for (i = 0; i < MAX_NR_KEYMAPS; i++)
                if (key_map[i]) {
                        keymap_count++;
                        if (i)
-                               printf("static ");
-                       printf("u_short %s_map[NR_KEYS] = {", mk_mapname(i));
+                               fprintf(fd, "static ");
+                       fprintf(fd, "u_short %s_map[NR_KEYS] = {", mk_mapname(i));
                        for (j = 0; j < NR_KEYS; j++) {
                                if (!(j % 8))
-                                       printf("\n");
-                               printf("\t0x%04x,", U((key_map[i])[j]));
+                                       fprintf(fd, "\n");
+                               fprintf(fd, "\t0x%04x,", U((key_map[i])[j]));
                        }
-                       printf("\n};\n\n");
+                       fprintf(fd, "\n};\n\n");
                }
 
        for (imax = MAX_NR_KEYMAPS - 1; imax > 0; imax--)
                if (key_map[imax])
                        break;
-       printf("ushort *key_maps[MAX_NR_KEYMAPS] = {");
+       fprintf(fd, "ushort *key_maps[MAX_NR_KEYMAPS] = {");
        for (i = 0; i <= imax; i++) {
-               printf((i % 4) ? " " : "\n\t");
+               fprintf(fd, (i % 4) ? " " : "\n\t");
                if (key_map[i])
-                       printf("%s_map,", mk_mapname(i));
+                       fprintf(fd, "%s_map,", mk_mapname(i));
                else
-                       printf("0,");
+                       fprintf(fd, "0,");
        }
        if (imax < MAX_NR_KEYMAPS - 1)
-               printf("\t0");
-       printf("\n};\n\nunsigned int keymap_count = %d;\n\n", keymap_count);
+               fprintf(fd, "\t0");
+       fprintf(fd, "\n};\n\nunsigned int keymap_count = %d;\n\n", keymap_count);
 
 /* uglified just for xgettext - it complains about nonterminated strings */
-       printf("/*\n"
+       fprintf(fd,
+              "/*\n"
               " * Philosophy: most people do not define more strings, but they who do\n"
               " * often want quite a lot of string space. So, we statically allocate\n"
               " * the default and allocate dynamically in chunks of 512 bytes.\n"
@@ -927,72 +930,69 @@ static void attr_noreturn mktable(void)
                if (func_table[maxfunc - 1])
                        break;
 
-       printf("char func_buf[] = {\n");
+       fprintf(fd, "char func_buf[] = {\n");
        for (i = 0; i < maxfunc; i++) {
                ptr = func_table[i];
                if (ptr) {
-                       printf("\t");
+                       fprintf(fd, "\t");
                        for (; *ptr; ptr++)
-                               outchar(*ptr, 1);
-                       printf("0, \n");
+                               outchar(fd, *ptr, 1);
+                       fprintf(fd, "0, \n");
                }
        }
        if (!maxfunc)
-               printf("\t0\n");
-       printf("};\n\n");
+               fprintf(fd, "\t0\n");
+       fprintf(fd, "};\n\n");
 
-       printf("char *funcbufptr = func_buf;\n"
+       fprintf(fd,
+              "char *funcbufptr = func_buf;\n"
               "int funcbufsize = sizeof(func_buf);\n"
               "int funcbufleft = 0;          /* space left */\n" "\n");
 
-       printf("char *func_table[MAX_NR_FUNC] = {\n");
+       fprintf(fd, "char *func_table[MAX_NR_FUNC] = {\n");
        for (i = 0; i < maxfunc; i++) {
                if (func_table[i])
-                       printf("\tfunc_buf + %ld,\n",
+                       fprintf(fd, "\tfunc_buf + %ld,\n",
                               (long)(func_table[i] - func_buf));
                else
-                       printf("\t0,\n");
+                       fprintf(fd, "\t0,\n");
        }
        if (maxfunc < MAX_NR_FUNC)
-               printf("\t0,\n");
-       printf("};\n");
+               fprintf(fd, "\t0,\n");
+       fprintf(fd, "};\n");
 
 #ifdef KDSKBDIACRUC
        if (prefer_unicode) {
-               printf("\nstruct kbdiacruc accent_table[MAX_DIACR] = {\n");
+               fprintf(fd, "\nstruct kbdiacruc accent_table[MAX_DIACR] = {\n");
                for (i = 0; i < accent_table_size; i++) {
-                       printf("\t{");
-                       outchar(accent_table[i].diacr, 1);
-                       outchar(accent_table[i].base, 1);
-                       printf("0x%04x},", accent_table[i].result);
+                       fprintf(fd, "\t{");
+                       outchar(fd, accent_table[i].diacr, 1);
+                       outchar(fd, accent_table[i].base, 1);
+                       fprintf(fd, "0x%04x},", accent_table[i].result);
                        if (i % 2)
-                               printf("\n");
+                               fprintf(fd, "\n");
                }
                if (i % 2)
-                       printf("\n");
-               printf("};\n\n");
+                       fprintf(fd, "\n");
+               fprintf(fd, "};\n\n");
        } else
 #endif
        {
-               printf("\nstruct kbdiacr accent_table[MAX_DIACR] = {\n");
+               fprintf(fd, "\nstruct kbdiacr accent_table[MAX_DIACR] = {\n");
                for (i = 0; i < accent_table_size; i++) {
-                       printf("\t{");
-                       outchar(accent_table[i].diacr, 1);
-                       outchar(accent_table[i].base, 1);
-                       outchar(accent_table[i].result, 0);
-                       printf("},");
+                       fprintf(fd, "\t{");
+                       outchar(fd, accent_table[i].diacr, 1);
+                       outchar(fd, accent_table[i].base, 1);
+                       outchar(fd, accent_table[i].result, 0);
+                       fprintf(fd, "},");
                        if (i % 2)
-                               printf("\n");
+                               fprintf(fd, "\n");
                }
                if (i % 2)
-                       printf("\n");
-               printf("};\n\n");
+                       fprintf(fd, "\n");
+               fprintf(fd, "};\n\n");
        }
-       printf("unsigned int accent_table_size = %d;\n", accent_table_size);
-
-       freekeys();
-
-       exit(0);
+       fprintf(fd, "unsigned int accent_table_size = %d;\n", accent_table_size);
 }
 
 static void attr_noreturn bkeymap(void)
@@ -3159,8 +3159,11 @@ int main(int argc, char *argv[])
        if (optb)
                bkeymap();
 
-       if (optm)
-               mktable();
+       if (optm) {
+               mktable(stdout);
+               freekeys();
+               exit(EXIT_SUCCESS);
+       }
 
        loadkeys(fd, kbd_mode);
 
index 9099c04..d3b3949 100644 (file)
@@ -783,7 +783,8 @@ compose_as_usual(char *charset)
  * mktable.c
  *
  */
-static char *mk_mapname(char modifier)
+static char *
+mk_mapname(char modifier)
 {
        static char *modifiers[8] = {
                "shift", "altgr", "ctrl", "alt", "shl", "shr", "ctl", "ctr"
@@ -803,15 +804,17 @@ static char *mk_mapname(char modifier)
        return buf;
 }
 
-static void outchar(unsigned char c, int comma)
+static void
+outchar(FILE *fd, unsigned char c, int comma)
 {
-       printf("'");
-       printf((c == '\'' || c == '\\') ? "\\%c" : isgraph(c) ? "%c"
+       fprintf(fd, "'");
+       fprintf(fd, (c == '\'' || c == '\\') ? "\\%c" : isgraph(c) ? "%c"
               : "\\%03o", c);
-       printf(comma ? "', " : "'");
+       fprintf(fd, comma ? "', " : "'");
 }
 
-static void attr_noreturn mktable(void)
+static void
+mktable(FILE *fd)
 {
        int j;
        unsigned int i, imax;
@@ -820,46 +823,46 @@ static void attr_noreturn mktable(void)
        unsigned int maxfunc;
        unsigned int keymap_count = 0;
 
-       printf(
+       fprintf(fd,
 /* not to be translated... */
-                     "/* Do not edit this file! It was automatically generated by   */\n");
-       printf
-           ("/*    loadkeys --mktable defkeymap.map > defkeymap.c          */\n\n");
-       printf("#include <linux/types.h>\n");
-       printf("#include <linux/keyboard.h>\n");
-       printf("#include <linux/kd.h>\n\n");
+                   "/* Do not edit this file! It was automatically generated by   */\n");
+       fprintf(fd, "/*    loadkeys --mktable defkeymap.map > defkeymap.c          */\n\n");
+       fprintf(fd, "#include <linux/types.h>\n");
+       fprintf(fd, "#include <linux/keyboard.h>\n");
+       fprintf(fd, "#include <linux/kd.h>\n\n");
 
        for (i = 0; i < MAX_NR_KEYMAPS; i++)
                if (key_map[i]) {
                        keymap_count++;
                        if (i)
-                               printf("static ");
-                       printf("u_short %s_map[NR_KEYS] = {", mk_mapname(i));
+                               fprintf(fd, "static ");
+                       fprintf(fd, "u_short %s_map[NR_KEYS] = {", mk_mapname(i));
                        for (j = 0; j < NR_KEYS; j++) {
                                if (!(j % 8))
-                                       printf("\n");
-                               printf("\t0x%04x,", U((key_map[i])[j]));
+                                       fprintf(fd, "\n");
+                               fprintf(fd, "\t0x%04x,", U((key_map[i])[j]));
                        }
-                       printf("\n};\n\n");
+                       fprintf(fd, "\n};\n\n");
                }
 
        for (imax = MAX_NR_KEYMAPS - 1; imax > 0; imax--)
                if (key_map[imax])
                        break;
-       printf("ushort *key_maps[MAX_NR_KEYMAPS] = {");
+       fprintf(fd, "ushort *key_maps[MAX_NR_KEYMAPS] = {");
        for (i = 0; i <= imax; i++) {
-               printf((i % 4) ? " " : "\n\t");
+               fprintf(fd, (i % 4) ? " " : "\n\t");
                if (key_map[i])
-                       printf("%s_map,", mk_mapname(i));
+                       fprintf(fd, "%s_map,", mk_mapname(i));
                else
-                       printf("0,");
+                       fprintf(fd, "0,");
        }
        if (imax < MAX_NR_KEYMAPS - 1)
-               printf("\t0");
-       printf("\n};\n\nunsigned int keymap_count = %d;\n\n", keymap_count);
+               fprintf(fd, "\t0");
+       fprintf(fd, "\n};\n\nunsigned int keymap_count = %d;\n\n", keymap_count);
 
 /* uglified just for xgettext - it complains about nonterminated strings */
-       printf("/*\n"
+       fprintf(fd,
+              "/*\n"
               " * Philosophy: most people do not define more strings, but they who do\n"
               " * often want quite a lot of string space. So, we statically allocate\n"
               " * the default and allocate dynamically in chunks of 512 bytes.\n"
@@ -868,72 +871,69 @@ static void attr_noreturn mktable(void)
                if (func_table[maxfunc - 1])
                        break;
 
-       printf("char func_buf[] = {\n");
+       fprintf(fd, "char func_buf[] = {\n");
        for (i = 0; i < maxfunc; i++) {
                ptr = func_table[i];
                if (ptr) {
-                       printf("\t");
+                       fprintf(fd, "\t");
                        for (; *ptr; ptr++)
-                               outchar(*ptr, 1);
-                       printf("0, \n");
+                               outchar(fd, *ptr, 1);
+                       fprintf(fd, "0, \n");
                }
        }
        if (!maxfunc)
-               printf("\t0\n");
-       printf("};\n\n");
+               fprintf(fd, "\t0\n");
+       fprintf(fd, "};\n\n");
 
-       printf("char *funcbufptr = func_buf;\n"
+       fprintf(fd,
+              "char *funcbufptr = func_buf;\n"
               "int funcbufsize = sizeof(func_buf);\n"
               "int funcbufleft = 0;          /* space left */\n" "\n");
 
-       printf("char *func_table[MAX_NR_FUNC] = {\n");
+       fprintf(fd, "char *func_table[MAX_NR_FUNC] = {\n");
        for (i = 0; i < maxfunc; i++) {
                if (func_table[i])
-                       printf("\tfunc_buf + %ld,\n",
+                       fprintf(fd, "\tfunc_buf + %ld,\n",
                               (long)(func_table[i] - func_buf));
                else
-                       printf("\t0,\n");
+                       fprintf(fd, "\t0,\n");
        }
        if (maxfunc < MAX_NR_FUNC)
-               printf("\t0,\n");
-       printf("};\n");
+               fprintf(fd, "\t0,\n");
+       fprintf(fd, "};\n");
 
 #ifdef KDSKBDIACRUC
        if (prefer_unicode) {
-               printf("\nstruct kbdiacruc accent_table[MAX_DIACR] = {\n");
+               fprintf(fd, "\nstruct kbdiacruc accent_table[MAX_DIACR] = {\n");
                for (i = 0; i < accent_table_size; i++) {
-                       printf("\t{");
-                       outchar(accent_table[i].diacr, 1);
-                       outchar(accent_table[i].base, 1);
-                       printf("0x%04x},", accent_table[i].result);
+                       fprintf(fd, "\t{");
+                       outchar(fd, accent_table[i].diacr, 1);
+                       outchar(fd, accent_table[i].base, 1);
+                       fprintf(fd, "0x%04x},", accent_table[i].result);
                        if (i % 2)
-                               printf("\n");
+                               fprintf(fd, "\n");
                }
                if (i % 2)
-                       printf("\n");
-               printf("};\n\n");
+                       fprintf(fd, "\n");
+               fprintf(fd, "};\n\n");
        } else
 #endif
        {
-               printf("\nstruct kbdiacr accent_table[MAX_DIACR] = {\n");
+               fprintf(fd, "\nstruct kbdiacr accent_table[MAX_DIACR] = {\n");
                for (i = 0; i < accent_table_size; i++) {
-                       printf("\t{");
-                       outchar(accent_table[i].diacr, 1);
-                       outchar(accent_table[i].base, 1);
-                       outchar(accent_table[i].result, 0);
-                       printf("},");
+                       fprintf(fd, "\t{");
+                       outchar(fd, accent_table[i].diacr, 1);
+                       outchar(fd, accent_table[i].base, 1);
+                       outchar(fd, accent_table[i].result, 0);
+                       fprintf(fd, "},");
                        if (i % 2)
-                               printf("\n");
+                               fprintf(fd, "\n");
                }
                if (i % 2)
-                       printf("\n");
-               printf("};\n\n");
+                       fprintf(fd, "\n");
+               fprintf(fd, "};\n\n");
        }
-       printf("unsigned int accent_table_size = %d;\n", accent_table_size);
-
-       freekeys();
-
-       exit(0);
+       fprintf(fd, "unsigned int accent_table_size = %d;\n", accent_table_size);
 }
 
 static void attr_noreturn bkeymap(void)
@@ -1348,8 +1348,11 @@ int main(int argc, char *argv[])
        if (optb)
                bkeymap();
 
-       if (optm)
-               mktable();
+       if (optm) {
+               mktable(stdout);
+               freekeys();
+               exit(EXIT_SUCCESS);
+       }
 
        loadkeys(fd, kbd_mode);