Subversion Repositories Kolibri OS

Rev

Rev 7746 | Rev 7755 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7746 Rev 7750
Line 1... Line -...
1
enum { TAG, OPTION_VALUE, TEXT, COMMENT, SCRIPT};
-
 
Line -... Line 1...
-
 
1
dword source_buf_start, source_buf_end;
2
 
2
int opened_font=0;
-
 
3
int mode;
-
 
4
 
-
 
5
void SourceBufAdd(dword _mode, src)
3
dword ShowSource()
6
{
4
{
7
	dword font_found_pointer, src_orig = src;
5
	dword new_buf, new_buf_start, i, j;
-
 
6
	int opened_font=0;
-
 
7
	int mode = TEXT;
8
 
8
 
9
	if (_mode) mode = _mode;
-
 
10
 
9
	if (souce_mode) return;
11
	strcpy(source_buf_end, src);
10
	souce_mode = true;
-
 
11
	new_buf = malloc(bufsize*5);
-
 
12
	new_buf_start = new_buf;
-
 
13
	header[strrchr(#header, '-')-2]=0;
-
 
14
	sprintf(new_buf,"Source: %s
",#header);
12
	source_buf_end += strlen(source_buf_end);
15
	new_buf += strlen(new_buf);
-
 
16
	for (i=bufpointer; i
13
 
17
	{
-
 
18
		switch (ESBYTE[i])
-
 
19
		{
-
 
20
			case '<':
14
	if (font_found_pointer = strstr(src, "")) {
21
				if (mode == TEXT) && (!strncmp(i+1,"script", 6)) {
-
 
22
					mode = SCRIPT;
-
 
23
					strcpy(new_buf, "<script"); opened_font++;
15
		opened_font--;
24
					new_buf+=54;
-
 
25
					i+=6;
-
 
26
					break;
-
 
27
				}
-
 
28
				if (mode == COMMENT) || (mode == SCRIPT) && (!strncmp(i+1,"/script>", 8)) {
-
 
29
					mode = TEXT;
16
		src = font_found_pointer+2;
30
					while (opened_font) {
-
 
31
						strcpy(new_buf, ""); opened_font--;
-
 
32
						new_buf+=7;						
-
 
33
					}
-
 
34
					strcpy(new_buf, "</script>"); 
-
 
35
					new_buf+=39;
-
 
36
					i+=8;
-
 
37
					break;
17
	}
38
				}
-
 
39
				if (ESBYTE[i+1]=='!') && (ESBYTE[i+2]=='-') && (ESBYTE[i+3]=='-') {
-
 
40
					mode = COMMENT;
-
 
41
					strcpy(new_buf, "<"); opened_font++;
-
 
42
					new_buf+=21;
-
 
43
					break;
18
 
44
				}
-
 
45
				if (mode == TEXT) {
19
	src = src_orig;
46
					mode = TAG;
-
 
47
					strcpy(new_buf, "<"); opened_font++;
-
 
48
					new_buf+=21;
-
 
49
					break;
-
 
50
				}
20
	if (font_found_pointer = strstr(src, "
51
				if (mode == COMMENT) || (mode == SCRIPT) {
-
 
52
					strcpy(new_buf, "<");
21
		opened_font++;
53
					new_buf+=4;
-
 
54
					break;
-
 
55
				}
-
 
56
				break;
-
 
57
			case '>':
-
 
58
				if (mode == OPTION_VALUE) { //fix non-closed quote in TAG
-
 
59
					mode = TEXT;
22
		src = font_found_pointer+2;
60
					while (opened_font) {
-
 
61
						strcpy(new_buf, """); opened_font--;
-
 
62
						new_buf+=13;						
-
 
63
					}
-
 
64
					break;
-
 
65
				}
-
 
66
				if (mode == COMMENT) && (ESBYTE[i-1]=='-') && (ESBYTE[i-2]=='-') {
-
 
67
					mode = TEXT;
-
 
68
					strcpy(new_buf, ">"); opened_font--;
-
 
69
					new_buf+=11;
-
 
70
					break;
-
 
71
				}
-
 
72
				if (mode == COMMENT) || (mode == SCRIPT) {
-
 
73
					strcpy(new_buf, ">");
-
 
74
					new_buf+=4;
-
 
75
					break;					
-
 
76
				}
-
 
77
				if (mode == TAG) {
-
 
78
					mode = TEXT;
-
 
79
					strcpy(new_buf, ">"); opened_font--;
-
 
80
					new_buf+=11;
-
 
81
					break;
-
 
82
				}
-
 
83
				break;
-
 
84
			case '\"':
-
 
85
			case '\'':
-
 
86
				if (mode == TAG) {
-
 
87
					mode = OPTION_VALUE;
-
 
88
					strcpy(new_buf, "'"); opened_font++;
-
 
89
					new_buf+=25;
-
 
90
					break;
-
 
91
				}
-
 
92
				if (mode == OPTION_VALUE) {
-
 
93
					mode = TAG;
-
 
94
					strcpy(new_buf, "'"); opened_font--;
-
 
95
					new_buf+=12;
-
 
96
					break;
-
 
97
				}
-
 
98
			default:
-
 
99
				ESBYTE[new_buf] = ESBYTE[i];
-
 
100
				new_buf++;
-
 
101
		}
23
	}
102
	}
-
 
103
	ESBYTE[new_buf] = 0;
-
 
104
	bufsize = new_buf - new_buf_start;
-
 
105
	free(bufpointer);
-
 
106
	bufpointer = new_buf_start;
24
}
Line -... Line 25...
-
 
25
 
-
 
26
void CloseAllOpenedFonts(dword _mode)
-
 
27
{
107
}
28
	while (opened_font) SourceBufAdd(_mode, "");
Line 108... Line 29...
108
 
29
}
-
 
30
 
-
 
31
enum { TAG=1, VALUE, TEXT, COMMENT, SCRIPT};
-
 
32
dword ShowSource()
-
 
33
{
Line 109... Line -...
109
/*
-
 
110
 
-
 
111
enum { TAG, OPTION_VALUE, TEXT, COMMENT, INLINE_COMMENT, CODE };
-
 
112
 
-
 
113
char* C_HL_keywords[] = {
-
 
114
    "switch", "if", "while", "for", "break", "continue", "return", "else",
34
	dword i, j;
115
    "union", "typedef", "static", "class", "case", "#include",
-
 
116
    "volatile", "register", "sizeof", "typedef", "union", "goto", "const", "auto",
35
	bool activate_script_mode = false;
117
    "#define", "#endif", "#error", "#ifdef", "#ifndef", "#undef", "#if", "#else", 
-
 
118
    "inline", 
36
 
119
 
-
 
Line 120... Line 37...
120
    "int ", "dword ", "long ", "double ", "float ", "char ", "unsigned ", "signed ",
37
	opened_font=0;
121
    "void ", "bool ", "enum ", "byte ", "word ", "struct ", "NULL", "loop", "stdcall ",
-
 
122
    ":void ", ":int ", ":bool ", ":dword ", NULL
38
	source_buf_start = source_buf_end = malloc(bufsize*5);
123
};
39
	header[strrchr(#header, '-')-2]=0;
Line 124... Line -...
124
 
-
 
125
dword ShowCodeSource()
-
 
126
{
-
 
127
	dword new_buf, new_buf_start, i;
-
 
128
	int mode = CODE;
-
 
129
 
-
 
130
	char spstr[64];
-
 
131
	dword keylen;
-
 
132
	dword keyn;
-
 
133
	dword keycolor;
40
 
134
 
41
	SourceBufAdd(TEXT, "Source: ");</pre></td>
          </tr>
          <tr>
            <td class="lineno">135</td>
            <td class="diffdeleted"><pre>	new_buf = malloc(bufsize*10);</pre></td>
            <td class="lineno">-</td>
            <td class="diffempty"><pre> </pre></td>
          </tr>
          <tr>
            <td class="lineno">136</td>
            <td class="diffdeleted"><pre>	new_buf_start = new_buf;</pre></td>
            <td class="lineno">-</td>
            <td class="diffempty"><pre> </pre></td>
          </tr>
          <tr>
            <td class="lineno">137</td>
            <td class="diffdeleted"><pre>	sprintf(new_buf,"<html><head><title>C/C++/C-- source: %s
",#URL);
-
 
138
	new_buf += strlen(new_buf);
42
	SourceBufAdd(TEXT, #header);
139
	for (i=bufpointer; i
-
 
140
	{
-
 
141
		if ('<' == ESBYTE[i]) {
-
 
142
			strcpy(new_buf, "<");
-
 
143
			new_buf+=4;
-
 
144
			continue;
-
 
145
		}
43
	SourceBufAdd(TEXT, "
");
146
		if ('>' == ESBYTE[i]) {
44
 
147
			strcpy(new_buf, ">");
45
	for (i=bufpointer; i
148
			new_buf+=4;
-
 
149
			continue;
46
	{
150
		}
47
		case '<':
151
		if (ESBYTE[i] >= '0') && (ESBYTE[i] <= '9') && (CODE == mode) {
-
 
152
			strcpy(new_buf, "?");
48
			if (!strncmp(i+1,"!--", 3)) SourceBufAdd(COMMENT, "<");
-
 
49
			else if (SCRIPT == mode) {
153
			ESBYTE[new_buf+20] = ESBYTE[i];
50
				if (!strncmp(i+1,"/script>", 8)) {
154
			new_buf+=28;
-
 
155
			if (ESBYTE[i+1] == 'x') {
-
 
156
				strcpy(new_buf, "x");
-
 
157
				new_buf+=28;
-
 
158
				i++;
-
 
159
			}
-
 
160
			continue;
-
 
161
		}
-
 
162
 
-
 
163
		if (CODE == mode) && ('\"' == ESBYTE[i]) {
-
 
164
			mode = TEXT;
-
 
165
			strcpy(new_buf, "\"");
-
 
166
			new_buf+=18;
-
 
167
			continue;
-
 
168
		}
-
 
169
		if (TEXT == mode) && ('\"' == ESBYTE[i]) {
-
 
170
			mode = CODE;
-
 
171
			strcpy(new_buf, "\"");
-
 
172
			new_buf+=8;
-
 
173
			continue;		
-
 
174
		}
-
 
175
 
-
 
176
		if (! strncmp(i, "//", 2) ) && (mode == CODE) {
-
 
177
			mode = INLINE_COMMENT;
-
 
178
			strcpy(new_buf, "//");
51
					CloseAllOpenedFonts(NULL);
179
			new_buf+=19;
-
 
180
			i++;
-
 
181
			continue;
52
					SourceBufAdd(TAG, "<");
182
		}
-
 
183
 
-
 
184
		if (INLINE_COMMENT == mode) {
53
				}
185
			if (13 == ESBYTE[i]) {
-
 
186
				mode = CODE;
-
 
187
				strcpy(new_buf, "\13");
54
				else SourceBufAdd(NULL, "<");
188
				new_buf+=8;
55
			}
189
				continue;				
56
			else if (COMMENT == mode) {
190
			}
-
 
191
		}
57
				SourceBufAdd(NULL, "<");
192
 
58
			}
193
		if (! strncmp(i, "/*", 2) ) {
59
			else if (TEXT == mode) {
194
			mode = COMMENT;
60
				if (!strncmp(i+1,"script", 6)) activate_script_mode = true;
195
			strcpy(new_buf, "/*");
61
				SourceBufAdd(TAG, "<");
196
			new_buf+=19;
62
			}
197
			i++;
-
 
198
			continue;
-
 
199
		}
-
 
200
		if (! strncmp(i, "*/", 2) ) {
63
			break;
201
			mode = CODE;
-
 
202
			strcpy(new_buf, "*/");
64
		case '>':
203
			new_buf+=9;
-
 
204
			i++;
-
 
205
			continue;
65
			if (TAG == mode) && (activate_script_mode) {
206
		}
-
 
207
 
-
 
208
		if (CODE == mode) for (keyn=0; C_HL_keywords[keyn]!=NULL; keyn++) 
-
 
209
		{
66
				activate_script_mode = false;
210
			keylen = strlen(C_HL_keywords[keyn]);
-
 
211
			if (! strncmp(i, C_HL_keywords[keyn], keylen) ) {
67
				SourceBufAdd(SCRIPT, ">");
212
 
-
 
213
				if (keyn<31) keycolor="#f00"; else keycolor="#00f";
-
 
214
				sprintf(#spstr, "%s", keycolor, C_HL_keywords[keyn]);
68
			}
-
 
69
			else if (VALUE == mode) CloseAllOpenedFonts(TEXT);
-
 
70
			else if (COMMENT == mode) && (!strncmp(i-2,"--", 2)) {
215
				strcpy(new_buf, #spstr);
71
				SourceBufAdd(TEXT, ">");
-
 
72
				CloseAllOpenedFonts(TEXT);
216
 
73
			}
217
				new_buf += keylen + 24;
74
			else if (COMMENT == mode) || (SCRIPT == mode) SourceBufAdd(NULL, ">");
218
				i += keylen-1;
75
			else if (TAG == mode) SourceBufAdd(TEXT, ">");
-
 
76
			break;
-
 
77
		case '&':
-
 
78
			SourceBufAdd(NULL, "&");
-
 
79
			break;
-
 
80
		case '\"':
-
 
81
		case '\'':
-
 
82
			if (TAG == mode) SourceBufAdd(VALUE, "'");
-
 
83
			else if (VALUE == mode) SourceBufAdd(TAG, "'");
219
				goto _CONTINUE;
84
			else SourceBufAdd(NULL, "'");
220
			}
85
			break;
221
		}
86
		default:
222
		ESBYTE[new_buf] = ESBYTE[i];
87
			ESBYTE[source_buf_end] = ESBYTE[i];
223
		new_buf++;
88
			source_buf_end++;
224
		_CONTINUE:		
89
	}
225
	}
-
 
226
	ESBYTE[new_buf] = 0;
90
	ESBYTE[source_buf_end] = 0;