ncurses 5.7 - patch 20090808
[ncurses.git] / ncurses / tinfo / MKnames.awk
index 6be00ad4488d4cef08af5606debbb196b129ad95..7685d1831ef04733c4a487a478f997422b72c4f1 100644 (file)
@@ -1,5 +1,5 @@
 ##############################################################################
-# Copyright (c) 1998-2000,2006 Free Software Foundation, Inc.                #
+# Copyright (c) 2007-2008,2009 Free Software Foundation, Inc.                #
 #                                                                            #
 # Permission is hereby granted, free of charge, to any person obtaining a    #
 # copy of this software and associated documentation files (the "Software"), #
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
-# $Id: MKnames.awk,v 1.12 2006/04/22 21:46:17 tom Exp $
-BEGIN          {
-                       print  "/* This file was generated by MKnames.awk */" > "namehdr"
-                       print  ""                               > "namehdr"
-                       print  "#include <curses.priv.h>"       > "namehdr"
-                       print  ""                               > "namehdr"
-                       print  "#define IT NCURSES_CONST char * const"  > "namehdr"
-                       print  ""                               > "namehdr"
-                       print  "#if BROKEN_LINKER"              > "namehdr"
-                       print  "#include <term.h>"              > "namehdr"
-                       print  "#define DCL(it) static IT data##it[]" > "namehdr"
-                       print  "#else"                          > "namehdr"
-                       print  "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]"    > "namehdr"
-                       print  "#endif"                         > "namehdr"
-                       print  ""                               > "namehdr"
-                       print  "/*"                             > "boolnames"
-                       print  " *      names.c - Arrays of capability names and codes"  > "boolnames"
-                       print  " *"                             > "boolnames"
-                       print  " */"                            > "boolnames"
-                       print  ""                               > "boolnames"
-                       print  "DCL(boolnames)  = {"            > "boolnames"
-                       print  "DCL(boolfnames) = {"            > "boolfnames"
-                       print  "DCL(boolcodes)  = {"            > "boolcodes"
-                       print  "DCL(numnames)   = {"            > "numnames"
-                       print  "DCL(numfnames)  = {"            > "numfnames"
-                       print  "DCL(numcodes)   = {"            > "numcodes"
-                       print  "DCL(strnames)   = {"            > "strnames"
-                       print  "DCL(strfnames)  = {"            > "strfnames"
-                       print  "DCL(strcodes)   = {"            > "strcodes"
-               }
+# $Id: MKnames.awk,v 1.22 2009/03/21 21:03:39 tom Exp $
+function large_item(value) {
+       result = sprintf("%d,", offset);
+       offset = offset + length(value) + 1;
+       offcol = offcol + length(result) + 2;
+       if (offcol > 70) {
+               result = result "\n";
+               offcol = 0;
+       } else {
+               result = result " ";
+       }
+       bigstr = bigstr sprintf("\"%s\\0\" ", value);
+       bigcol = bigcol + length(value) + 5;
+       if (bigcol > 70) {
+               bigstr = bigstr "\\\n";
+               bigcol = 0;
+       }
+       return result;
+}
+
+function small_item(value) {
+       return sprintf("\t\t\"%s\",\n", value);
+}
+
+function print_strings(name,value) {
+       printf  "DCL(%s) = {\n", name
+       print  value
+       print  "\t\t(NCURSES_CONST char *)0,"
+       print  "};"
+       print  ""
+}
+
+function print_offsets(name,value) {
+       printf  "static const short _nc_offset_%s[] = {\n", name
+       printf "%s",  value
+       print  "};"
+       print  ""
+       printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name
+       print  ""
+}
+
+BEGIN  {
+               print  "/* This file was generated by MKnames.awk */"
+               print  ""
+               print  "#include <curses.priv.h>"
+               print  ""
+               print  "#define IT NCURSES_CONST char * const"
+               print  ""
+               offset = 0;
+               offcol = 0;
+               bigcol = 0;
+       }
 
 $1 ~ /^#/              {next;}
 
 $1 == "SKIPWARN"       {next;}
 
 $3 == "bool"   {
-                       printf "\t\t\"%s\",\n", $2 > "boolnames"
-                       printf "\t\t\"%s\",\n", $1 > "boolfnames"
-                       printf "\t\t\"%s\",\n", $4 > "boolcodes"
+                       small_boolnames = small_boolnames small_item($2);
+                       large_boolnames = large_boolnames large_item($2);
+                       small_boolfnames = small_boolfnames small_item($1);
+                       large_boolfnames = large_boolfnames large_item($1);
                }
 
 $3 == "num"    {
-                       printf "\t\t\"%s\",\n", $2 > "numnames"
-                       printf "\t\t\"%s\",\n", $1 > "numfnames"
-                       printf "\t\t\"%s\",\n", $4 > "numcodes"
+                       small_numnames = small_numnames small_item($2);
+                       large_numnames = large_numnames large_item($2);
+                       small_numfnames = small_numfnames small_item($1);
+                       large_numfnames = large_numfnames large_item($1);
                }
 
 $3 == "str"    {
-                       printf "\t\t\"%s\",\n", $2 > "strnames"
-                       printf "\t\t\"%s\",\n", $1 > "strfnames"
-                       printf "\t\t\"%s\",\n", $4 > "strcodes"
+                       small_strnames = small_strnames small_item($2);
+                       large_strnames = large_strnames large_item($2);
+                       small_strfnames = small_strfnames small_item($1);
+                       large_strfnames = large_strfnames large_item($1);
                }
 
