Annotation of GNUtools/cc/rtf2ascii.c, revision 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.