OSDN Git Service

First commit
[asmi-compiler/master.git] / asmi / stream.c
1 #include "asmi.h"\r
2 #include <ctype.h>\r
3 \r
4 static input_stream stream_buf[MAX_STREAM_BUF];\r
5 int stream_buf_top = 0;\r
6 \r
7 // input_stream\82ð\8f\89\8aú\89»\81B\r
8 // stream->parent\82ð\90Ý\92è\82µ\82½\82¢\8fê\8d\87\82Í\81A\82±\82Ì\8aÖ\90\94\82ð\8eÀ\8ds\82µ\82½\8cã\82É\92¼\90Ú\90Ý\92è\82·\82é\81B\r
9 void init_stream(input_stream *stream, char *file) {\r
10 \r
11         FILE *fp;\r
12         unsigned char c[3], m[MAX_PATH + 30];\r
13 \r
14         strcpy(stream->filename, file);\r
15         stream->fp = fp = fopen(file, "r");\r
16         stream->line = 0;\r
17         stream->offset = 0;\r
18         stream->parent = NULL;\r
19         stream->is_linehead = TRUE;\r
20         stream->is_linehead_pre = FALSE;\r
21         stream->char_stack_top = 0;\r
22 \r
23         // \83G\83\89\81[\83`\83F\83b\83N\r
24         if (fp == NULL) {\r
25                 sprintf(m, "\83t\83@\83C\83\8b %s \82ð\8aJ\82¯\82Ü\82¹\82ñ", file);\r
26                 asmi_fatal(m);\r
27         }\r
28 \r
29         // UTF-8 BOM\8dí\8f\9c\8f\88\97\9d (EF, BB, BF)\r
30         c[0] = fgetc(fp);\r
31         c[1] = fgetc(fp);\r
32         c[2] = fgetc(fp);\r
33         if (c[0] != 0xEF || c[1] != 0xBB || c[2] != 0xBF) {\r
34                 ungetc(c[2], fp);\r
35                 ungetc(c[1], fp);\r
36                 ungetc(c[0], fp);\r
37         }\r
38 \r
39 }\r
40 \r
41 BOOL is_space(char c) {\r
42         \r
43         return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';\r
44 \r
45 }\r
46 \r
47 // next_char()\93\99\82Åinput_stream\82ð\90\90¬\82·\82é\8e\9e\82É\8eg\82¤\81B\r
48 input_stream *alloc_input_stream() {\r
49 \r
50         if (stream_buf_top < MAX_STREAM_BUF) {\r
51 \r
52                 return &(stream_buf[stream_buf_top++]);\r
53 \r
54         }\r
55         else {\r
56 \r
57                 asmi_fatal("\90V\82µ\82¢Input Stream\82ð\8am\95Û\82Å\82«\82Ü\82¹\82ñ");\r
58                 return NULL;\r
59 \r
60         }\r
61 \r
62 }\r
63 \r
64 // \8c»\8dÝ\82Ì\83X\83g\83\8a\81[\83\80\82Ì\93à\97e\82ð\88ê\92i\8aK\83v\83b\83V\83\85\82µ\82Ä\81A\90e\82Ì\83X\83g\83\8a\81[\83\80\82Æ\82µ\82Ä\93o\98^\82·\82é\81B\r
65 // \82»\82Ì\8cã\81A\90V\82µ\82¢\83X\83g\83\8a\81[\83\80\82ð\8f\89\8aú\89»\82·\82é\81B\r
66 void push_stream(input_stream *stream, char *file) {\r
67         \r
68         input_stream *new_stream = alloc_input_stream();\r
69         *new_stream = *stream;\r
70         init_stream(stream, file);\r
71         stream->parent = new_stream;\r
72 \r
73 }\r
74 \r
75 // \8c»\8dÝ\82Ì\83X\83g\83\8a\81[\83\80\82ð\95Â\82\81A\93à\97e\82ð\94j\8aü\82µ\82Ä\90e\82Ì\83X\83g\83\8a\81[\83\80\82É\96ß\82é\r
76 void pop_stream(input_stream *stream) {\r
77 \r
78         fclose(stream->fp);\r
79         *stream = *(stream->parent);\r
80 \r
81 }\r
82 \r