This is BibTeXObject.m in view mode; [Download] [Up]
// Copyright H. Giesen, University of Koblenz-Landau 1996 #import "BibTeXObject.h" @implementation BibTeXObject - initFromStream:(NXStream *)aStream owner:myFile { [super init]; theStream = aStream; owner = myFile; c = NXGetc( theStream ); // we could first check for Header // this could be a LaTeX comment before the first entry // now comments are skipped in the parser: // while( (c!='@') && (c!=EOF) ) NextByte; if( [self pickUpItem] ) return self; //if( [self parseSelf] ) return self; // works return [self free]; } - fileObject { return owner; } - (NXStream *)stream { return theStream; } - setRange:(locType)range { locInput = range; NXSeek(theStream, locInput.start-1, NX_FROMSTART); c = NXGetc( theStream ); [self pickUpItem]; return self; } - (int)line { return firstLine; } - (locType)range { return locInput; } - (locType)key { return myKey; } - (int)entryType { return myType; } - (char *)buffer { char *theBuffer; int length, maxLength; NXGetMemoryBuffer(theStream, &theBuffer, &length, &maxLength); return theBuffer; } // !! the calling object has to guarantee the buffer of // appropriate size !! - (char *)copy:(int)start :(int)length toBuffer:(char *)buffer { int i; NXSeek(theStream, start, NX_FROMSTART); for( i=0; i<length; i++ ){ buffer[i] = NXGetc( theStream ); } buffer[i] = '\0'; return buffer; } - (char *)copyRange:(locType)r toBuffer:(char *)buffer { return [self copy:r.start :r.length toBuffer:buffer]; } - copyRange:(locType)r toStream:(NXStream *)str { char *theBuffer; int length, maxLength; int count; NXGetMemoryBuffer( [self stream], &theBuffer, &length, &maxLength); for( count=0; count<r.length; count++ ){ NXPutc( str, theBuffer[ r.start + count ] ); } return self; } - setKeyTo:(Cell *)strField { char *theBuffer; char ccc; locType r = [self key]; int inx = r.start + r.length; int length, maxLength; NXGetMemoryBuffer(theStream, &theBuffer, &length, &maxLength); ccc = theBuffer[ inx ]; theBuffer[ inx ] = '\0'; // overwrite [strField setStringValue:&theBuffer[ r.start ]]; theBuffer[ inx ] = ccc; // old value return self; } - setStringOf:(locType)r to:strField { char *theBuffer; char ccc; int inx = r.start + r.length; int length, maxLength; NXGetMemoryBuffer(theStream, &theBuffer, &length, &maxLength); ccc = theBuffer[ inx ]; theBuffer[ inx ] = '\0'; // overwrite [strField setStringValue:&theBuffer[ r.start ]]; theBuffer[ inx ] = ccc; // old value return self; } - (locType)fieldFor:(int)fieldType { return [BibTexParser fieldFor:fieldType]; } - copyToStream:(NXStream *)str { char *theBuffer; int length, maxLength; int count; NXGetMemoryBuffer( [self stream], &theBuffer, &length, &maxLength); for( count=0; count<locInput.length; count++ ){ NXPutc( str, theBuffer[ locInput.start + count ] ); } return self; } - copyToFile:(FILE *)str { char *theBuffer; char ch; int i = 0; int length, maxLength; NXGetMemoryBuffer( [self stream], &theBuffer, &length, &maxLength); while( (ch=theBuffer[locInput.start + i])!='@' ){ fputc( ch, str ); i++; } fputc( ch, str ); // '@' i++; fputs( [self entryNameString:myType], str ); // the entryType ch = theBuffer[locInput.start + i++]; while( (ch!=LPARA) && (ch!=LBRACE) ) { // skip the entryName ch = theBuffer[locInput.start + i++]; } i--; // position of LPARA or LBRACE fwrite( &theBuffer[locInput.start+i], sizeof(char), locInput.length-i, str ); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.