introduced parser

Wed, 12 Jun 2013 13:40:23 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 12 Jun 2013 13:40:23 +0200
changeset 4
323f674931fe
parent 3
b7a6d546bd1d
child 5
412f1896874b

introduced parser

src/c2html.c file | annotate | diff | comparison | revisions
src/c2html.h file | annotate | diff | comparison | revisions
--- a/src/c2html.c	Fri May 24 13:57:51 2013 +0200
+++ b/src/c2html.c	Wed Jun 12 13:40:23 2013 +0200
@@ -32,13 +32,24 @@
 #include <string.h>
 #include <fcntl.h>
 #include <unistd.h>
-#include "c2html.h"
+#include <ctype.h>
+
+#define INPUTBUF_SIZE 2048
+
+
+typedef struct {
+  size_t count;
+  size_t capacity;
+  size_t maxlinewidth;
+  char** lines;
+} inputfile_t;
 
 inputfile_t *inputfilebuffer(size_t capacity) {
   inputfile_t *inputfile = (inputfile_t*) malloc(sizeof(inputfile_t));
   inputfile->lines = (char**) malloc(capacity * sizeof(char*));
   inputfile->capacity = capacity;
   inputfile->count = 0;
+  inputfile->maxlinewidth = 0;
   
   return inputfile;
 }
@@ -52,6 +63,8 @@
     inputfile->lines = realloc(inputfile->lines, inputfile->capacity);
   }
   inputfile->lines[inputfile->count] = l;
+  inputfile->maxlinewidth =
+          width > inputfile->maxlinewidth ? width : inputfile->maxlinewidth;
   inputfile->count++;
 }
 
@@ -70,15 +83,14 @@
   
   inputfile_t *inputfile = inputfilebuffer(512);
   
-  const size_t bufsize = 1024;
-  char buf[bufsize];
+  char buf[INPUTBUF_SIZE];
   ssize_t r;
   
-  size_t maxlinewidth = 80;
+  size_t maxlinewidth = 256;
   char *line = (char*) malloc(maxlinewidth);
   size_t col = 0;
   
-  while ((r = read(fd, buf, bufsize)) > 0) {
+  while ((r = read(fd, buf, INPUTBUF_SIZE)) > 0) {
     for (size_t i = 0 ; i < r ; i++) {
       if (col >= maxlinewidth-4) {
         maxlinewidth <<= 1;
@@ -89,12 +101,6 @@
         line[col] = 0;
         addline(inputfile, line, col);        
         col = 0;
-      } else if (buf[i] == '<') {
-        line[col++] = '&'; line[col++] = 'l';
-        line[col++] = 't'; line[col++] = ';';
-      } else if (buf[i] == '>') {
-        line[col++] = '&'; line[col++] = 'g';
-        line[col++] = 't'; line[col++] = ';';
       } else {
         line[col++] = buf[i];
       }
@@ -108,6 +114,29 @@
   return inputfile;
 }
 
+void parseline(char *src, char *dest) {
+  size_t sp = 0, dp = 0;
+  /* indent */
+  while (isspace(src[sp])) {
+    dest[dp++] = src[sp++];
+  }
+  for (char c = src[sp] ; c ; c=src[++sp]) {
+    switch (c) {
+      case '<':
+        memcpy(&(dest[dp]), "&lt;", 4);
+        dp += 4;
+        break;
+      case '>':
+        memcpy(&(dest[dp]), "&gt;", 4);
+        dp += 4;
+        break;
+      default:
+        dest[dp++] = c;
+    }
+  }
+  dest[dp] = 0;
+}
+
 void printhelp() {
   printf("Formats source code using HTML.\n\nUsage:\n"
       "  c2html [FILE...]"
@@ -116,7 +145,7 @@
   
 }
 
-int lnw(size_t lnc) {
+int lnint(size_t lnc) {
   int w = 1, p = 1;
   while ((p*=10) < lnc) w++;
   return w;
@@ -132,10 +161,14 @@
     inputfile_t *inputfile = readinput(argv[1]);
     if (inputfile) {
       printf("<pre>\n");
+      char *line = (char*) malloc(inputfile->maxlinewidth*64);
+      int lnw = lnint(inputfile->count);
       for (int i = 0 ; i < inputfile->count ; i++) {
+        parseline(inputfile->lines[i], line);
         printf("<span class=\"c2html-lineno\">%*d:</span> %s\n",
-            lnw(inputfile->count), i, inputfile->lines[i]);
+            lnw, i, line);
       }
+      free(line);
       printf("</pre>\n");
       freeinputfilebuffer(inputfile);
     }
--- a/src/c2html.h	Fri May 24 13:57:51 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2013 Mike Becker. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-
-#ifndef C2HTML_H
-#define	C2HTML_H
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-  typedef struct {
-    size_t count;
-    size_t capacity;
-    char** lines;
-  } inputfile_t;
-  
-inputfile_t *inputfilebuffer(size_t capacity);
-void addline(inputfile_t *inputfile, char* line, size_t width);
-void freeinputfilebuffer(inputfile_t *inputfile);
-
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* C2HTML_H */
-

mercurial