home *** CD-ROM | disk | FTP | other *** search
- /* Undifference utility for Eclectus integration utilities.
- Copyright (C) 1992-1996 Eclectus (D. John Anderson, Alan B. Harper).
-
- This file is part of the Eclectus integration utilities.
-
- Eclectus integration utilities are free software; you can redistribute
- it and/or modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 1, or
- (at your option) any later version.
-
- Eclectus integration utilities is distributed in the hope that it
- will be useful, but WITHOUT ANY WARRANTY; without even the implied
- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with the Eclectus integration utilities; see the file COPYING.
- If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge,
- MA 02139, USA. */
-
- #include "diff.h"
- #include <stdlib.h>
- #include <string.h>
- #include <limits.h>
- #ifdef DF_MACHINE_MACINTOSH
- #include <CursorCtl.h>
- #endif
-
- static int lockCreatedFiles = FALSE;
- static const char *programNamePtr;
-
- static unsigned hashValue;
-
- void CommandLine (int argc, const char **argv,
- const char **oldPathNamePtrPtr,
- const char **pathScriptNamePtrPtr,
- const char **newPathNamePtrPtr);
- void CommandLineError (int errorMessage, const char *theString);
- int __cdecl main (int argc, const char **argv);
- void UnDiffPaths (const char *oldPathNamePtr, const char *pathScriptNamePtr, const char *newPathNamePtr);
- void AppendFileSuffixToPaths (char *oldPathNamePtr, char *newPathNamePtr, FILE *scriptFilePtr);
- void CopyLines (register FILE *oldFilePtr,
- register FILE *newFilePtr,
- register int lineCount,
- int excludeLastReturn);
- int ReadInt (register FILE *filePtr);
-
- void
- CommandLine (int argc, const char **argv,
- const char **oldPathNamePtrPtr,
- const char **pathScriptNamePtrPtr,
- const char **newPathNamePtrPtr)
- /*
- * Parses the command line. Fills out the data pointed to by oldPathNamePtrPtr,
- * pathScriptNamePtrPtr and newPathNamePtrPtr.
- */
- {
- char commandChar;
- register const char *commandStringPtr;
- int fileCount;
-
- fileCount = 0;
-
- programNamePtr = *argv++;
- argc--;
-
- /* Parse the commands and make sure they are legal */
-
- while (argc > 0) {
- commandStringPtr = *argv++;
- argc--;
- if (*commandStringPtr != '-') {
-
- switch (fileCount) {
- case (0):
- *oldPathNamePtrPtr = commandStringPtr;
- break;
- case (1):
- *pathScriptNamePtrPtr = commandStringPtr;
- break;
- case (2):
- *newPathNamePtrPtr = commandStringPtr;
- break;
- default:
- CommandLineError (THREE_UN_DIFFERENCE_FILES, NULL);
- break;
- }
- fileCount ++;
- } else {
- if (strlen (commandStringPtr) != 2)
- CommandLineError (UNEXPECTED_OPTION, commandStringPtr);
- commandChar = *(commandStringPtr + 1);
- switch (commandChar) {
- case ('l'):
- lockCreatedFiles = TRUE;
- break;
- #ifdef DF_DEBUG
- case ('X'):
- ECCheckFreedBlocks = 1;
- break;
- case ('x'):
- ECHeapCheckOn = 1;
- break;
- #endif
- default:
- CommandLineError (UNEXPECTED_OPTION, commandStringPtr);
- break;
- }
- }
- }
- if (fileCount != 3)
- CommandLineError (THREE_UN_DIFFERENCE_FILES, NULL);
- }
-
- void
- CommandLineError (int errorMessage, const char *theString)
- /*
- * Part of CommandLine.
- */
- {
- fprintf (stderr, "# - ");
- if (theString != NULL)
- fprintf (stderr, ECMessagessArray [errorMessage], theString);
- else
- fprintf (stderr, ECMessagessArray [errorMessage], "");
- fprintf (stderr, ".\n\n"
- "### UnDifference version %s\n"
- "#usage: %s [-l] SourcePath DifferenceScriptFile DestinationPath\n"
- " -l locks all files in the destination\n\n",
- VERSION_STRING,
- programNamePtr);
- exit (EXIT_FAILURE);
- }
-
- int
- __cdecl main (int argc, const char **argv)
- {
- #ifdef DF_DEBUG
- ECUns32 allocatedBytes;
- #endif
- const char *oldPathNamePtr;
- const char *newPathNamePtr;
- const char *pathScriptNamePtr;
-
- CommandLine (argc, argv, &oldPathNamePtr, &pathScriptNamePtr, &newPathNamePtr);
- UnDiffPaths (oldPathNamePtr, pathScriptNamePtr, newPathNamePtr);
-
- #ifdef DF_DEBUG
- allocatedBytes = ECDebugPrintMemoryUsage (stderr);
- if (allocatedBytes != 0) {
- fprintf (stderr, "\n\n"
- "MEMORY LEAK! MEMORY LEAK! MEMORY LEAK! MEMORY LEAK!\n"
- "MEMORY LEAK! MEMORY LEAK! MEMORY LEAK! MEMORY LEAK!\n"
- "MEMORY LEAK! MEMORY LEAK! MEMORY LEAK! MEMORY LEAK!\n"
- "MEMORY LEAK! MEMORY LEAK! MEMORY LEAK! MEMORY LEAK!\n"
- "MEMORY LEAK! MEMORY LEAK! MEMORY LEAK! MEMORY LEAK!\n"
- "\n\n");
- }
- #endif
- return (0);
- }
-
- void
- UnDiffPaths (const char *oldPathNamePtr, const char *pathScriptNamePtr, const char *newPathNamePtr)
- {
- static const char FirstCommandSet[] = {
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* nul..bel */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* bs..si */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* dle..etb */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* can..us */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* space..' */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* (../ */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* 0..7 */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* 8..? */
- FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* @..G */
- TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* H..O */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* P..W */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* X.._ */
- FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, /* `..g */
- TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* h..o */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* p..w */
- TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* x..DEL */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE /* Non ASCII */
- };
-
- static const char DoneWithFileSet[] = {
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* nul..bel */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* bs..si */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* dle..etb */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* can..us */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* space..' */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* (../ */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* 0..7 */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* 8..? */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* @..G */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* H..O */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* P..W */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* X.._ */
- FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, /* `..g */
- TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* h..o */
- FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, /* p..w */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* x..DEL */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE /* Non ASCII */
- };
-
- static const char FileOrDirectorySet[] = {
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* nul..bel */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* bs..si */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* dle..etb */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* can..us */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* space..' */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* (../ */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* 0..7 */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* 8..? */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* @..G */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* H..O */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* P..W */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* X.._ */
- FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, /* `..g */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* h..o */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* p..w */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* x..DEL */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE /* Non ASCII */
- };
-
- int binaryFile;
- int commandCharThatIsReallyAnInt;
- int fileAttributes;
- int firstPass;
- unsigned hashRead;
- register unsigned int hexCharThatIsReallyAnInt;
- register int highHexDigit;
- int ioResult;
- int lineCount;
- FILE *newFilePtr;
- char newPathName [FILENAME_MAX + 1];
- int numberRead;
- FILE *oldFilePtr;
- int oldFileType;
- int oldLineNumber;
- char oldPathName [FILENAME_MAX + 1];
- FILE *scriptFilePtr;
- int sourceLines;
- char startScriptBuffer [sizeof (DIFFERENCE_SCRIPT_START_STRING)];
- int charThatIsReallyAnUnsInt;
-
- binaryFile = FALSE;
- hashValue = 0;
- newFilePtr = NULL;
- oldFilePtr = NULL;
- firstPass = TRUE;
- oldLineNumber = 1;
- newPathName [0] = '\0';
- fileAttributes = 0;
- AppendStringToPathName (newPathName, newPathNamePtr);
- oldPathName [0] = '\0';
- AppendStringToPathName (oldPathName, oldPathNamePtr);
-
- if (FileType (oldPathNamePtr) == BAD_FILE_TYPE)
- ErrorWithStringArgument (CANT_OPEN_FILE, oldPathNamePtr);
-
- scriptFilePtr = fopen (pathScriptNamePtr, "r");
- if (scriptFilePtr == NULL)
- ErrorWithStringArgument (CANT_OPEN_FILE, pathScriptNamePtr);
-
- numberRead = fread (startScriptBuffer, sizeof (char), sizeof (startScriptBuffer) - 1, scriptFilePtr);
- if (numberRead != sizeof (startScriptBuffer) - 1 ||
- memcmp (startScriptBuffer, DIFFERENCE_SCRIPT_START_STRING, sizeof (startScriptBuffer) - 1) != 0)
- Error (BAD_SCRIPT_FORMAT);
-
- do {
- commandCharThatIsReallyAnInt = getc (scriptFilePtr);
- if (firstPass) {
- if (FirstCommandSet [commandCharThatIsReallyAnInt]) {
- if (FileOrDirectorySet [commandCharThatIsReallyAnInt]) {
- ioResult = MakeDirectory (newPathName);
- if (ioResult != 0)
- ErrorWithStringArgument (CANT_CREATE_DIRECTORY, newPathName);
- } else {
- oldFilePtr = fopen (oldPathName, "r");
- if (oldFilePtr == NULL)
- ErrorWithStringArgument (CANT_OPEN_FILE, oldPathName);
- oldFileType = FileType (oldPathName);
- binaryFile = oldFileType == BINARY_TYPE;
- newFilePtr = CreateTypedFile (newPathName, binaryFile);
- fileAttributes = RESOURCE_MASK;
- }
- firstPass = FALSE;
- }
- }
- if (newFilePtr != NULL && DoneWithFileSet [commandCharThatIsReallyAnInt]) {
- if (oldFilePtr != NULL) {
- if (oldLineNumber == 1)
- fileAttributes |= DATE_MASK;
- if (binaryFile) {
- goto BinaryCopy;
- do {
- hashValue = HASH (hashValue, charThatIsReallyAnUnsInt);
- putc (charThatIsReallyAnUnsInt, newFilePtr);
- BinaryCopy: charThatIsReallyAnUnsInt = (unsigned int) getc (oldFilePtr);
- } while (charThatIsReallyAnUnsInt != EOF);
- } else {
- CopyLines (oldFilePtr, newFilePtr, INT_MAX, /*exclude last return is */ FALSE);
- }
- if (fclose (oldFilePtr) != 0)
- Error (UNEXPECTED_IO_ERROR);
- oldFilePtr = NULL;
- }
- if (newFilePtr != NULL) {
- if (fclose (newFilePtr) != 0)
- Error (UNEXPECTED_IO_ERROR);
- newFilePtr = NULL;
- if (lockCreatedFiles)
- fileAttributes |= LOCK_MASK;
- CopyFileAttributes (oldPathName, newPathName, fileAttributes);
- RemoveNameSuffix (newPathName);
- RemoveNameSuffix (oldPathName);
- }
- oldLineNumber = 1;
- }
- switch (commandCharThatIsReallyAnInt) {
- case (EOF):
- goto ExitLoop;
- case ('#'): /* comment */
- do {
- charThatIsReallyAnUnsInt = (unsigned int) getc (scriptFilePtr);
- if (charThatIsReallyAnUnsInt == EOF)
- goto ExitLoop;
- } while (charThatIsReallyAnUnsInt != '\n');
- break;
- case ('A'): /* Add lines without the last return */
- case ('a'): /* Add lines without with the last return */
- if (newFilePtr == NULL)
- Error (BAD_SCRIPT_FORMAT);
- sourceLines = ReadInt (scriptFilePtr);
- lineCount = ReadInt (scriptFilePtr);
- sourceLines -= oldLineNumber - 1;
- CopyLines (oldFilePtr, newFilePtr, sourceLines, /*exclude last return is */ FALSE);
- oldLineNumber += sourceLines;
- CopyLines (scriptFilePtr,
- newFilePtr,
- lineCount,
- /*exclude last return is */ commandCharThatIsReallyAnInt == 'A');
- break;
- case ('b'): /* binary file */
- AppendFileSuffixToPaths (oldPathName, newPathName, scriptFilePtr);
- fprintf (stdout, "%s", newPathName);
- newFilePtr = CreateTypedFile (newPathName, /* binary is */ TRUE);
- oldFilePtr = fopen (oldPathName, "rb");
- fileAttributes = RESOURCE_MASK;
- binaryFile = TRUE;
- break;
- case ('d'): /* directory */
- AppendFileSuffixToPaths (oldPathName, newPathName, scriptFilePtr);
- ioResult = MakeDirectory (newPathName);
- if (ioResult != 0)
- ErrorWithStringArgument (CANT_CREATE_DIRECTORY, newPathName);
- break;
- case ('f'): /* ASCII file */
- AppendFileSuffixToPaths (oldPathName, newPathName, scriptFilePtr);
- fprintf (stdout, "%s", newPathName);
- newFilePtr = CreateTypedFile (newPathName, /* binary is */ FALSE);
- oldFilePtr = fopen (oldPathName, "r");
- fileAttributes = RESOURCE_MASK;
- binaryFile = FALSE;
- break;
- case ('H'): /* hexidecimal data */
- if (!binaryFile)
- Error (BAD_SCRIPT_FORMAT);
- highHexDigit = FALSE;
- lineCount = ReadInt (scriptFilePtr);
- while (lineCount > 0) {
- do {
- charThatIsReallyAnUnsInt = (unsigned int) getc (scriptFilePtr);
- if (charThatIsReallyAnUnsInt == EOF)
- Error (BAD_SCRIPT_FORMAT);
- if (charThatIsReallyAnUnsInt == '\n')
- break;
- if (charThatIsReallyAnUnsInt >= '0' && charThatIsReallyAnUnsInt <= '9') {
- charThatIsReallyAnUnsInt -= '0';
- goto IsHex;
- }
- if (charThatIsReallyAnUnsInt >= 'A' && charThatIsReallyAnUnsInt <= 'F') {
- charThatIsReallyAnUnsInt += -'A' + 10;
- IsHex: if (highHexDigit) {
- hexCharThatIsReallyAnInt += charThatIsReallyAnUnsInt;
- putc (hexCharThatIsReallyAnInt, newFilePtr);
- hashValue = HASH (hashValue, hexCharThatIsReallyAnInt);
- } else {
- hexCharThatIsReallyAnInt = charThatIsReallyAnUnsInt << 4;
- }
- highHexDigit = !highHexDigit;
- }
- } while (TRUE);
- lineCount--;
- }
- if (highHexDigit) /* We end with a nibble remaining in binary mode */
- Error (BAD_SCRIPT_FORMAT);
- /*
- * Set oldLineNumber to a value that indicates we have a new version of the file. Also
- * seek to the end of the file so we won't copy any contents from the old file.
- */
- oldLineNumber = 2;
- if (oldFilePtr != NULL) {
- ioResult = fseek (oldFilePtr, 0, SEEK_END);
- if (ioResult != 0)
- ErrorWithStringArgument (UNEXPECTED_IO_ERROR, oldPathName);
- }
- break;
- case ('h'): /* hash */
- hashRead = ReadInt (scriptFilePtr);
- if (hashRead != hashValue)
- fprintf (stdout, " %s", ECMessagessArray[HASH_DOESNT_MATCH]);
- putc ('\n', stdout);
- hashValue = 0;
- break;
- case ('u'): /* up directory */
- charThatIsReallyAnUnsInt = (unsigned int) getc (scriptFilePtr);
- if (charThatIsReallyAnUnsInt != '\n')
- Error (BAD_SCRIPT_FORMAT);
- RemoveNameSuffix (newPathName);
- RemoveNameSuffix (oldPathName);
- break;
- case ('x'): /* delete lines */
- if (newFilePtr == NULL)
- Error (BAD_SCRIPT_FORMAT);
- sourceLines = ReadInt (scriptFilePtr);
- lineCount = ReadInt (scriptFilePtr);
- sourceLines -= oldLineNumber;
- CopyLines (oldFilePtr, newFilePtr, sourceLines, /*exclude last return is */ FALSE);
- oldLineNumber += sourceLines;
- CopyLines (oldFilePtr, NULL, lineCount, /*exclude last return is */ FALSE);
- oldLineNumber += lineCount;
- break;
- default:
- Error (BAD_SCRIPT_FORMAT);
- break;
- }
- } while (TRUE);
-
- ExitLoop:;
- if (oldFilePtr != NULL || newFilePtr != NULL)
- Error (BAD_SCRIPT_FORMAT);
- }
-
- void
- AppendFileSuffixToPaths (char *oldPathNamePtr, char *newPathNamePtr, FILE *scriptFilePtr)
- {
- register char *charPtr;
- unsigned int charThatIsReallyAnUnsInt;
- int length;
- char suffix [FILENAME_MAX + 1];
- char *suffixPtr;
-
- suffixPtr = suffix;
- length = 0;
- goto GetNameChar;
- do {
- *suffixPtr = (char) charThatIsReallyAnUnsInt;
- if (length < FILENAME_MAX) {
- length ++;
- suffixPtr++;
- }
- GetNameChar:
- charThatIsReallyAnUnsInt = (unsigned int) getc (scriptFilePtr);
- } while (charThatIsReallyAnUnsInt != '\n' && charThatIsReallyAnUnsInt != EOF);
- *suffixPtr = '\0';
-
- charPtr = strrchr (oldPathNamePtr, DIRECTORY_CHAR);
- if (charPtr == NULL || *(charPtr + 1) != '\0')
- AppendCharToPathName (oldPathNamePtr, DIRECTORY_CHAR);
- AppendStringToPathName (oldPathNamePtr, suffix);
-
- charPtr = strrchr (newPathNamePtr, DIRECTORY_CHAR);
- if (charPtr == NULL || *(charPtr + 1) != '\0')
- AppendCharToPathName (newPathNamePtr, DIRECTORY_CHAR);
- AppendStringToPathName (newPathNamePtr, suffix);
- }
-
- void
- CopyLines (register FILE *oldFilePtr,
- register FILE *newFilePtr,
- register int lineCount,
- int excludeLastReturn)
- {
- register unsigned int charThatIsReallyAnUnsInt;
- int copyUntilEOF;
-
- #ifdef DF_MACHINE_MACINTOSH
- SpinCursor (1);
- #endif
- copyUntilEOF = lineCount == INT_MAX;
- if (oldFilePtr != NULL) {
- if (newFilePtr == NULL) {
- while (lineCount > 0) {
- do {
- charThatIsReallyAnUnsInt = (unsigned int) getc (oldFilePtr);
- if (charThatIsReallyAnUnsInt == EOF)
- goto EndOfFile;
- } while (charThatIsReallyAnUnsInt != '\n');
- lineCount --;
- }
- } else {
- while (lineCount > 0) {
- goto GetChar1;
- do {
- putc (charThatIsReallyAnUnsInt, newFilePtr);
- hashValue = HASH (hashValue, charThatIsReallyAnUnsInt);
- GetChar1: charThatIsReallyAnUnsInt = (unsigned int) getc (oldFilePtr);
- if (charThatIsReallyAnUnsInt == EOF)
- goto EndOfFile;
- } while (charThatIsReallyAnUnsInt != '\n');
- lineCount --;
- if (!excludeLastReturn || lineCount != 0) {
- putc (charThatIsReallyAnUnsInt, newFilePtr);
- /*
- * Use a machine independent value for '\n' since if is different on Mac, Windows and Next.
- */
- hashValue = HASH (hashValue, 13);
- }
- }
- }
- }
-
- EndOfFile:
- if (lineCount != 0 && /* Lines processed doesn't match expected */
- !copyUntilEOF && /* Don't know exact number of lines */
- !(lineCount == 1 && newFilePtr == NULL) /* Source file doesn't end in return so it's off by one */)
- Error (BAD_SCRIPT_FOR_SOURCE);
- }
-
- int
- ReadInt (register FILE *filePtr)
- /*
- * scanf always seemed too complicated for it's own good.
- */
- {
- #define MAX_STRING 24
- int count;
- unsigned int charThatIsReallyAnUnsInt;
- char string[MAX_STRING + 1];
- register char *stringPtr;
-
- static const char DigitAndMinus[] = {
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* nul..bel */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* bs..si */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* dle..etb */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* can..us */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* space..' */
- FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, /* (../ */
- TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, /* 0..7 */
- TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* 8..? */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* @..G */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* H..O */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* P..W */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* X.._ */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* `..g */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* h..o */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* p..w */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* x..DEL */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, /* Non ASCII */
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE /* Non ASCII */
- };
-
- stringPtr = string;
- count = MAX_STRING;
- goto GetChar;
- do {
- *stringPtr++ = (char) charThatIsReallyAnUnsInt;
- count --;
- GetChar:
- charThatIsReallyAnUnsInt = (unsigned int) getc (filePtr);
- } while (DigitAndMinus [charThatIsReallyAnUnsInt] && count > 0);
- if (count == 0)
- Error (BAD_SCRIPT_FORMAT);
- *stringPtr = '\0';
- return (atoi (string));
- }
-
-