Annotation of libwww/Library/src/HTFormat.c, revision 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