|
|
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.