2 * $Id
: makedef.
cmd,v
1.4 1998/11/22 03:14:08 tom Exp $
4 * Author
: Juan Jose Garcia Ripoll
<worm@arrakis.es
>.
5 * Webpage
: http
://www.arrakis.es
/~worm
/
7 * makedef.
cmd - update a DLL export list using a newly created library file
8 * in a.out
format, plus an old .DEF file.
10 * standard output gets a sorted list with all entrypoints with entrycodes.
11 * This list
, plus a few .def sentences
(LIBRARY
, DESCRIPTION and EXPORT
)
12 * is used to build a new .def file.
14 * `_nc_
*' symbols are ignored.
16 * returns 1 when the old def_file is corrupted -- that is, export items are
17 * not properly formatted.
19 * returns 0 if everything went OK.
22 parse arg lib_file def_file
24 lib_file = translate(lib_file,'\','/')
25 def_file
= translate
(def_file
,'\','/')
30 * `codes' is the stem that links a code to every symbol
31 * `names
' is the stem where symbols are stored sequentially
32 * `last' is the index of the last symbol defined
42 * This sed expression cleans empty lines
, comments and special .DEF
43 * commands
, such as LIBRARY...
, EXPORTS...
, etc
45 tidy_up
= '"/^[A-Z]/d;s/[ ][ ]*/ /g;s/;.*$//g;s/^[ ]*//g;/^[ ]*$/d"'
48 * First we
find all public symbols
(functions and variables
). Next we
49 * concatenate this list with the old one
, sorting it and wiping out
50 * all unused data
(comments
, DLL directives
, blanks
, etc
). All this
51 * information is pushed into a REXX private list with the RXQUEUE
55 'emxexp -u' lib_file
'>' tmp_name
56 'cat' tmp_name def_file
'| sed' tidy_up
'| sort > foo2.tmp'
57 'type foo2.tmp | rxqueue'
58 'del' tmp_name
'1>NUL'
61 * This loop runs over the queue items
65 * We retrieve the symbol name
(NEW_NAME
) and its number
(NEW_NUMBER
)
66 * When the line comes from `emximp
's output, there's no number
, so
67 * we
assign it the special value
0.
69 parse pull new_symbol
'@'new_code rest
70 if Left
(new_symbol
,1) = '"' then
71 parse var new_symbol
'"' new_name
'"' rest
74 echo 'Symbol 'new_symbol
' was not quoted'
81 * Here
, one would place all smart checks that would kill unused symbols.
82 * However
, export tables are
not that big
, so why bothering?
83 if Left
(new_name
,4) = '_nc_' then
88 * IF (this is the
2nd
time the symbol appears
) THEN
89 * (this symbol comes from a .DEF file
)
90 * it has a valid code that we store
91 * we mark that code as used
92 * ELIF
(it has no number
) THEN
94 * we increase the counter of defined symbols
95 * we assign it the special number 0
96 * (later on it'll be assigned an unused export code
)
98 * this symbol was in the old DLL and it
's no longer
99 * here, so we skip it.
102 when new_name = '' then
103 'echo Warning
: empty symbol found
1>&2'
104 when names.last = new_name then
106 codes.last = new_code
109 when new_code = 0 then
112 names.last = new_name
116 'echo Warning
: symbol
"'new_name'" has disappeared
1>&2'
118 end /* do while queued() */
121 * Finally we scan the stem, writing out all symbols with export codes.
122 * Those that did not have a valid one (just 0) are assigned a new one.
127 if codes.inx = 0 then
129 do while used.new_code \= 0
130 new_code = new_code + 1
135 say ' "'names.inx'" @
'codes.inx' NONAME
'
142 * Cleans the REXX queue by pulling and forgetting every line.
143 * This is needed, at least, when `makedef.cmd' starts
, because an aborted
144 * REXX program might have left some rubbish in.
146 CleanQueue
: procedure
147 do while queued
() > 0