Annotation of GNUtools/cc/rtf2ascii.c, revision 1.1.1.1

1.1       root        1: 
                      2: // rtf2ascii.c
                      3: 
                      4: #import <libc.h>
                      5: #import <stdio.h>
                      6: #import <ctype.h>
                      7: #import <string.h>
                      8: 
                      9: #define ASCII_TERMINATOR '\0' 
                     10: 
                     11: const char * rtfToAscii( const char *rtfTextPtr, int rtfTextLen, int * asciiTextLen ) 
                     12: {
                     13:    char * asciiTextBuf = (char *) malloc(rtfTextLen);  // should be plenty
                     14:    char * asciiTextPtr = asciiTextBuf;
                     15:    const char *endRtfPtr = rtfTextPtr + rtfTextLen;
                     16: 
                     17:    if (!asciiTextBuf) // just in case
                     18:       return NULL;
                     19:       
                     20:    while ( rtfTextPtr != endRtfPtr ) {
                     21:       switch( *rtfTextPtr ) {
                     22:        case '\n':
                     23:           rtfTextPtr++;
                     24:           break;
                     25:        case '}':
                     26:           if ( *++rtfTextPtr == '\n' ) {
                     27:             rtfTextPtr++;
                     28:             if (*rtfTextPtr == '�') rtfTextPtr++;
                     29:          }          
                     30:           break;
                     31:        case '{':
                     32:           if ( !strncmp( rtfTextPtr, "{\\stylesheet", 12 ) 
                     33:            || !strncmp( rtfTextPtr, "{\\fonttbl", 9 ) 
                     34:            || !strncmp( rtfTextPtr, "{\\colortbl", 10 ) 
                     35:            || !strncmp( rtfTextPtr, "{\\NeXTHelp", 10 )
                     36:            || !strncmp( rtfTextPtr, "{{\\NeXTHelp", 11 ) ) {
                     37:              int depth = 1;
                     38:              while ( depth > 0 ) {
                     39:                 switch ( *++rtfTextPtr ) {
                     40:                  case '{': depth++; break;
                     41:                  case '}': depth--; break;
                     42:                 }
                     43:              }
                     44:           }
                     45:           else
                     46:              rtfTextPtr++;
                     47:           break;
                     48:        case '\\':
                     49:           rtfTextPtr++;
                     50:           if (*rtfTextPtr == '{'  
                     51:           || *rtfTextPtr == '}'  
                     52:           ||  *rtfTextPtr == '\\'  
                     53:           ||  *rtfTextPtr == '\n' ) {
                     54:              *asciiTextPtr++ = *rtfTextPtr++;
                     55:           } else if ( *rtfTextPtr == '\'' ) {
                     56:              int v1, v2, value;
                     57:              rtfTextPtr++;
                     58:              v1 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0') 
                     59:                                         : ((*rtfTextPtr - 'a') + 10);
                     60:              rtfTextPtr++;
                     61:              v2 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0') 
                     62:                                         : ((*rtfTextPtr - 'a') + 10);
                     63:              value = (v1 << 4) | (v2);
                     64:              *asciiTextPtr++ = value;
                     65:              rtfTextPtr++;
                     66:           } else {
                     67:              while ( isalpha( *rtfTextPtr ) ) rtfTextPtr++;
                     68:             if (*rtfTextPtr == '-') rtfTextPtr++;
                     69:             while ( isdigit( *rtfTextPtr ) ) rtfTextPtr++;
                     70:             if ( *rtfTextPtr == ' ' ) rtfTextPtr++;
                     71:             else while (*rtfTextPtr == ' ') rtfTextPtr++;
                     72:           }
                     73:           break;
                     74:         default:
                     75:           *asciiTextPtr++ = *rtfTextPtr++;
                     76:        }       
                     77:    }
                     78:    *asciiTextPtr = ASCII_TERMINATOR;
                     79:    *asciiTextLen = (int)asciiTextPtr - (int)asciiTextBuf;
                     80: #ifdef DEBUG
                     81:    printf("Converting RTF buffer of size %d to ASCII buffer of size %d.\n",
                     82:          rtfTextLen, *asciiTextLen);
                     83: #endif
                     84:    return asciiTextBuf;
                     85: }
                     86: 
                     87: 

unix.superglobalmegacorp.com

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