1174993Srafan############################################################################## 2184989Srafan# Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. # 3174993Srafan# # 4174993Srafan# Permission is hereby granted, free of charge, to any person obtaining a # 5174993Srafan# copy of this software and associated documentation files (the "Software"), # 6174993Srafan# to deal in the Software without restriction, including without limitation # 7174993Srafan# the rights to use, copy, modify, merge, publish, distribute, distribute # 8174993Srafan# with modifications, sublicense, and/or sell copies of the Software, and to # 9174993Srafan# permit persons to whom the Software is furnished to do so, subject to the # 10174993Srafan# following conditions: # 11174993Srafan# # 12174993Srafan# The above copyright notice and this permission notice shall be included in # 13174993Srafan# all copies or substantial portions of the Software. # 14174993Srafan# # 15174993Srafan# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # 16174993Srafan# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # 17174993Srafan# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # 18174993Srafan# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # 19174993Srafan# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # 20174993Srafan# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # 21174993Srafan# DEALINGS IN THE SOFTWARE. # 22174993Srafan# # 23174993Srafan# Except as contained in this notice, the name(s) of the above copyright # 24174993Srafan# holders shall not be used in advertising or otherwise to promote the sale, # 25174993Srafan# use or other dealings in this Software without prior written # 26174993Srafan# authorization. # 27174993Srafan############################################################################## 28184989Srafan# $Id: MKcodes.awk,v 1.5 2008/06/28 23:13:25 tom Exp $ 29174993Srafanfunction large_item(value) { 30174993Srafan result = sprintf("%d,", offset); 31174993Srafan offset = offset + length(value) + 1; 32174993Srafan offcol = offcol + length(result) + 2; 33174993Srafan if (offcol > 70) { 34174993Srafan result = result "\n"; 35174993Srafan offcol = 0; 36174993Srafan } else { 37174993Srafan result = result " "; 38174993Srafan } 39174993Srafan bigstr = bigstr sprintf("\"%s\\0\" ", value); 40174993Srafan bigcol = bigcol + length(value) + 5; 41174993Srafan if (bigcol > 70) { 42174993Srafan bigstr = bigstr "\\\n"; 43174993Srafan bigcol = 0; 44174993Srafan } 45174993Srafan return result; 46174993Srafan} 47174993Srafan 48174993Srafanfunction small_item(value) { 49174993Srafan return sprintf("\t\t\"%s\",\n", value); 50174993Srafan} 51174993Srafan 52174993Srafanfunction print_strings(name,value) { 53174993Srafan printf "DCL(%s) = {\n", name 54174993Srafan print value 55174993Srafan print "\t\t(NCURSES_CONST char *)0," 56174993Srafan print "};" 57174993Srafan print "" 58174993Srafan} 59174993Srafan 60174993Srafanfunction print_offsets(name,value) { 61174993Srafan printf "static const short _nc_offset_%s[] = {\n", name 62174993Srafan printf "%s", value 63174993Srafan print "};" 64174993Srafan print "" 65174993Srafan printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name 66174993Srafan print "" 67174993Srafan} 68174993Srafan 69174993SrafanBEGIN { 70174993Srafan print "/* This file was generated by MKcodes.awk */" 71174993Srafan print "" 72174993Srafan print "#include <curses.priv.h>" 73174993Srafan print "" 74174993Srafan print "#define IT NCURSES_CONST char * const" 75174993Srafan print "" 76174993Srafan offset = 0; 77174993Srafan offcol = 0; 78174993Srafan bigcol = 0; 79174993Srafan } 80174993Srafan 81174993Srafan$1 ~ /^#/ {next;} 82174993Srafan 83174993Srafan$1 == "SKIPWARN" {next;} 84174993Srafan 85174993Srafan$3 == "bool" { 86174993Srafan small_boolcodes = small_boolcodes small_item($4); 87174993Srafan large_boolcodes = large_boolcodes large_item($4); 88174993Srafan } 89174993Srafan 90174993Srafan$3 == "num" { 91174993Srafan small_numcodes = small_numcodes small_item($4); 92174993Srafan large_numcodes = large_numcodes large_item($4); 93174993Srafan } 94174993Srafan 95174993Srafan$3 == "str" { 96174993Srafan small_strcodes = small_strcodes small_item($4); 97174993Srafan large_strcodes = large_strcodes large_item($4); 98174993Srafan } 99174993Srafan 100174993SrafanEND { 101174993Srafan print "" 102174993Srafan print "#if BROKEN_LINKER || USE_REENTRANT" 103174993Srafan print "" 104174993Srafan print "#include <term.h>" 105174993Srafan print "" 106174993Srafan if (bigstrings) { 107174993Srafan printf "static const char _nc_code_blob[] = \n" 108174993Srafan printf "%s;\n", bigstr; 109174993Srafan print_offsets("boolcodes", large_boolcodes); 110174993Srafan print_offsets("numcodes", large_numcodes); 111174993Srafan print_offsets("strcodes", large_strcodes); 112174993Srafan print "" 113174993Srafan print "static IT *" 114174993Srafan print "alloc_array(NCURSES_CONST char ***value, const short *offsets, unsigned size)" 115174993Srafan print "{" 116174993Srafan print " if (*value == 0) {" 117174993Srafan print " if ((*value = typeCalloc(NCURSES_CONST char *, size + 1)) != 0) {" 118174993Srafan print " unsigned n;" 119174993Srafan print " for (n = 0; n < size; ++n) {" 120174993Srafan print " (*value)[n] = _nc_code_blob + offsets[n];" 121174993Srafan print " }" 122174993Srafan print " }" 123174993Srafan print " }" 124174993Srafan print " return *value;" 125174993Srafan print "}" 126174993Srafan print "" 127174993Srafan print "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API _nc_##it(void) { return alloc_array(&ptr_##it, _nc_offset_##it, SIZEOF(_nc_offset_##it)); }" 128174993Srafan } else { 129174993Srafan print "#define DCL(it) static IT data##it[]" 130174993Srafan print "" 131174993Srafan print_strings("boolcodes", small_boolcodes); 132174993Srafan print_strings("numcodes", small_numcodes); 133174993Srafan print_strings("strcodes", small_strcodes); 134174993Srafan print "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API _nc_##it(void) { return data##it; }" 135174993Srafan } 136174993Srafan print "" 137174993Srafan print "FIX(boolcodes)" 138174993Srafan print "FIX(numcodes)" 139174993Srafan print "FIX(strcodes)" 140174993Srafan print "" 141174993Srafan print "#define FREE_FIX(it) if (ptr_##it) { FreeAndNull(ptr_##it); }" 142174993Srafan print "" 143184989Srafan print "#if NO_LEAKS" 144174993Srafan print "NCURSES_EXPORT(void)" 145174993Srafan print "_nc_codes_leaks(void)" 146174993Srafan print "{" 147174993Srafan if (bigstrings) { 148174993Srafan print "FREE_FIX(boolcodes)" 149174993Srafan print "FREE_FIX(numcodes)" 150174993Srafan print "FREE_FIX(strcodes)" 151174993Srafan } 152174993Srafan print "}" 153184989Srafan print "#endif" 154184989Srafan print "" 155174993Srafan print "#else" 156174993Srafan print "" 157174993Srafan print "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]" 158174993Srafan print "" 159174993Srafan print_strings("boolcodes", small_boolcodes); 160174993Srafan print_strings("numcodes", small_numcodes); 161174993Srafan print_strings("strcodes", small_strcodes); 162174993Srafan print "" 163174993Srafan print "#endif /* BROKEN_LINKER */" 164174993Srafan } 165