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.