File:  [Apple XNU] / GNUtools / cc / rtf2ascii.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:45:32 2018 UTC (8 years, 2 months ago) by root
Branches: MAIN, Apple
CVS tags: HEAD, GNUtools33
GNU tools for NeXTSTEP 3.3


// rtf2ascii.c

#import <libc.h>
#import <stdio.h>
#import <ctype.h>
#import <string.h>

#define ASCII_TERMINATOR '\0' 

const char * rtfToAscii( const char *rtfTextPtr, int rtfTextLen, int * asciiTextLen ) 
{
   char * asciiTextBuf = (char *) malloc(rtfTextLen);  // should be plenty
   char * asciiTextPtr = asciiTextBuf;
   const char *endRtfPtr = rtfTextPtr + rtfTextLen;

   if (!asciiTextBuf) // just in case
      return NULL;
      
   while ( rtfTextPtr != endRtfPtr ) {
      switch( *rtfTextPtr ) {
       case '\n':
          rtfTextPtr++;
          break;
       case '}':
          if ( *++rtfTextPtr == '\n' ) {
	     rtfTextPtr++;
	     if (*rtfTextPtr == '�') rtfTextPtr++;
	  }	     
          break;
       case '{':
          if ( !strncmp( rtfTextPtr, "{\\stylesheet", 12 ) 
	    || !strncmp( rtfTextPtr, "{\\fonttbl", 9 ) 
	    || !strncmp( rtfTextPtr, "{\\colortbl", 10 ) 
	    || !strncmp( rtfTextPtr, "{\\NeXTHelp", 10 )
	    || !strncmp( rtfTextPtr, "{{\\NeXTHelp", 11 ) ) {
             int depth = 1;
             while ( depth > 0 ) {
                switch ( *++rtfTextPtr ) {
                 case '{': depth++; break;
                 case '}': depth--; break;
                }
             }
          }
          else
             rtfTextPtr++;
          break;
       case '\\':
          rtfTextPtr++;
          if (*rtfTextPtr == '{'  
	   || *rtfTextPtr == '}'  
	   ||  *rtfTextPtr == '\\'  
	   ||  *rtfTextPtr == '\n' ) {
             *asciiTextPtr++ = *rtfTextPtr++;
          } else if ( *rtfTextPtr == '\'' ) {
             int v1, v2, value;
             rtfTextPtr++;
             v1 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0') 
	                                 : ((*rtfTextPtr - 'a') + 10);
             rtfTextPtr++;
             v2 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0') 
	                                 : ((*rtfTextPtr - 'a') + 10);
             value = (v1 << 4) | (v2);
             *asciiTextPtr++ = value;
             rtfTextPtr++;
          } else {
             while ( isalpha( *rtfTextPtr ) ) rtfTextPtr++;
	     if (*rtfTextPtr == '-') rtfTextPtr++;
	     while ( isdigit( *rtfTextPtr ) ) rtfTextPtr++;
	     if ( *rtfTextPtr == ' ' ) rtfTextPtr++;
	     else while (*rtfTextPtr == ' ') rtfTextPtr++;
          }
          break;
        default:
          *asciiTextPtr++ = *rtfTextPtr++;
       }       
   }
   *asciiTextPtr = ASCII_TERMINATOR;
   *asciiTextLen = (int)asciiTextPtr - (int)asciiTextBuf;
#ifdef DEBUG
   printf("Converting RTF buffer of size %d to ASCII buffer of size %d.\n",
	  rtfTextLen, *asciiTextLen);
#endif
   return asciiTextBuf;
}



unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.