This is SearchAndReplace.m in view mode; [Download] [Up]
#import "SearchAndReplace.h" #import <sys/types.h> #import <sys/stat.h> @implementation SearchAndReplace - appDidInit:sender { if ((homeDir = getenv("HOME")) == NULL) printf("Error: could not find home directory!"); else { strcpy(fullFilename,homeDir); [directoryText setStringValue:homeDir]; strcpy(backupsDirectory,homeDir); [backupsDirectoryText setStringValue:homeDir]; } return self; } - execute:sender { int selection, extensionCount, changedDirectoryCount, i; char unixCommand[1024], currentPathAndFile[256], currentDirectory[256], textLine[256], tempFileName1[256], tempFileName2[256], tempFileName3[256], filterName[256], fromString[128], toString[128], lastChar, *lastCharPointer, *temp1, temp4[4], *currentExt, extension[20][32], *changedDirectory[1000], tempDirectory[256], newFileName[256], newPathAndFile[256]; FILE *f; BOOL excludeChosen, excludeCurrent, matched; struct stat buf; changedDirectoryCount = 0; excludeChosen = (BOOL)[[includeExcludeRadio selectedCell] tag]; extensionCount = 0; for (i=0; i<[extensionForm cellCount]; i++) { strcpy(extension[extensionCount],[[extensionForm cellAt:i:0] stringValue]); if (strlen(extension[extensionCount]) > 0) extensionCount++; } selection = NXRunAlertPanel("Warning:","Performing this operation could cause irreversible damage to the ENTIRE subtree you have chosen (including any linked directories). Do you still want to execute this operation?", "Execute","Cancel",NULL); if ((selection == NX_ALERTDEFAULT) && (homeDir != NULL)){ strcpy(currentDirectory, fullFilename); strcpy(fromString,[searchStringForm stringValueAt:0]); strcpy(toString,[searchStringForm stringValueAt:1]); sprintf(tempFileName1,"%s/#SAR.temp1#",homeDir); sprintf(tempFileName2,"%s/#SAR.temp2#",homeDir); sprintf(tempFileName3,"%s/#SAR.temp3#",homeDir); sprintf(filterName,"%s/Filter.o",[[NXBundle mainBundle] directory]); strcpy(temp4,""); if ([[operationSwitch cellAt:2:0] intValue]) strcpy(temp4,"R"); sprintf(unixCommand,"ls -%sFa %s > %s",temp4,fullFilename,tempFileName1); system(unixCommand); f = fopen(tempFileName1,"r"); fscanf(f,"%s[^\n]\n",textLine); while (!feof(f)) { lastCharPointer = textLine + strlen(textLine) - 1; lastChar = textLine[strlen(textLine)-1]; if (lastChar == ':') { strncpy(currentDirectory,textLine,strlen(textLine)-1); currentDirectory[strlen(textLine)-1] = '\0'; excludeCurrent = YES; for (i=0; i<changedDirectoryCount; i++) if (strncmp(currentDirectory,changedDirectory[i],strlen(changedDirectory[i])) == 0) { strcpy(tempDirectory,currentDirectory); temp1 = tempDirectory + (rindex(changedDirectory[i],'/') - changedDirectory[i]); *temp1 = '\0'; temp1++; [self renameFile:temp1 searchFor:fromString replaceWith:toString]; sprintf(currentDirectory,"%s/%s",tempDirectory,temp1); } } else { if ((lastChar == '/') || (lastChar == '@') || (lastChar == '*') || (lastChar == '=')) *lastCharPointer = '\0'; excludeCurrent = !excludeChosen; if (currentExt = rindex(textLine,'.')) { currentExt++; matched = NO; for (i=0; i<extensionCount; i++) if (strcmp(currentExt,extension[i]) == 0) matched = YES; if (matched) excludeCurrent = excludeChosen; } sprintf(currentPathAndFile,"%s/%s",currentDirectory,textLine); } if ((!excludeCurrent) && (textLine[0] != '.')) { if (([[operationSwitch cellAt:1:0] intValue]) && (lastChar != '/') && (lastChar != '@') && (lastChar != '=')) { sprintf(unixCommand,"grep \"%s\" %s > %s", fromString, currentPathAndFile, tempFileName3); system(unixCommand); stat(tempFileName3, &buf); if (buf.st_size > 0) { if ([[operationSwitch cellAt:3:0] intValue]) { sprintf(unixCommand,"cp %s %s/%s",currentPathAndFile, backupsDirectory,textLine); system(unixCommand); } sprintf(unixCommand,"cat %s | %s | sed 's/%s/%s/g' > %s; mv %s %s", currentPathAndFile,filterName,fromString,toString, tempFileName2,tempFileName2,currentPathAndFile); system(unixCommand); printf("Search and Replace: Modifying file -- %s\n", currentPathAndFile); } } if (([[operationSwitch cellAt:0:0] intValue])) { strcpy(newFileName,textLine); if ([self renameFile:newFileName searchFor:fromString replaceWith:toString]) { sprintf(newPathAndFile,"%s/%s",currentDirectory,newFileName); sprintf(unixCommand,"mv %s %s",currentPathAndFile,newPathAndFile); system(unixCommand); printf("Search and Replace: Renaming file -- %s\n", currentPathAndFile); if (lastChar == '/') { changedDirectory[changedDirectoryCount] = (char *)malloc(256 * sizeof(char)); strcpy(changedDirectory[changedDirectoryCount],currentPathAndFile); changedDirectoryCount++; } } } } [filenameText setStringValue:currentPathAndFile]; fscanf(f,"%s[^\n]\n",textLine); } fclose(f); sprintf(unixCommand,"rm %s; rm %s; rm %s",tempFileName1,tempFileName2,tempFileName3); system(unixCommand); } for (i=0; i<changedDirectoryCount; i++) free(changedDirectory[i]); return self; } - (BOOL)renameFile:(char *)aName searchFor:(char *)searchString replaceWith:(char *)replaceString { char *temp1, temp2[256], *temp3; strcpy(temp2,aName); if (temp1 = strstr(temp2,searchString)) { temp3 = temp1 + strlen(searchString); *temp1 = '\0'; sprintf(aName,"%s%s%s",temp2,replaceString,temp3); return YES; } else return NO; } - setBackupsDirectory:sender { char filename[64], path[256]; strcpy(filename,""); strcpy(path, backupsDirectory); if (getOpenFilenameAndPath(filename,path,NULL)) { sprintf(backupsDirectory,"%s/%s",path,filename); [backupsDirectoryText setStringValue:backupsDirectory]; } return self; } - setDirectory:sender { char filename[64], path[256]; strcpy(filename,""); strcpy(path,fullFilename); if (getOpenFilenameAndPath(filename,path,NULL)) { sprintf(fullFilename,"%s/%s",path,filename); [directoryText setStringValue:fullFilename]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.