diff options
Diffstat (limited to 'nx-X11/config/util/makedef.cmd')
-rw-r--r-- | nx-X11/config/util/makedef.cmd | 620 |
1 files changed, 620 insertions, 0 deletions
diff --git a/nx-X11/config/util/makedef.cmd b/nx-X11/config/util/makedef.cmd new file mode 100644 index 000000000..9d5d6decf --- /dev/null +++ b/nx-X11/config/util/makedef.cmd @@ -0,0 +1,620 @@ +/* This is OS/2 REXX */ +/* $XFree86: xc/config/util/makedef.cmd,v 1.4 2003/11/12 00:10:24 dawes Exp $ + * + * This file was taken from Odin32 project, modified to suit + * XFree86 4.x build process and then modified to suit + * the X.org monolithic build process for X11R6.7 + * + * Generate *os2.def linker definition files for OS/2 + */ + +if RxFuncQuery('SysLoadFuncs')=1 THEN +DO + call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'; + call SysLoadFuncs; +END + +/* + * Set default parameter values. + */ +sLibrary = ''; +sDBFile = ''; +sOrdinals = 0; +sASDFeatureId = ''; +sCountryCode = ''; +sDateTime = left(' 'date()' 'time(), 26); +sDescription = 'X.Org 6.9'; +sFixPakVer = ''; +sHostname = strip(substr(VALUE('HOSTNAME',,'OS2ENVIRONMENT'), 1, 11)); +sLanguageCode = ''; +sMiniVer = ''; +sVendor = 'X.Org'; +sVersion = '6.9'; + + +/* + * Parse parameters. + */ +parse arg sArgs +if (sArgs = '') then +do + call syntax; + exit(1); +end + +do while (sArgs <> '') + sArgs = strip(sArgs); + if (substr(sArgs, 1, 1) = '-' | substr(sArgs, 1, 1) = '/') then + do /* + * Option. + */ + ch = translate(substr(sArgs, 2, 1)); + if (pos(ch, 'ACDHLMNOPRTV') < 1) then + do + say 'invalid option:' substr(sArgs, 1, 2); + call syntax; + exit(2); + end + + /* get value and advance sArgs to next or to end. */ + if (substr(sArgs, 3, 1) = '"') then + do + iNext = pos('"', sArgs, 4); + fQuote = 1; + end + else + do + iNext = pos(' ', sArgs, 3); + if (iNext <= 0) then + iNext = length(sArgs); + fQuote = 0; + end + + if (iNext > 3 | ch = 'R') then + do + sValue = substr(sArgs, 3 + fQuote, iNext - 3 - fQuote); + sArgs = strip(substr(sArgs, iNext+1)); + /*say 'iNext:' iNext 'sValue:' sValue 'sArgs:' sArgs; */ + + /* check if we're gonna search for something in an file. */ + if (sValue <> '' & pos('#define=', sValue) > 0) then + sValue = LookupDefine(sValue); + end + else + do + say 'syntax error near' substr(sArgs, 1, 2)'.'; + call syntax; + exit(3); + end + + + /* set value */ + select + when (ch = 'A') then /* ASD Feature Id */ + sASDFeatureId = sValue; + + when (ch = 'C') then /* Country code */ + sCountryCode = sValue; + + when (ch = 'D') then /* Description */ + sDescription = sValue; + + when (ch = 'H') then /* Hostname */ + sHostname = sValue; + + when (ch = 'L') then /* Language code */ + sLanguageCode = sValue; + + when (ch = 'M') then /* MiniVer */ + sMiniVer = sValue; + + when (ch = 'N') then /* Vendor */ + sVendor = sValue; + + when (ch = 'O') then /* Ordinals */ + sOrdinals = 1; + + when (ch = 'R') then /* Vendor */ + sDescription = ReadDescription(sValue, sDefFile); + + when (ch = 'P') then /* Fixpak version */ + sFixPakVer = sValue; + + when (ch = 'T') then /* Date Time */ + sDateTime = sValue; + + when (ch = 'V') then /* Version */ + sVersion = sValue; + + /* Otherwise it's an illegal option */ + otherwise: + say 'invalid option:' substr(sArgs, 1, 2); + call syntax; + exit(2); + end /* select */ + end + else + do /* + * Table file name, typically xc/config/cf/os2def.db + */ + if (sLibrary <> '') then + do + say 'Syntax error: Can''t specify more than two files!'; + exit(4); + end + if (sDBFile = '') then + parse value sArgs with sDBFile' 'sArgs + else + parse value sArgs with sLibrary' 'sArgs + sArgs = strip(sArgs); + end +end + +/* check that a definition file was specified. */ +if (sLibrary = '') then +do + say 'Syntax error: Will have to specify a library stem.'; + call syntax; + exit(5); +end + + +/* + * Trim strings to correct lengths. + */ +sVendor = strip(substr(sVendor, 1, 31)); +if (substr(sDateTime, 1, 1) <> ' ') then + sDateTime = ' ' || sDateTime; +sDateTime = left(sDateTime, 26); +sHostname = strip(substr(sHostname, 1, 11)); +sMiniVer = strip(substr(sMiniVer, 1, 11)); +sDescription = strip(substr(sDescription, 1, 80)); +sCountryCode = strip(substr(sCountryCode, 1, 4)); +sLanguageCode = strip(substr(sLanguageCode, 1, 4)); +sASDFeatureId = strip(substr(sASDFeatureId, 1, 11)); +sFixPakVer = strip(substr(sFixPakVer, 1, 11)); + +/* load database file, only accept lines for the specified sLibrary */ +ordHash.0 = 0 +sRealName = '' +sInitTerm = 0 + +rc = LoadDBFile(sDBFile,sLibrary) + +/* engage gcc to parse the corresponding -def.cpp file */ +'@gcc -E -D__UNIXOS2__ 'sLibrary'-def.cpp >tmpos2.def' + +/* Signature */ +sEnhSign = '##1##' + +/* + * Build description string. + */ +sDescription = '@#'sVendor':'sVersion'#@'sEnhSign||, + sDateTime||sHostname||, + ':'sASDFeatureId':'sLanguageCode':'sCountryCode':'sMiniVer||, + '::'sFixPakVer'@@'sDescription; + +/* + * Update .def-file. + */ +rc = UpdateDefFile(sLibrary,sDescription,sRealName,sOrdinals,sInitTerm); +call SysFileDelete('tmpos2.def') + +exit(rc); + +LoadDBFile: procedure expose ordHash. sRealname sInitTerm + parse arg dbfile,libname; + + rc = stream(dbfile, 'c', 'open read'); + if (pos('READY', rc) <> 1) then + do + say 'error: failed to open 'dbfile; + exit(-1); + end + do while (lines(dbfile) > 0) + line = translate(strip(linein(dbfile)),' ',' '); + if pos(';',line) > 0 then iterate; + if pos('LIBRARY',line) > 0 then do + if word(line,2) = libname then do + sRealname = word(line,3) + if word(line,4) <> '' then + sInitTerm = 1 + end + iterate + end + if word(line,1) = libname then do + name = word(line,2) + ordHash.name = word(line,3) + end + end + rc = stream(dbfile,'c','close') + return rc + +/** + * Display script syntax. + */ +syntax: procedure + say 'Syntax: MakeDef.cmd [options] <dbfile> <libname> [options]' + say ' <dbfile> Ordinals database.' + say ' <libname> Library stem' + say 'Options:' + say ' -A<string> ASD Feature Id.' + say ' -C<string> Country code.' + say ' -D<string> Description.' + say ' -O<string> Ordinals definition file.' + say ' -R[deffile] Read description from .def file.' + say ' -H<string> Hostname.' + say ' -L<string> Language code.' + say ' -M<string> MiniVer.' + say ' -N<string> Vendor.' + say ' -P<string> Fixpak version.' + say ' -T<string> Date Time.' + say ' -V<string> Version.' + say '<string> could be a double quoted string or a single word.' + say ' You could also reference #defines in C/C++ include files.' + say ' The string should then have this form:' + say ' "#define=<DEFINE_NAME>,<includefile.h>"' + say ''; + + return; + + +/** + * Search for a #define in an C/C++ header or source file. + * + * @returns String containing the defined value + * found for the define in the header file. + * Quits on fatal errors. + * @param A string on the form: "#define=DEFINETOFIND,includefile.h" + * @remark Write only code... - let's hope it works. + */ +LookupDefine: procedure + parse arg '#'sDefine'='sMacro','sIncludeFile + + /* + * Validate parameters. + */ + sMacro = strip(sMacro); + sIncludeFile = strip(sIncludeFile); + if (sMacro = '') then + do + say 'syntax error: #define=<DEFINE_NAME>,<includefile.h>.'; + say ' <DEFINE_NAME> was empty.'; + exit(-20); + end + if (sIncludeFile = '') then + do + say 'syntax error: #define=<DEFINE_NAME>,<includefile.h>.'; + say ' <includefile.h> was empty.'; + exit(-20); + end + + + sIllegal = translate(translate(sMacro),, + '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!',, + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_'); + + if (strip(translate(sIllegal, ' ', '!')) <> '') then + do + say 'syntax error: #define=<DEFINE_NAME>,<includefile.h>.'; + say ' <DEFINE_NAME> contains illegal charater(s).' + say ' 'sMacro; + say ' 'translate(sIllegal, ' ', '!'); + exit(-20); + end + + /* + * Open include file. + */ + sRc = stream(sIncludeFile, 'c', 'open read'); + if (pos('READY', sRc) <> 1) then + do /* search INCLUDE variable */ + sFile = SysSearchPath('INCLUDE', sIncludeFile); + if (sFile = '') then + do + say 'Can''t find include file 'sIncludeFile'.'; + exit(-20); + end + sIncludeFile = sFile; + + sRc = stream(sIncludeFile, 'c', 'open read'); + if (pos('READY', sRc) <> 1) then + do + say 'Failed to open include file' sIncludeFile'.'; + exit(-20); + end + end + + /* + * Search the file line by line. + * We'll check for lines starting with a hash (#) char. + * Then check that the word after the hash is 'define'. + * Then match the next word with the macro name. + * Then then get the next rest of the line to comment or continuation char. + * (continuation is not supported) + * Finally strip quotes. + */ + sValue = ''; + do while (lines(sIncludeFile) > 0) + sLine = strip(linein(sIncludeFile)); + if (sLine = '') then + iterate; + if (substr(sLine, 1, 1) <> '#') then + iterate; + sLine = substr(sLine, 2); + if (word(sLine, 1) <> 'define') then + iterate; + sLine = strip(substr(sLine, wordpos(sLine, 1) + length('define')+1)); + if ( substr(sLine, 1, length(sMacro)) <> sMacro, + | substr(sLine, length(sMacro)+1, 1) <> ' ') then + iterate; + sLine = strip(substr(sLine, length(sMacro) + 1)); + if (sLine = '') then + do + say 'error: #define' sMacro' is empty.'; + call stream sIncludeFile, 'c', 'close'; + exit(-20); + end + + chQuote = substr(sLine, 1, 1); + if (chQuote = '"' | chQuote = "'") then + do /* quoted string */ + iLastQuote = 0; + do forever + iLast = pos(chQuote, sLine, 2); + if (iLast <= 0) then + leave; + if (substr(sLine, iLast, 1) = '\') then + iterate; + iLastQuote = iLast; + leave; + end + + if (iLastQuote <= 0) then + do + say 'C/C++ syntax error in 'sIncludefile': didn''t find end quote.'; + call stream sIncludeFile, 'c', 'close'; + exit(-20); + end + + call stream sIncludeFile, 'c', 'close'; + sValue = substr(sLine, 2, iLastQuote - 2); + say 'Found 'sMacro'='sValue; + return sValue; + end + else + do + iCommentCPP = pos('//',sLine); + iCommentC = pos('/*',sLine); + if (iCommentC > 0 & iCommentCPP > 0 & iCommentC > iCommentCPP) then + iComment = iCommentCPP; + else if (iCommentC > 0 & iCommentCPP > 0 & iCommentC < iCommentCPP) then + iComment = iCommentC; + else if (iCommentCPP > 0) then + iComment = iCommentCPP; + else if (iCommentC > 0) then + iComment = iCommentC; + else + iComment = 0; + + if (iComment > 0) then + sValue = strip(substr(sLine, 1, iComment-1)); + else + sValue = strip(sLine); + + if (sValue <> '') then + do + if (substr(sValue, length(sValue)) = '\') then + do + say 'Found continuation char: Multiline definitions are not supported!\n'; + call stream sIncludeFile, 'c', 'close'; + exit(-20); + end + end + + if (sValue = '') then + say 'warning: The #define has no value.'; + + call stream sIncludeFile, 'c', 'close'; + say 'Found 'sMacro'='sValue; + return sValue; + end + end + + call stream sIncludeFile, 'c', 'close'; + say 'error: didn''t find #define' sMacro'.'; + exit(-20); + + + +/** + * Reads the description line for a .def-file. + * @returns The Description string, with quotes removed. + * Empty string is acceptable. + * On error we'll terminate the script. + * @param sDefFile Filename of .def-file to read the description from. + * @param sDefFile2 Used if sDefFile is empty. + * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) + */ +ReadDescription: procedure; + parse arg sDefFile, sDefFile2 + + /* + * Validate parameters. + */ + if (sDefFile = '') then + sDefFile = sDefFile2; + if (sDefFile = '') then + do + say 'error: no definition file to get description from.' + exit(-1); + end + + /* + * Open file + */ + rc = stream(sDefFile, 'c', 'open read'); + if (pos('READY', rc) <> 1) then + do + say 'error: failed to open deffile file.'; + exit(-1); + end + + + /* + * Search for the 'DESCRIPTION' line. + */ + do while (lines(sDefFile) > 0) + sLine = strip(linein(sDefFile)); + if (sLine = '') then + iterate; + if (translate(word(sLine, 1)) <> 'DESCRIPTION') then + iterate; + sLine = strip(substr(sLine, wordpos(sLine, 1) + length('DESCRIPTION')+1)); + + ch = substr(sLine, 1, 1); + if (ch <> "'" & ch <> '"') then + do + say 'syntax error: description line in' sDefFile 'is misformed.'; + call stream sDefFile, 'c', 'close'; + exit(-10); + end + + iEnd = pos(ch, sLine, 2); + if (iEnd <= 0) then + do + say 'syntax error: description line in' sDefFile 'is misformed.'; + call stream sDefFile, 'c', 'close'; + exit(-10); + end + + call stream sDefFile, 'c', 'close'; + sValue = substr(sLine, 2, iEnd - 2); + say 'Found Description:' sValue; + return sValue; + end + + call stream sDefFile, 'c', 'close'; + say 'info: Didn''t find description line in' sDefFile'.'; + return ''; + +AddCodeDataSection: procedure + parse arg outfile; + call lineout outfile,"CODE PRELOAD"; + call lineout outfile,"DATA MULTIPLE NONSHARED"; + return ''; + +findOrdinal: procedure expose ordHash. + parse arg line,sOrdinal; + line = strip(line,,' '); + line = word(translate(strip(line),' ','='),1) + if (sOrdinal) then do + ordinal = ordHash.line; + if (ordinal = 'ORDHASH.'line) then do + say 'Oops: DB lacks ordinal for symbol "'line'" Create one!' + return ' 'line + end + else + return ' 'line' @ 'ordinal + end + else + return ' 'line +/** + * This is a function which reads sLibrary into an + * internal array and changes the DESCRIPTION text if found. + * If DESCRIPTION isn't found, it is added at the end. + * The array is written to sDBFile. + * @returns 0 on succes. + * Errorcode on error. + * @param sLibrary library stem + * @param sDescription New description string. + * @param sRealname real 8.3 name of library + * @param sOrdinals flag to denote generation of ordinals + * @param sInitTerm flag to denote adding INITINSTANCE/TERM... qualifiers + * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) + * @author heavily modified by Platon & Holger + */ +UpdateDefFile: procedure expose ordHash.; + parse arg sLibrary, sDescription, sRealname, sOrdinals, sInitTerm + + initterm = '' + if sInitTerm = 1 then initterm = 'INITINSTANCE TERMINSTANCE' + + /* Open input file. */ + infile = 'tmpos2.def' + rc = stream(infile, 'c', 'open read'); + if (pos('READY', rc) <> 1) then do + say 'error: failed to open' infile 'file.'; + return 110; + end + /* open output file. */ + if sOrdinals = 1 then + outfile = sLibrary'o_os2.def' + else + outfile = sLibrary'os2.def' + call SysFileDelete(outfile) + rc = stream(outfile, 'c', 'open write'); + if (pos('READY', rc) <> 1) then do + say 'error: failed to open outputfile' outfile 'file.'; + return 110; + end + call lineout outfile, '; Created by makedef.cmd on' date() time()'. Do not edit.', 1; + + /* + * Search for the specific lines. + */ + fDescription = 0; + fExports = 0; + fWinLib = 0; + do while (lines(infile) > 0) + line = strip(linein(infile)); + line = strip(line,,' '); + if line = '' then iterate; + if pos('#',line) = 1 then iterate; + if pos(';',line) = 1 then iterate; + if pos('/*',line) = 1 then iterate; + + firstsym = translate(word(line,1)) + if firstsym = 'LIBRARY' then do + call lineout outfile,'LIBRARY 'sRealName' 'initterm + iterate + end + if firstsym = 'VERSION' then do + call lineout outfile, 'DESCRIPTION "'sDescription sLibrary'"' + fDescription = 1; + AddCodeDataSection(outfile); + end + if (firstsym = 'EXPORTS') then do + call lineout outfile,'EXPORTS' + fExports = 1; + iterate; + end + if (fExports) then do + call lineout outfile, findOrdinal(line,sOrdinals); + iterate; + end + end + + /* + * Add description is none was found. + */ + if (\fDescription) then + do + call lineout outfile,"DESCRIPTION '"||sDescription sLibrary||"'"; + AddCodeDataSection(outfile); + end + + /* + * Close input file and open output file. + */ + call stream outfile, 'c', 'close'; + call stream infile, 'c', 'close'; + if sOrdinals = 1 then do + call SysFileDelete('dll.name'); + call stream 'dll.name', 'c', 'open write'; + call charout 'dll.name', sRealName".dll"; + call stream 'dll.name', 'c'. 'close'; + end + return 0; + |