This is Parse.m in view mode; [Download] [Up]
//***************************************************************************** // // Parse.m. // // Search a file for a specific pattern of (2)strings which will // identify the next str as a keyword to be captured and returned. // // by Felipe A. Rodriguez // // This code is supplied "as is" the author makes no warranty as to its // suitability for any purpose. This code is free and may be distributed // in accordance with the terms of the: // // GNU GENERAL PUBLIC LICENSE // Version 2, June 1991 // copyright (C) 1989, 1991 Free Software Foundation, Inc. // 675 Mass Ave, Cambridge, MA 02139, USA // //***************************************************************************** #import "Parse.h" @implementation Parse //***************************************************************************** // // Open file to parse and search // //***************************************************************************** - (char *)parseFile:(const char *)filePath { NXStream *inFStream; static char buf[2] = {" \0"}; int nread = 0, i = 0; char * resultStr; if((inFStream = NXMapFile(filePath, NX_READONLY)) == NULL) { strcpy(lBuf, "Could not open file: "); strcat(lBuf, filePath); NXRunAlertPanel(0, lBuf, 0, 0, 0); } else { nread = NXRead(inFStream, buf, 1); while(!(nread <= 0)) // read while char's in file { // cycle thru file until we find keyword or EOF strcpy(lBuf, buf); do { // build a line buffer from file data nread = NXRead(inFStream, buf, 1); strcat(lBuf, buf); i++; } while((buf[0] != '\n') && (buf[0] != '\r') && (i < MAXPATHLEN) && buf[0]); i = 0; while(((buf[0] == '\n') || (buf[0] == '\r')) && (!(nread <= 0))) nread = NXRead(inFStream, buf, 1); // eliminate cr, nl if(resultStr = [self parse:lBuf]) // parse line buffer return resultStr; } NXClose(inFStream); } return NULL; } //***************************************************************************** // // Specify keywords to be searched for. Keyword 1 must be found // prior to keyword 2. Ideally, these two should be adjacent in file // //***************************************************************************** - setKey1:(const char *)keyWord { keyOne = keyWord; return self; } - setKey2:(const char *)keyWord { keyTwo = keyWord; return self; } //***************************************************************************** // // Specify file delimiters to be used in parsing. Once the first keyword // is caught the second set of delimiters is used in parsing. // //***************************************************************************** - setDelim1:(const char *)delimiters { delim1 = delimiters; return self; } - setDelim2:(const char *)delimiters { delim2 = delimiters; return self; } //***************************************************************************** // // parses a line of text looking for a set of keywords // // **keyWords + delims must me set before calling this method as follows: // keyOne -- should point to first keyword to be caught // keyTwo -- should point to second keyword to be caught // delim1 -- should point to first set of delimiters // delim2 -- should point to second set of delimiters // //***************************************************************************** - (char *)parse:(char *)buffer { static char *str; static BOOL found = NO; // set if first keyword found in prev line str = strtok(buffer, delim1); // Parse string while(str != NULL) { // did we catch keyOne str? if((strcmp(str, keyOne) == 0) || found == YES) { found = YES; // first keyword has been found if(str = strtok(NULL, delim1)) // if not NULL { if(strcmp(str, keyTwo) == 0) // did we catch this str? { if(str = strtok(NULL, delim2)) // this must be the grail { // if str ! NULL found = NO; return NXCopyStringBuffer(str); // return search result } } } } str = strtok(NULL, delim1); } return NULL; // keyword not found } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.