Lines Matching refs:stream

43 struct stream *input_streams;
58 const char *stream_name(int stream)
60 if (stream < 0 || stream > input_stream_nr)
61 return "<bad stream>";
62 return input_streams[stream].name;
65 int stream_prev(int stream)
67 if (stream < 0 || stream > input_stream_nr)
69 stream = input_streams[stream].pos.stream;
70 if (stream > input_stream_nr)
72 return stream;
75 static struct position stream_pos(stream_t *stream)
79 pos.stream = stream->nr;
80 pos.newline = stream->newline;
81 pos.whitespace = stream->whitespace;
82 pos.pos = stream->pos;
83 pos.line = stream->line;
232 sprintf(buffer, "<beginning of '%s'>", stream_name(token->pos.stream));
236 sprintf(buffer, "<end of '%s'>", stream_name(token->pos.stream));
315 int stream = input_stream_nr, *hash;
316 struct stream *current;
318 if (stream >= input_streams_allocated) {
319 int newalloc = stream * 4 / 3 + 10;
320 input_streams = realloc(input_streams, newalloc * sizeof(struct stream));
325 current = input_streams + stream;
335 current->pos.stream = -1;
336 input_stream_nr = stream+1;
339 *hash = stream;
340 return stream;
343 static struct token * alloc_token(stream_t *stream)
346 token->pos = stream_pos(stream);
354 static int nextchar_slow(stream_t *stream)
356 int offset = stream->offset;
357 int size = stream->size;
366 if (stream->fd < 0)
368 size = read(stream->fd, stream->buffer, BUFSIZE);
371 stream->size = size;
372 stream->offset = offset = 0;
375 c = stream->buffer[offset++];
388 stream->pos += tabstop - stream->pos % tabstop;
391 stream->line++;
392 stream->pos = 0;
393 stream->newline = 1;
397 stream->pos++;
400 stream->pos++;
404 stream->line++;
405 stream->pos = 0;
413 stream->offset = offset;
428 if (stream->pos & Wnewline_eof)
429 warning(stream_pos(stream), "no newline at end of file");
431 warning(stream_pos(stream), "backslash-newline at end of file");
440 static inline int nextchar(stream_t *stream)
442 int offset = stream->offset;
444 if (offset < stream->size) {
445 int c = stream->buffer[offset++];
450 stream->offset = offset;
451 stream->pos++;
455 return nextchar_slow(stream);
460 static struct token *mark_eof(stream_t *stream)
464 end = alloc_token(stream);
473 *stream->tokenlist = end;
474 stream->tokenlist = NULL;
478 static void add_token(stream_t *stream)
480 struct token *token = stream->token;
482 stream->token = NULL;
484 *stream->tokenlist = token;
485 stream->tokenlist = &token->next;
488 static void drop_token(stream_t *stream)
490 stream->newline |= stream->token->pos.newline;
491 stream->whitespace |= stream->token->pos.whitespace;
492 stream->token = NULL;
545 static int get_one_number(int c, int next, stream_t *stream)
558 next = nextchar(stream);
563 next = nextchar(stream);
569 sparse_error(stream_pos(stream), "number token exceeds %td characters",
577 token = stream->token;
580 add_token(stream);
585 static int eat_string(int next, stream_t *stream, enum token_type type)
589 struct token *token = stream->token;
595 for (escape = 0; escape || next != delim; next = nextchar(stream)) {
600 warning(stream_pos(stream),
606 warning(stream_pos(stream),
612 warning(stream_pos(stream),
622 warning(stream_pos(stream),
625 warning(stream_pos(stream), "string too long (%d bytes, %d bytes max)", len, MAX_STRING);
642 token = stream->token;
643 add_token(stream);
644 return nextchar(stream);
647 static int drop_stream_eoln(stream_t *stream)
649 drop_token(stream);
651 switch (nextchar(stream)) {
655 return nextchar(stream);
660 static int drop_stream_comment(stream_t *stream)
664 drop_token(stream);
665 newline = stream->newline;
667 next = nextchar(stream);
671 warning(stream_pos(stream), "End of file in the middle of a comment");
674 next = nextchar(stream);
678 stream->newline = newline;
679 return nextchar(stream);
744 static int get_one_special(int c, stream_t *stream)
749 next = nextchar(stream);
757 return get_one_number(c, next, stream);
760 return eat_string(next, stream, TOKEN_STRING);
762 return eat_string(next, stream, TOKEN_CHAR);
765 return drop_stream_eoln(stream);
767 return drop_stream_comment(stream);
778 next = nextchar(stream);
782 next = nextchar(stream);
788 token = stream->token;
791 add_token(stream);
904 struct token *built_in_token(int stream, struct ident *ident)
909 token->pos.stream = stream;
915 static int get_one_identifier(int c, stream_t *stream)
927 next = nextchar(stream);
939 return eat_string(nextchar(stream), stream,
942 return eat_string(nextchar(stream), stream,
950 token = stream->token;
953 add_token(stream);
957 static int get_one_token(int c, stream_t *stream)
961 return get_one_number(c, nextchar(stream), stream);
963 return get_one_identifier(c, stream);
964 return get_one_special(c, stream);
967 static struct token *setup_stream(stream_t *stream, int idx, int fd,
972 stream->nr = idx;
973 stream->line = 1;
974 stream->newline = 1;
975 stream->whitespace = 0;
976 stream->pos = 0;
978 stream->token = NULL;
979 stream->fd = fd;
980 stream->offset = 0;
981 stream->size = buf_size;
982 stream->buffer = buf;
984 begin = alloc_token(stream);
986 stream->tokenlist = &begin->next;
990 static struct token *tokenize_stream(stream_t *stream)
992 int c = nextchar(stream);
995 struct token *token = alloc_token(stream);
996 stream->token = token;
997 stream->newline = 0;
998 stream->whitespace = 0;
999 c = get_one_token(c, stream);
1002 stream->whitespace = 1;
1003 c = nextchar(stream);
1005 return mark_eof(stream);
1010 stream_t stream;
1013 begin = setup_stream(&stream, 0, -1, buffer, size);
1014 *endtoken = tokenize_stream(&stream);
1021 stream_t stream;
1031 begin = setup_stream(&stream, idx, fd, buffer, 0);
1032 end = tokenize_stream(&stream);