src/c2html.c

changeset 8
417cd3b29f97
parent 7
02cf8ac736e6
child 9
6b1fba10c4cb
equal deleted inserted replaced
7:02cf8ac736e6 8:417cd3b29f97
157 } 157 }
158 char word[WORDBUF_SIZE]; 158 char word[WORDBUF_SIZE];
159 memset(word, 0, WORDBUF_SIZE); 159 memset(word, 0, WORDBUF_SIZE);
160 size_t wp = 0; 160 size_t wp = 0;
161 int isstring = 0, iscomment = 0; 161 int isstring = 0, iscomment = 0;
162 static int iscommentml;
162 int isescaping = 0; 163 int isescaping = 0;
164
165 if (iscommentml) {
166 iscomment = 1;
167 memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29);
168 dp += 29;
169 }
170 // a fucking /* comment */
171 /* again // / */
163 for (char c = src[sp] ; c ; c=src[++sp]) { 172 for (char c = src[sp] ; c ; c=src[++sp]) {
164 /* comments and strings */ 173 /* comments */
165 if (!isescaping && (c == '\'' || c == '\"')) { 174 if (c == '/') {
166 isstring ^= 1; 175 if (iscommentml && sp > 0 && src[sp-1] == '*') {
167 if (isstring) { 176 iscomment = 0;
168 memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28); 177 iscommentml = 0;
169 dp += 28; 178 memcpy(&(dest[dp]), "/</span>", 8);
170 dp = writeescapedchar(dest, dp, c); 179 dp += 8;
171 } else { 180 continue;
172 dp = writeescapedchar(dest, dp, c); 181 } else if (!iscomment && (src[sp+1] == '/' || src[sp+1] == '*')) {
182 iscomment = 1;
183 iscommentml = (src[sp+1] == '*');
184 memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29);
185 dp += 29;
186 }
187 }
188
189 if (iscomment) {
190 if (c == '\n') {
173 memcpy(&(dest[dp]), "</span>", 7); 191 memcpy(&(dest[dp]), "</span>", 7);
174 dp += 7; 192 dp += 7;
175 } 193 }
194 dp = writeescapedchar(dest, dp, c);
176 } else { 195 } else {
177 if (iscomment || isstring) { 196 /* strings */
178 dp = writeescapedchar(dest, dp, c); 197 if (!isescaping && (c == '\'' || c == '\"')) {
179 } else if (!isalnum(c) && c != '_' && c != '#') { 198 isstring ^= 1;
180 /* interpret word int_t */ 199 if (isstring) {
181 if (wp > 0 && wp < WORDBUF_SIZE) { 200 memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28);
182 int closespan = 1; 201 dp += 28;
183 if (iskeyword(word)) { 202 dp = writeescapedchar(dest, dp, c);
184 memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29); 203 } else {
185 dp += 29; 204 dp = writeescapedchar(dest, dp, c);
186 } else if (istype(word, wp)) { 205 memcpy(&(dest[dp]), "</span>", 7);
187 memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26); 206 dp += 7;
188 dp += 26; 207 }
189 } else if (isdirective(word)) { 208 } else {
190 memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31); 209 if (isstring) {
191 dp += 31; 210 dp = writeescapedchar(dest, dp, c);
211 } else if (!isalnum(c) && c != '_' && c != '#') {
212 /* interpret word int_t */
213 if (wp > 0 && wp < WORDBUF_SIZE) {
214 int closespan = 1;
215 if (iskeyword(word)) {
216 memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29);
217 dp += 29;
218 } else if (istype(word, wp)) {
219 memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26);
220 dp += 26;
221 } else if (isdirective(word)) {
222 memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31);
223 dp += 31;
224 } else {
225 closespan = 0;
226 }
227 for (int i = 0 ; i < wp ; i++) {
228 dp = writeescapedchar(dest, dp, word[i]);
229 }
230 if (closespan) {
231 memcpy(&(dest[dp]), "</span>", 7);
232 dp += 7;
233 }
234 memset(word, 0, WORDBUF_SIZE);
235 wp = 0;
236 }
237 dp = writeescapedchar(dest, dp, c);
238 } else {
239 /* read word */
240 if (wp < WORDBUF_SIZE) {
241 word[wp++] = c;
242 } else if (wp == WORDBUF_SIZE) {
243 for (int i = 0 ; i < WORDBUF_SIZE ; i++) {
244 dp = writeescapedchar(dest, dp, word[i]);
245 }
246 wp++;
247 dp = writeescapedchar(dest, dp, c);
192 } else { 248 } else {
193 closespan = 0; 249 dp = writeescapedchar(dest, dp, c);
194 } 250 }
195 for (int i = 0 ; i < wp ; i++) {
196 dp = writeescapedchar(dest, dp, word[i]);
197 }
198 if (closespan) {
199 memcpy(&(dest[dp]), "</span>", 7);
200 dp += 7;
201 }
202 memset(word, 0, WORDBUF_SIZE);
203 wp = 0;
204 } 251 }
205 dp = writeescapedchar(dest, dp, c); 252 }
206 } else { 253
207 /* read word */ 254 isescaping = !isescaping & (c == '\\');
208 if (wp < WORDBUF_SIZE) { 255 }
209 word[wp++] = c;
210 } else if (wp == WORDBUF_SIZE) {
211 for (int i = 0 ; i < WORDBUF_SIZE ; i++) {
212 dp = writeescapedchar(dest, dp, word[i]);
213 }
214 wp++;
215 dp = writeescapedchar(dest, dp, c);
216 } else {
217 dp = writeescapedchar(dest, dp, c);
218 }
219 }
220 }
221
222 isescaping = !isescaping & (c == '\\');
223 } 256 }
224 dest[dp] = 0; 257 dest[dp] = 0;
225 } 258 }
226 259
227 void printhelp() { 260 void printhelp() {

mercurial