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