-END            {
-                       print  "\t\t(NCURSES_CONST char *)0," > "boolnames"
-                       print  "};" > "boolnames"
-                       print  "" > "boolnames"
-                       print  "\t\t(NCURSES_CONST char *)0," > "boolfnames"
-                       print  "};" > "boolfnames"
-                       print  "" > "boolfnames"
-                       print  "\t\t(NCURSES_CONST char *)0," > "boolcodes"
-                       print  "};" > "boolcodes"
-                       print  "" > "boolcodes"
-                       print  "\t\t(NCURSES_CONST char *)0," > "numnames"
-                       print  "};" > "numnames"
-                       print  "" > "numnames"
-                       print  "\t\t(NCURSES_CONST char *)0," > "numfnames"
-                       print  "};" > "numfnames"
-                       print  "" > "numfnames"
-                       print  "\t\t(NCURSES_CONST char *)0," > "numcodes"
-                       print  "};" > "numcodes"
-                       print  "" > "numcodes"
-                       print  "\t\t(NCURSES_CONST char *)0," > "strnames"
-                       print  "};" > "strnames"
-                       print  "" > "strnames"
-                       print  "\t\t(NCURSES_CONST char *)0," > "strfnames"
-                       print  "};" > "strfnames"
-                       print  "" > "strfnames"
-                       print  "\t\t(NCURSES_CONST char *)0," > "strcodes"
-                       print  "};"                             > "strcodes"
-                       print  ""                               > "strcodes"
-                       print  "#if BROKEN_LINKER"              > "nameftr"
-                       print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API _nc_##it(void) { return data##it; }" > "nameftr"
-                       print  "FIX(boolnames)"                 > "nameftr"
-                       print  "FIX(boolfnames)"                > "nameftr"
-                       print  "FIX(numnames)"                  > "nameftr"
-                       print  "FIX(numfnames)"                 > "nameftr"
-                       print  "FIX(strnames)"                  > "nameftr"
-                       print  "FIX(strfnames)"                 > "nameftr"
-                       print  "#endif /* BROKEN_LINKER */"     > "nameftr"
-                       print  ""                               > "codeftr"
-                       print  "#if BROKEN_LINKER"              > "codeftr"
-                       print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API _nc_##it(void) { return data##it; }" > "codeftr"
-                       print  "FIX(boolcodes)"                 > "codeftr"
-                       print  "FIX(numcodes)"                  > "codeftr"
-                       print  "FIX(strcodes)"                  > "codeftr"
-                       print  "#endif /* BROKEN_LINKER */"     > "codeftr"
+END    {
+               print  ""
+               print  "#if BROKEN_LINKER || USE_REENTRANT"
+               print  ""
+               if (bigstrings) {
+                       printf "static const char _nc_name_blob[] = \n"
+                       printf "%s;\n", bigstr;
+                       print_offsets("boolfnames", large_boolfnames);
+                       print_offsets("boolnames", large_boolnames);
+                       print_offsets("numfnames", large_numfnames);
+                       print_offsets("numnames", large_numnames);
+                       print_offsets("strfnames", large_strfnames);
+                       print_offsets("strnames", large_strnames);
+                       print  ""
+                       print  "static IT *"
+                       print  "alloc_array(NCURSES_CONST char ***value, const short *offsets, unsigned size)"
+                       print  "{"
+                       print  "        if (*value == 0) {"
+                       print  "                if ((*value = typeCalloc(NCURSES_CONST char *, size + 1)) != 0) {"
+                       print  "                        unsigned n;"
+                       print  "                        for (n = 0; n < size; ++n) {"
+                       print  "                                (*value)[n] = (NCURSES_CONST char *) _nc_name_blob + offsets[n];"
+                       print  "                        }"
+                       print  "                }"
+                       print  "        }"
+                       print  "        return *value;"
+                       print  "}"
+                       print  ""
+                       print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return alloc_array(&ptr_##it, _nc_offset_##it, SIZEOF(_nc_offset_##it)); }"
+               } else {
+                       print  "#define DCL(it) static IT data##it[]"
+                       print  ""
+                       print_strings("boolnames", small_boolnames);
+                       print_strings("boolfnames", small_boolfnames);
+                       print_strings("numnames", small_numnames);
+                       print_strings("numfnames", small_numfnames);
+                       print_strings("strnames", small_strnames);
+                       print_strings("strfnames", small_strfnames);
+                       print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return data##it; }"
+               }
+               print  ""
+               print  "/* remove public definition which conflicts with FIX() */"
+               print  "#undef boolnames"
+               print  "#undef boolfnames"
+               print  "#undef numnames"
+               print  "#undef numfnames"
+               print  "#undef strnames"
+               print  "#undef strfnames"
+               print  ""
+               print  "/* add local definition */"
+               print  "FIX(boolnames)"
+               print  "FIX(boolfnames)"
+               print  "FIX(numnames)"
+               print  "FIX(numfnames)"
+               print  "FIX(strnames)"
+               print  "FIX(strfnames)"
+               print  ""
+               print  "/* restore the public definition */"
+               print  "#define boolnames  NCURSES_PUBLIC_VAR(boolnames())"
+               print  "#define boolfnames NCURSES_PUBLIC_VAR(boolfnames())"
+               print  "#define numnames   NCURSES_PUBLIC_VAR(numnames())"
+               print  "#define numfnames  NCURSES_PUBLIC_VAR(numfnames())"
+               print  "#define strnames   NCURSES_PUBLIC_VAR(strnames())"
+               print  "#define strfnames  NCURSES_PUBLIC_VAR(strfnames())"
+               print  ""
+               print  "#define FREE_FIX(it) if (ptr_##it) { FreeAndNull(ptr_##it); }"
+               print  ""
+               print  "#if NO_LEAKS"
+               print  "NCURSES_EXPORT(void)"
+               print  "_nc_names_leaks(void)"
+               print  "{"
+               if (bigstrings) {
+               print  "FREE_FIX(boolnames)"
+               print  "FREE_FIX(boolfnames)"
+               print  "FREE_FIX(numnames)"
+               print  "FREE_FIX(numfnames)"
+               print  "FREE_FIX(strnames)"
+               print  "FREE_FIX(strfnames)"
                }
+               print  "}"
+               print  "#endif"
+               print  ""
+               print  "#else"
+               print  ""
+               print  "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]"
+               print  ""
+               print_strings("boolnames", small_boolnames);
+               print_strings("boolfnames", small_boolfnames);
+               print_strings("numnames", small_numnames);
+               print_strings("numfnames", small_numfnames);
+               print_strings("strnames", small_strnames);
+               print_strings("strfnames", small_strfnames);
+               print  ""
+               print  "#endif /* BROKEN_LINKER */"
+       }