Annotation of libwww/Library/src/HTFormat.c, revision 1.1.1.1
1.1 timbl 1: /* Manage different file formats HTFormat.c
2: ** =============================
3: **
4: ** Bugs:
5: ** Not reentrant.
6: **
7: ** Assumes the incoming stream is ASCII, rather than a local file
8: ** format, and so ALWAYS converts from ASCII on non-ASCII machines.
9: ** Therefore, non-ASCII machines can't read local files.
10: */
11:
12: #include "HTUtils.h"
13: #include "tcp.h"
14: #include "HTFormat.h"
15:
16: #include "HTML.h"
17: #include "HText.h"
18: #include "HTStyle.h"
19:
20: extern HTStyleSheet * styleSheet;
21:
22:
23: PUBLIC BOOL HTOutputSource = NO; /* Flag: shortcut parser to stdout */
24:
25: /* File buffering
26: ** --------------
27: **
28: ** The input file is read using the macro which can read from
29: ** a socket or a file.
30: ** The input buffer size, if large will give greater efficiency and
31: ** release the server faster, and if small will save space on PCs etc.
32: */
33: #define INPUT_BUFFER_SIZE 4096 /* Tradeoff */
34: PRIVATE char input_buffer[INPUT_BUFFER_SIZE];
35: PRIVATE char * input_pointer;
36: PRIVATE char * input_limit;
37: PRIVATE int input_file_number;
38:
39:
40: /* Set up the buffering
41: **
42: ** These routines are public because they are in fact needed by
43: ** many parsers, and on PCs and Macs we should not duplicate
44: ** the static buffer area.
45: */
46: PUBLIC void HTInitInput ARGS1 (int,file_number)
47: {
48: input_file_number = file_number;
49: input_pointer = input_limit = input_buffer;
50: }
51:
52:
53: PUBLIC char HTGetChararcter NOARGS
54: {
55: char ch;
56: do {
57: if (input_pointer >= input_limit) {
58: int status = NETREAD(
59: input_file_number, input_buffer, INPUT_BUFFER_SIZE);
60: if (status <= 0) {
61: if (status == 0) return (char)EOF;
62: if (TRACE) fprintf(stderr,
63: "HTFormat: File read error %d\n", status);
64: return (char)EOF; /* -1 is returned by UCX at end of HTTP link */
65: }
66: input_pointer = input_buffer;
67: input_limit = input_buffer + status;
68: }
69: ch = *input_pointer++;
70: } while (ch == (char) 13); /* Ignore ASCII carriage return */
71:
72: return FROMASCII(ch);
73: }
74:
75: /* Stream the data to an ouput file as binary
76: */
77: PUBLIC int HTOutputBinary ARGS2( int, input,
78: FILE *, output)
79: {
80: do {
81: int status = NETREAD(
82: input, input_buffer, INPUT_BUFFER_SIZE);
83: if (status <= 0) {
84: if (status == 0) return 0;
85: if (TRACE) fprintf(stderr,
86: "HTFormat: File read error %d\n", status);
87: return 2; /* Error */
88: }
89: fwrite(input_buffer, sizeof(char), status, output);
90: } while (YES);
91: }
92:
93:
94:
95: /* Parse a file given format and file number
96: ** ------------
97: **
98: ** This routine is responsible for ceating and presenting any
99: ** graphic (or other) objects described by the file.
100: */
101: PUBLIC void HTParseFormat ARGS3(
102: HTFormat,format,
103: HTParentAnchor *,anchor,
104: int,file_number)
105: {
106:
107: /* Parse the file
108: */
109: if (HTOutputSource) { /* Shortcut dump binary from the net */
110: exit(HTOutputBinary(file_number, stdout)); /* @@@cheat */
111: }
112:
113: #ifdef CURSES
114: long bytecount = 0;
115: #endif
116: HTInitInput(file_number);
117:
118: switch (format) {
119:
120: case WWW_HTML: /* Parse HTML */
121: { /* Call SGML directly for speed */
122: HTML_id html = HTML_new(anchor);
123: HTSGMLContext context = HTML_SGMLContext(html);
124: for(;;) {
125: char character;
126: character = HTGetChararcter();
127: if (character == (char)EOF) break;
128: #ifdef CURSES
129: if (++bytecount % 1024 == 0) prompt_count(bytecount / 1024);
130: #endif
131:
132: SGML_character(context, character);
133: }
134: HTML_free(html);
135: }
136: break;
137:
138: default : /* unknown format -- Parse plain text */
139: {
140: HText * text = HText_new(anchor);
141: HText_setStyle(text, HTStyleNamed(styleSheet, "Example"));
142: HText_beginAppend(text);
143: for(;;) {
144: char character;
145: character = HTGetChararcter();
146: if (character == (char)EOF) break;
147: #ifdef CURSES
148: if (++bytecount % 1024 == 0) prompt_count(bytecount / 1024);
149: #endif
150: HText_appendCharacter(text, character);
151: }
152: HText_endAppend(text);
153: }
154: break;
155:
156: } /* end of switch (format) */
157:
158: }
Webmaster