This is eText.PlainText.m in view mode; [Download] [Up]
{\rtf0\ansi{\fonttbl\f0\fmodern Courier;\f1\ftech Symbol;\f2\fmodern Ohlfs;} \margl40 \margr40 \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b0\i0\ulnone\fs24\fc0\cf0 //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\ // \i \b FILENAME \b0 : \b\i0 eText.PlainText.m \ \b0 // \i \b SUMMARY \b0 : \b\i0 Implementation of PlainText markup formats of eText (ASCII, C) \b0 \ // \b\i CATEGORY \b0 : \i0 \b PlainText \b0 \ // \b\i PROTOCOLS \b0 : \i0 \b <ASCIISupport> \b0 , \b <CSupport> \b0 \ // \b\i INTERFACE \b0 : \i0 \b None \b0 \ // \b\i AUTHOR \b0 : \b\i0 Rohit Khare \b0 \ // \b\i COPYRIGHT \b0 : \f1\i0 Ó \f0\b 1993,94 California Institure of Technology, eText Project\ \b0 //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\ // \b\i Implementation Comments \b0\i0 \ // These methods are pretty much syntactic sugar.\ // I can't decide whether 'C' should unravel 8-bit characters into ascii\ // equivalents. OTOH, who programs with ligatures? -- and if they do, leave\ // it alone!\ //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\ // \b\i History \b0\i0 \ // 10/17/94: \b Cleaned up for eText5. \b0 \ // 08/05/94: \b Completely Rearchitected for 5.0. RK \b0 \ //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\ // \b Imported Interfaces \b0 \ //\ #import " \b eText.PlainText.h \b0 "\ \ //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\ // \b Encoder API \b0 \ //\ void \b ASCIIEncoder \b0 (NXStream * \b s \b0 , unsigned char * \b item \b0 , int \b len \b0 ) \{\ int i; char *out;\ \ if( \b !len \b0 ) \b len \b0 = \b strlen \b0 ((unsigned char*) \b item \b0 );\ for (i=0; i<len; i++) \{ \ \b out \b0 = \b NXToAscii \b0 (item[i]);\ \b NXWrite \b0 (s, \b out \b0 , \b strlen \b0 ( \b out \b0 ));\ \}\ \}\ \ \i @implementation eText(PlainText)\ \i0 //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\ // \b Path Operators\ \b0 //\ - \b readASCIIfromPath \b0 :(const char *)path \{\ NXStream *memstream;\ \ \b memstream \b0 = \b NXMapFile \b0 ( \b path \b0 , NX_READONLY);\ if (memstream)\{\ [self \b readASCII \b0 : \b memstream \b0 ];\ NXCloseMemory(memstream, NX_FREEBUFFER);\ \} else\ \b return \b0 \b nil \b0 ;\ return self;\ \}\ - \b writeASCIItoPath \b0 :(const char *)path \{\ NXStream *memstream;\ \ \b memstream \b0 = \b NXOpenMemory \b0 ( \b NULL \b0 , 0, NX_WRITEONLY);\ if (memstream) \{\ [self \b writeASCII \b0 : \b memstream \b0 ];\ \b NXSaveToFile \b0 (memstream, \b path \b0 );\ \b NXCloseMemory \b0 ( \b memstream \b0 , NX_FREEBUFFER);\ \} else\ return \b nil \b0 ;\ return self;\ \}\ \ - \b readCfromPath \b0 :(const char *)path \{\ NXStream *memstream;\ \ \b memstream \b0 = \b NXMapFile \b0 ( \b path \b0 , NX_READONLY);\ if (memstream)\{\ [self \b readC \b0 : \b memstream \b0 ];\ \b NXCloseMemory \b0 ( \b memstream \b0 , NX_FREEBUFFER);\ \} else\ return \b nil \b0 ;\ return self;\ \}\ - \b writeCtoPath \b0 :(const char *)path \{\ NXStream *memstream;\ \ \b memstream \b0 = \b NXOpenMemory \b0 ( \b NULL \b0 , 0, NX_WRITEONLY);\ if (memstream) \{\ [self \b writeC \b0 : \b memstream \b0 ];\ \b NXSaveToFile \b0 (memstream, \b path \b0 );\ \b NXCloseMemory \b0 ( \b memstream \b0 , NX_FREEBUFFER);\ \} else\ return \b nil \b0 ;\ return self;\ \}\ \ //ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ\ // \b Stream Operators \b0 \ //\ - \b readASCII \b0 : ( \b NXStream \b0 *)s \{\ return [self \b readText \b0 : \b s \b0 ];\}\ - \b writeASCII \b0 : ( \b NXStream \b0 *)s \{\ return [self \b writeASCII \b0 :s \b from \b0 : \b 0 \b0 \b to \b0 :[self \b textLength \b0 ]];\}\ - \b writeASCII \b0 : ( \b NXStream \b0 *)s \b from \b0 :( \b int \b0 ) start \b to \b0 :( \b int \b0 ) end \{\ int k,N,cnt=0;\ \b NXRun \b0 * \b curr \b0 ;\ \b NXTextBlock \b0 * \b currBlock \b0 ;\ int \b currentOffset \b0 , \b targetOffset \b0 ;\ \b id \b0 \b compList \b0 ;\ \ \b N \b0 = theRuns->chunk. \b used \b0 /sizeof( \b NXRun \b0 );\ \b curr \b0 = theRuns-> \b runs \b0 ;\ \b currBlock \b0 = [self \b firstTextBlock \b0 ];\ \b compList \b0 = [[ \b List \b0 alloc] \b init \b0 ];\ \b currentOffset \b0 = \b 0 \b0 ; \ for(k=0; (k < N) && (currentOffset < end); k++) \{\ \ \b targetOffset \b0 = \b currentOffset \b0 + curr-> \b chars \b0 ;\ \ if ((targetOffset > start) && (curr-> \b info \b0 )) \{ \ if ([curr->info \b respondsTo \b0 :@selector( \b writeASCIIRef:forView: \b0 )]) \{\ \b NXPrintf \b0 (s," \b [%d] \b0 ", \b cnt++ \b0 );\ [ \b compList \b0 \b addObject \b0 :(curr-> \b info \b0 )];\ \}\ if ([curr->info \b respondsTo \b0 :@selector( \b writeASCII:forView: \b0 )])\{\ [curr->info \b writeASCII \b0 :s \b forView \b0 :self];\ \}\ \}\ \ // \i consume full blocks \i0 \ while (currBlock && (targetOffset >= currBlock->chars)) \{\ \ if ((targetOffset > start) && \ (curr-> \b info \b0 == nil) && \ ( \b targetOffset \b0 > \b currentOffset \b0 ))\ \b \ ASCIIEncoder \b0 (s, currBlock->text + MAX(currentOffset,start),\ MIN(end,currBlock->chars) - MAX(currentOffset,start));\ \ targetOffset -= currBlock->chars;\ start -= currBlock->chars;\ end -= currBlock->chars;\ currentOffset=0;\ currBlock = currBlock->next;\ \}\ \ // \i consume partial block \i0 \ if (currBlock)\ \ if ((targetOffset > start) && \ (curr-> \b info \b0 == nil) && \ ( \b targetOffset \b0 > \b currentOffset \b0 ))\ \b \ ASCIIEncoder \b0 (s, currBlock->text + MAX(currentOffset,start),\ MIN(end,targetOffset) - MAX(currentOffset,start));\ \ currentOffset=targetOffset;\ curr++;\ \}\ \ // \i compList \i0 \ \b N \b0 =[compList \b count \b0 ];\ if ( \b N \b0 ) \{\ \b NXPrintf \b0 (s," \b \\n\\nREFERENCES\\n\\n \b0 ");\ for (k=0; k < N; k++) \{\ \b NXPrintf \b0 (s," \b [%d]\\t \b0 ", \b k \b0 );\ [[compList \b objectAt \b0 : \b k \b0 ] \b writeASCIIRef \b0 :s \b forView \b0 :self];\ \b NXPutc \b0 (s,' \b \\n \b0 ');\ \}\ \}\ [ \b compList \b0 \b free \b0 ];\ return self;\ \}\ \ - \b readC \b0 : ( \b NXStream \b0 *)s \{\ return [self \b readText \b0 : \b s \b0 ];\}\ - \b writeC \b0 : ( \b NXStream \b0 *)s \{\ return [self \b writeC \b0 :s \b from \b0 : \b 0 \b0 \b to \b0 :[self \b textLength \b0 ]];\}\ - \b writeC \b0 : ( \b NXStream \b0 *)s \b from \b0 :( \b int \b0 ) start \b to \b0 :( \b int \b0 ) end \{\ int k,N;\ \b NXRun \b0 * \b curr \b0 ;\ \b NXTextBlock \b0 * \b currBlock \b0 ;\ int \b currentOffset \b0 , \b targetOffset \b0 ;\ \ \b N \b0 = theRuns->chunk. \b used \b0 /sizeof( \b NXRun \b0 );\ \b curr \b0 = theRuns-> \b runs \b0 ;\ \b currBlock \b0 = [self \b firstTextBlock \b0 ];\ \b currentOffset \b0 = \b 0 \b0 ; \ for (k=0; k < N; k++) \{\ if (curr-> \b info \b0 ) \{ \ if ([curr->info \b respondsTo \b0 :@selector( \b writeC:forView: \b0 )])\{\ [curr->info \b writeC \b0 :s \b forView \b0 :self];\ \}\ \}\ \i // encode the text corresponding to the run\ // misson is to write (cumulative) curr->chars chars beginning\ // at currentCount. boundaries may map onto > 1 block \i0 \ \b targetOffset \b0 = \b currentOffset \b0 + curr-> \b chars \b0 ;\ // \i consume full blocks \i0 \ while ((currBlock) && (targetOffset >= (currBlock->chars))) \{\ if ( \b ! \b0 (curr-> \b info \b0 )) // \i throw annotated bits in bucket \i0 \ if( \b targetOffset \b0 > \b currentOffset \b0 ) // \i don't pass len=0 to encoder \i0 \ \b NXWrite \b0 (s, currBlock->text+currentOffset,\ currBlock->chars - currentOffset);\ targetOffset -= currBlock->chars;\ currBlock = currBlock->next;\ currentOffset=0;\ \}\ // \i consume partial block \i0 \ if (currBlock && ( \b ! \b0 curr-> \b info \b0 )) // \i throw annotated bits in bucket \i0 \ if(targetOffset>currentOffset) // \i don't pass len=0 to encoder \i0 \ \b NXWrite \b0 (s, currBlock->text + currentOffset,\ targetOffset-currentOffset);\ currentOffset=targetOffset;\ curr++;\ \} \ return self;\ \}\ \ \i @end }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.