1 /****************************************************************************
2 * Copyright
(c
) 1998,2006 Free Software Foundation
, Inc.
*
4 * Permission is hereby granted
, free of charge
, to any person obtaining a
*
5 * copy of this software and associated documentation
files (the
*
6 * "Software"), to deal in the Software without restriction
, including
*
7 * without limitation the rights to
use, copy, modify
, merge
, publish
, *
8 * distribute
, distribute with modifications
, sublicense
, and
/or sell
*
9 * copies of the Software
, and to permit persons to whom the Software is
*
10 * furnished to
do so
, subject to the following conditions
: *
12 * The above copyright notice and this permission notice shall be included
*
13 * in all copies or substantial portions of the Software.
*
15 * THE SOFTWARE IS PROVIDED
"AS IS", WITHOUT WARRANTY OF ANY KIND
, EXPRESS
*
16 * OR IMPLIED
, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF
*
17 * MERCHANTABILITY
, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
*
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM
, *
19 * DAMAGES OR OTHER LIABILITY
, WHETHER IN AN ACTION OF CONTRACT
, TORT OR
*
20 * OTHERWISE
, ARISING FROM
, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
*
21 * THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
*
23 * Except as contained in this notice
, the name
(s
) of the above copyright
*
24 * holders shall
not be used in advertising or otherwise to promote the
*
25 * sale
, use or other dealings in this Software without prior written
*
27 ****************************************************************************/
30 * $Id
: makedef.
cmd,v
1.5 2006/04/22 23:14:50 tom Exp $
32 * Author
: Juan Jose Garcia Ripoll
<worm@arrakis.es
>.
33 * Webpage
: http
://www.arrakis.es
/~worm
/
35 * makedef.
cmd - update a DLL export list using a newly created library file
36 * in a.out
format, plus an old .DEF file.
38 * standard output gets a sorted list with all entrypoints with entrycodes.
39 * This list
, plus a few .def sentences
(LIBRARY
, DESCRIPTION and EXPORT
)
40 * is used to build a new .def file.
42 * `_nc_
*' symbols are ignored.
44 * returns 1 when the old def_file is corrupted -- that is, export items are
45 * not properly formatted.
47 * returns 0 if everything went OK.
50 parse arg lib_file def_file
52 lib_file = translate(lib_file,'\','/')
53 def_file
= translate
(def_file
,'\','/')
58 * `codes' is the stem that links a code to every symbol
59 * `names
' is the stem where symbols are stored sequentially
60 * `last' is the index of the last symbol defined
70 * This sed expression cleans empty lines
, comments and special .DEF
71 * commands
, such as LIBRARY...
, EXPORTS...
, etc
73 tidy_up
= '"/^[A-Z]/d;s/[ ][ ]*/ /g;s/;.*$//g;s/^[ ]*//g;/^[ ]*$/d"'
76 * First we
find all public symbols
(functions and variables
). Next we
77 * concatenate this list with the old one
, sorting it and wiping out
78 * all unused data
(comments
, DLL directives
, blanks
, etc
). All this
79 * information is pushed into a REXX private list with the RXQUEUE
83 'emxexp -u' lib_file
'>' tmp_name
84 'cat' tmp_name def_file
'| sed' tidy_up
'| sort > foo2.tmp'
85 'type foo2.tmp | rxqueue'
86 'del' tmp_name
'1>NUL'
89 * This loop runs over the queue items
93 * We retrieve the symbol name
(NEW_NAME
) and its number
(NEW_NUMBER
)
94 * When the line comes from `emximp
's output, there's no number
, so
95 * we
assign it the special value
0.
97 parse pull new_symbol
'@'new_code rest
98 if Left
(new_symbol
,1) = '"' then
99 parse var new_symbol
'"' new_name
'"' rest
102 echo 'Symbol 'new_symbol
' was not quoted'
103 new_name
= new_symbol
106 if new_code
= '' then
109 * Here
, one would place all smart checks that would kill unused symbols.
110 * However
, export tables are
not that big
, so why bothering?
111 if Left
(new_name
,4) = '_nc_' then
116 * IF (this is the
2nd
time the symbol appears
) THEN
117 * (this symbol comes from a .DEF file
)
118 * it has a valid code that we store
119 * we mark that code as used
120 * ELIF
(it has no number
) THEN
121 * (it
's a new symbol)
122 * we increase the counter of defined symbols
123 * we assign it the special number 0
124 * (later on it'll be assigned an unused export code
)
126 * this symbol was in the old DLL and it
's no longer
127 * here, so we skip it.
130 when new_name = '' then
131 'echo Warning
: empty symbol found
1>&2'
132 when names.last = new_name then
134 codes.last = new_code
137 when new_code = 0 then
140 names.last = new_name
144 'echo Warning
: symbol
"'new_name'" has disappeared
1>&2'
146 end /* do while queued() */
149 * Finally we scan the stem, writing out all symbols with export codes.
150 * Those that did not have a valid one (just 0) are assigned a new one.
155 if codes.inx = 0 then
157 do while used.new_code \= 0
158 new_code = new_code + 1
163 say ' "'names.inx'" @
'codes.inx' NONAME
'
170 * Cleans the REXX queue by pulling and forgetting every line.
171 * This is needed, at least, when `makedef.cmd' starts
, because an aborted
172 * REXX program might have left some rubbish in.
174 CleanQueue
: procedure
175 do while queued
() > 0