|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.