15ca44d1cSRong-En Fan############################################################################## 25ca44d1cSRong-En Fan# Copyright 2019,2020 Thomas E. Dickey # 35ca44d1cSRong-En Fan# Copyright 2007-2009,2010 Free Software Foundation, Inc. # 45ca44d1cSRong-En Fan# # 55ca44d1cSRong-En Fan# Permission is hereby granted, free of charge, to any person obtaining a # 65ca44d1cSRong-En Fan# copy of this software and associated documentation files (the "Software"), # 75ca44d1cSRong-En Fan# to deal in the Software without restriction, including without limitation # 85ca44d1cSRong-En Fan# the rights to use, copy, modify, merge, publish, distribute, distribute # 95ca44d1cSRong-En Fan# with modifications, sublicense, and/or sell copies of the Software, and to # 105ca44d1cSRong-En Fan# permit persons to whom the Software is furnished to do so, subject to the # 115ca44d1cSRong-En Fan# following conditions: # 125ca44d1cSRong-En Fan# # 135ca44d1cSRong-En Fan# The above copyright notice and this permission notice shall be included in # 145ca44d1cSRong-En Fan# all copies or substantial portions of the Software. # 155ca44d1cSRong-En Fan# # 165ca44d1cSRong-En Fan# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # 175ca44d1cSRong-En Fan# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # 185ca44d1cSRong-En Fan# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # 195ca44d1cSRong-En Fan# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # 205ca44d1cSRong-En Fan# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # 215ca44d1cSRong-En Fan# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # 225ca44d1cSRong-En Fan# DEALINGS IN THE SOFTWARE. # 235ca44d1cSRong-En Fan# # 245ca44d1cSRong-En Fan# Except as contained in this notice, the name(s) of the above copyright # 255ca44d1cSRong-En Fan# holders shall not be used in advertising or otherwise to promote the sale, # 265ca44d1cSRong-En Fan# use or other dealings in this Software without prior written # 275ca44d1cSRong-En Fan# authorization. # 285ca44d1cSRong-En Fan############################################################################## 295ca44d1cSRong-En Fan# $Id: MKcodes.awk,v 1.11 2020/02/02 23:34:34 tom Exp $ 305ca44d1cSRong-En Fanfunction large_item(value) { 315ca44d1cSRong-En Fan result = sprintf("%d,", offset); 325ca44d1cSRong-En Fan offset = offset + length(value) + 1; 335ca44d1cSRong-En Fan offcol = offcol + length(result) + 2; 345ca44d1cSRong-En Fan if (offcol > 70) { 355ca44d1cSRong-En Fan result = result "\n"; 365ca44d1cSRong-En Fan offcol = 0; 375ca44d1cSRong-En Fan } else { 385ca44d1cSRong-En Fan result = result " "; 395ca44d1cSRong-En Fan } 405ca44d1cSRong-En Fan bigstr = bigstr sprintf("\"%s\\0\" ", value); 415ca44d1cSRong-En Fan bigcol = bigcol + length(value) + 5; 425ca44d1cSRong-En Fan if (bigcol > 70) { 435ca44d1cSRong-En Fan bigstr = bigstr "\\\n"; 445ca44d1cSRong-En Fan bigcol = 0; 455ca44d1cSRong-En Fan } 465ca44d1cSRong-En Fan return result; 475ca44d1cSRong-En Fan} 485ca44d1cSRong-En Fan 495ca44d1cSRong-En Fanfunction small_item(value) { 505ca44d1cSRong-En Fan return sprintf("\t\t\"%s\",\n", value); 515ca44d1cSRong-En Fan} 525ca44d1cSRong-En Fan 535ca44d1cSRong-En Fanfunction print_strings(name,value) { 545ca44d1cSRong-En Fan printf "DCL(%s) = {\n", name 555ca44d1cSRong-En Fan print value 565ca44d1cSRong-En Fan print "\t\t(NCURSES_CONST char *)0," 575ca44d1cSRong-En Fan print "};" 585ca44d1cSRong-En Fan print "" 595ca44d1cSRong-En Fan} 605ca44d1cSRong-En Fan 615ca44d1cSRong-En Fanfunction print_offsets(name,value) { 625ca44d1cSRong-En Fan printf "static const short _nc_offset_%s[] = {\n", name 635ca44d1cSRong-En Fan printf "%s", value 645ca44d1cSRong-En Fan print "};" 655ca44d1cSRong-En Fan print "" 665ca44d1cSRong-En Fan printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name 675ca44d1cSRong-En Fan print "" 685ca44d1cSRong-En Fan} 695ca44d1cSRong-En Fan 705ca44d1cSRong-En FanBEGIN { 715ca44d1cSRong-En Fan print "/* This file was generated by MKcodes.awk */" 725ca44d1cSRong-En Fan print "" 735ca44d1cSRong-En Fan print "#include <curses.priv.h>" 745ca44d1cSRong-En Fan print "" 755ca44d1cSRong-En Fan print "#define IT NCURSES_CONST char * const" 765ca44d1cSRong-En Fan print "" 775ca44d1cSRong-En Fan offset = 0; 785ca44d1cSRong-En Fan offcol = 0; 795ca44d1cSRong-En Fan bigcol = 0; 805ca44d1cSRong-En Fan } 815ca44d1cSRong-En Fan 825ca44d1cSRong-En Fan$1 ~ /^#/ {next;} 835ca44d1cSRong-En Fan$1 ~ /^(cap|info)alias/ {next;} 845ca44d1cSRong-En Fan 855ca44d1cSRong-En Fan$1 == "userdef" {next;} 865ca44d1cSRong-En Fan$1 == "SKIPWARN" {next;} 875ca44d1cSRong-En Fan 885ca44d1cSRong-En Fan$3 == "bool" { 895ca44d1cSRong-En Fan small_boolcodes = small_boolcodes small_item($4); 905ca44d1cSRong-En Fan large_boolcodes = large_boolcodes large_item($4); 915ca44d1cSRong-En Fan } 925ca44d1cSRong-En Fan 935ca44d1cSRong-En Fan$3 == "num" { 945ca44d1cSRong-En Fan small_numcodes = small_numcodes small_item($4); 955ca44d1cSRong-En Fan large_numcodes = large_numcodes large_item($4); 965ca44d1cSRong-En Fan } 975ca44d1cSRong-En Fan 985ca44d1cSRong-En Fan$3 == "str" { 995ca44d1cSRong-En Fan small_strcodes = small_strcodes small_item($4); 1005ca44d1cSRong-En Fan large_strcodes = large_strcodes large_item($4); 1015ca44d1cSRong-En Fan } 1025ca44d1cSRong-En Fan 1035ca44d1cSRong-En FanEND { 1045ca44d1cSRong-En Fan print "" 1055ca44d1cSRong-En Fan print "#if BROKEN_LINKER || USE_REENTRANT" 1065ca44d1cSRong-En Fan print "" 1075ca44d1cSRong-En Fan if (bigstrings) { 1085ca44d1cSRong-En Fan printf "static const char _nc_code_blob[] = \n" 1095ca44d1cSRong-En Fan printf "%s;\n", bigstr; 1105ca44d1cSRong-En Fan print_offsets("boolcodes", large_boolcodes); 1115ca44d1cSRong-En Fan print_offsets("numcodes", large_numcodes); 1125ca44d1cSRong-En Fan print_offsets("strcodes", large_strcodes); 1135ca44d1cSRong-En Fan print "" 1145ca44d1cSRong-En Fan print "static IT *" 1155ca44d1cSRong-En Fan print "alloc_array(NCURSES_CONST char ***value, const short *offsets, unsigned size)" 1165ca44d1cSRong-En Fan print "{" 1175ca44d1cSRong-En Fan print " if (*value == 0) {" 1185ca44d1cSRong-En Fan print " if ((*value = typeCalloc(NCURSES_CONST char *, size + 1)) != 0) {" 1195ca44d1cSRong-En Fan print " unsigned n;" 1205ca44d1cSRong-En Fan print " for (n = 0; n < size; ++n) {" 1215ca44d1cSRong-En Fan print " (*value)[n] = (NCURSES_CONST char *) _nc_code_blob + offsets[n];" 1225ca44d1cSRong-En Fan print " }" 1235ca44d1cSRong-En Fan print " }" 1245ca44d1cSRong-En Fan print " }" 1255ca44d1cSRong-En Fan print " return *value;" 1265ca44d1cSRong-En Fan print "}" 1275ca44d1cSRong-En Fan print "" 1285ca44d1cSRong-En Fan 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)); }" 1295ca44d1cSRong-En Fan } else { 1305ca44d1cSRong-En Fan print "#define DCL(it) static IT data##it[]" 1315ca44d1cSRong-En Fan print "" 1325ca44d1cSRong-En Fan print_strings("boolcodes", small_boolcodes); 1335ca44d1cSRong-En Fan print_strings("numcodes", small_numcodes); 1345ca44d1cSRong-En Fan print_strings("strcodes", small_strcodes); 1355ca44d1cSRong-En Fan print "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return data##it; }" 1365ca44d1cSRong-En Fan } 1375ca44d1cSRong-En Fan print "" 1385ca44d1cSRong-En Fan print "/* remove public definition which conflicts with FIX() */" 1395ca44d1cSRong-En Fan print "#undef boolcodes" 1405ca44d1cSRong-En Fan print "#undef numcodes" 1415ca44d1cSRong-En Fan print "#undef strcodes" 1425ca44d1cSRong-En Fan print "" 1435ca44d1cSRong-En Fan print "/* add local definition */" 1445ca44d1cSRong-En Fan print "FIX(boolcodes)" 1455ca44d1cSRong-En Fan print "FIX(numcodes)" 1465ca44d1cSRong-En Fan print "FIX(strcodes)" 1475ca44d1cSRong-En Fan print "" 1485ca44d1cSRong-En Fan print "/* restore the public definition */" 1495ca44d1cSRong-En Fan print "" 1505ca44d1cSRong-En Fan print "#define FREE_FIX(it) if (ptr_##it) { FreeAndNull(ptr_##it); }" 1515ca44d1cSRong-En Fan print "#define boolcodes NCURSES_PUBLIC_VAR(boolcodes())" 1525ca44d1cSRong-En Fan print "#define numcodes NCURSES_PUBLIC_VAR(numcodes())" 1535ca44d1cSRong-En Fan print "#define strcodes NCURSES_PUBLIC_VAR(strcodes())" 1545ca44d1cSRong-En Fan print "" 1555ca44d1cSRong-En Fan print "#if NO_LEAKS" 1565ca44d1cSRong-En Fan print "NCURSES_EXPORT(void)" 1575ca44d1cSRong-En Fan print "_nc_codes_leaks(void)" 1585ca44d1cSRong-En Fan print "{" 1595ca44d1cSRong-En Fan if (bigstrings) { 1605ca44d1cSRong-En Fan print "FREE_FIX(boolcodes)" 1615ca44d1cSRong-En Fan print "FREE_FIX(numcodes)" 162 print "FREE_FIX(strcodes)" 163 } 164 print "}" 165 print "#endif" 166 print "" 167 print "#else" 168 print "" 169 print "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]" 170 print "" 171 print_strings("boolcodes", small_boolcodes); 172 print_strings("numcodes", small_numcodes); 173 print_strings("strcodes", small_strcodes); 174 print "" 175 print "#endif /* BROKEN_LINKER */" 176 } 177