1166124Srafan/****************************************************************************
2166124Srafan * Copyright (c) 1998,2006 Free Software Foundation, Inc.                   *
3166124Srafan *                                                                          *
4166124Srafan * Permission is hereby granted, free of charge, to any person obtaining a  *
5166124Srafan * copy of this software and associated documentation files (the            *
6166124Srafan * "Software"), to deal in the Software without restriction, including      *
7166124Srafan * without limitation the rights to use, copy, modify, merge, publish,      *
8166124Srafan * distribute, distribute with modifications, sublicense, and/or sell       *
9166124Srafan * copies of the Software, and to permit persons to whom the Software is    *
10166124Srafan * furnished to do so, subject to the following conditions:                 *
11166124Srafan *                                                                          *
12166124Srafan * The above copyright notice and this permission notice shall be included  *
13166124Srafan * in all copies or substantial portions of the Software.                   *
14166124Srafan *                                                                          *
15166124Srafan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16166124Srafan * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17166124Srafan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18166124Srafan * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19166124Srafan * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20166124Srafan * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21166124Srafan * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22166124Srafan *                                                                          *
23166124Srafan * Except as contained in this notice, the name(s) of the above copyright   *
24166124Srafan * holders shall not be used in advertising or otherwise to promote the     *
25166124Srafan * sale, use or other dealings in this Software without prior written       *
26166124Srafan * authorization.                                                           *
27166124Srafan ****************************************************************************/
28166124Srafan
2950276Speter/*
30166124Srafan * $Id: cmpdef.cmd,v 1.3 2006/04/22 23:14:50 tom Exp $
3150276Speter *
3250276Speter * Author:  Juan Jose Garcia Ripoll <worm@arrakis.es>.
3350276Speter * Webpage: http://www.arrakis.es/~worm/
3450276Speter *
3550276Speter * cmpdef.cmd - compares two .def files, checking whether they have
3650276Speter *		the same entries with the same export codes.
3750276Speter *
3850276Speter * returns 0 if there are no conflicts between the files -- that is,
3950276Speter * the newer one can replace the older one.
4050276Speter *
4150276Speter * returns 1 when either of the files is not properly formatted and
4250276Speter * when there are conflicts: two symbols having the same export code.
4350276Speter *
4450276Speter * the standard output shows a list with newly added symbols, plus
4550276Speter * replaced symbols and conflicts.
4650276Speter */
4750276Speterparse arg def_file1 def_file2
4850276Speter
4950276Speterdef_file1 = translate(def_file1,'\','/')
5050276Speterdef_file2 = translate(def_file2,'\','/')
5150276Speter
5250276Spetercall CleanQueue
5350276Speter
5450276Speter/*
5550276Speter * `cmp' is zero when the last file is valid and upward compatible
5650276Speter * `numbers' is the stem where symbols are stored
5750276Speter */
5850276Spetercmp      = 0
5950276Speternames.   = ''
6050276Speternumbers. = 0
6150276Speter
6250276Speter/*
6350276Speter * This sed expression cleans empty lines, comments and special .DEF
6450276Speter * commands, such as LIBRARY..., EXPORTS..., etc
6550276Speter */
6650276Spetertidy_up  = '"s/[ 	][ 	]*/ /g;s/;.*//g;/^[ ]*$/d;/^[a-zA-Z]/d;"'
6750276Speter
6850276Speter/*
6950276Speter * First we find all public symbols from the original DLL. All this
7050276Speter * information is pushed into a REXX private list with the RXQUEUE
7150276Speter * utility program.
7250276Speter */
7350276Speter'@echo off'
7450276Speter'type' def_file1 '| sed' tidy_up '| sort | rxqueue'
7550276Speter
7650276Speterdo while queued() > 0
7750276Speter   /*
7850276Speter    * We retrieve the symbol name (NAME) and its number (NUMBER)
7950276Speter    */
8050276Speter   parse pull '"' name '"' '@'number rest
8150276Speter   if number = '' || name = '' then
8250276Speter      do
8350276Speter      say 'Corrupted file' def_file1
8450276Speter      say 'Symbol' name 'has no number'
8550276Speter      exit 1
8650276Speter      end
8750276Speter   else
8850276Speter      do
8950276Speter      numbers.name = number
9050276Speter      names.number = name
9150276Speter      end
9250276Speterend
9350276Speter
9450276Speter/*
9550276Speter * Now we find all public symbols from the new DLL, and compare.
9650276Speter */
9750276Speter'type' def_file2 '| sed' tidy_up '| sort | rxqueue'
9850276Speter
9950276Speterdo while queued() > 0
10050276Speter   parse pull '"' name '"' '@'number rest
10150276Speter   if name = '' | number = '' then
10250276Speter      do
10350276Speter      say 'Corrupted file' def_file2
10450276Speter      say 'Symbol' name 'has no number'
10550276Speter      exit 1
10650276Speter      end
10750276Speter   if numbers.name = 0 then
10850276Speter      do
10950276Speter      cmp = 1
11050276Speter      if names.number = '' then
11150276Speter         say 'New symbol' name 'with code @'number
11250276Speter      else
11350276Speter         say 'Conflict old =' names.number ', new =' name 'at @'number
11450276Speter      end
11550276Speter   else if numbers.name \= number then
11650276Speter      do
11750276Speter      cmp = 1
11850276Speter      say name 'Symbol' name 'changed from @'numbers.name 'to @'number
11950276Speter      end
12050276Speterend /* do */
12150276Speter
12250276Speterexit cmp
12350276Speter
12450276Speter/*
12550276Speter * Cleans the REXX queue by pulling and forgetting every line.
12650276Speter * This is needed, at least, when `cmpdef.cmd' starts, because an aborted
12750276Speter * REXX program might have left some rubbish in.
12850276Speter */
12950276SpeterCleanQueue: procedure
13050276Speter   do while queued() > 0
13150276Speter      parse pull foo
13250276Speter   end
13350276Speterreturn
13450276Speter
135