home *** CD-ROM | disk | FTP | other *** search
-
- // 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;
- }
-
-
-