first prototype: creates unformatted output with line numbers

Fri, 24 May 2013 13:35:06 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 24 May 2013 13:35:06 +0200
changeset 1
12c482ea4fc4
parent 0
e78e463e1aa9
child 2
3bced1fe9193

first prototype: creates unformatted output with line numbers

LICENSE file | annotate | diff | comparison | revisions
Makefile file | annotate | diff | comparison | revisions
src/c2html.c file | annotate | diff | comparison | revisions
src/c2html.h file | annotate | diff | comparison | revisions
test/footer.htm file | annotate | diff | comparison | revisions
test/header.htm file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE	Fri May 24 13:35:06 2013 +0200
@@ -0,0 +1,23 @@
+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.
--- a/Makefile	Fri May 24 11:04:56 2013 +0200
+++ b/Makefile	Fri May 24 13:35:06 2013 +0200
@@ -36,6 +36,9 @@
 build:
 	$(MKDIR) build
 	
+test: compile
+	./build/$(BIN) src/c2html.c > build/body.htm
+	cat test/header.htm build/body.htm test/footer.htm > build/code.htm
+	
 clean:
 	$(RM) -f -R build
-
--- a/src/c2html.c	Fri May 24 11:04:56 2013 +0200
+++ b/src/c2html.c	Fri May 24 13:35:06 2013 +0200
@@ -1,4 +1,146 @@
-int main(int argc, char** argv) {
-  return 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.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "c2html.h"
+
+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;
+  
+  return inputfile;
+}
+
+void addline(inputfile_t *inputfile, char* line, size_t width) {
+  char *l = (char*) malloc(width+1);
+  memcpy(l, line, width);
+  l[width] = 0;
+  if (inputfile->count >= inputfile->capacity) {
+    inputfile->capacity <<= 1;
+    inputfile->lines = realloc(inputfile->lines, inputfile->capacity);
+  }
+  inputfile->lines[inputfile->count] = l;
+  inputfile->count++;
+}
+
+void freeinputfilebuffer(inputfile_t *inputfile) {
+  for (int i = 0 ; i < inputfile->count ; i++) {
+    free(inputfile->lines[i]);
+  }
+  free(inputfile->lines);
+  free(inputfile);
 }
 
+inputfile_t *readinput(char *filename) {
+
+  int fd = open(filename, O_RDONLY);
+  if (fd == -1) return NULL;
+  
+  inputfile_t *inputfile = inputfilebuffer(512);
+  
+  const size_t bufsize = 1024;
+  char buf[bufsize];
+  ssize_t r;
+  
+  size_t maxlinewidth = 80;
+  char *line = (char*) malloc(maxlinewidth);
+  size_t col = 0;
+  
+  while ((r = read(fd, buf, bufsize)) > 0) {
+    for (size_t i = 0 ; i < r ; i++) {
+      if (col >= maxlinewidth-4) {
+        maxlinewidth <<= 1;
+        line = realloc(line, maxlinewidth);
+      }
+
+      if (buf[i] == '\n') {
+        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];
+      }
+    }
+  }
+  
+  free(line);
+  
+  close(fd);
+  
+  return inputfile;
+}
+
+void printhelp() {
+  printf("Formats source code using HTML.\n\nUsage:\n"
+      "  c2html [FILE...]"
+      "\n");
+  
+  
+}
+
+int lnw(size_t lnc) {
+  int w = 1, p = 1;
+  while ((p*=10) < lnc) w++;
+  return w;
+}
+
+int main(int argc, char** argv) {
+  
+  if (argc == 1) {
+    printhelp();
+    return 0;
+  } else {
+    
+    inputfile_t *inputfile = readinput(argv[1]);
+    if (inputfile) {
+      printf("<pre>\n");
+      for (int i = 0 ; i < inputfile->count ; i++) {
+        printf("%*d: %s\n", lnw(inputfile->count),
+            i, inputfile->lines[i]);
+      }
+      printf("</pre>\n");
+      freeinputfilebuffer(inputfile);
+    }
+  
+    return 0;
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/c2html.h	Fri May 24 13:35:06 2013 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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 */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/footer.htm	Fri May 24 13:35:06 2013 +0200
@@ -0,0 +1,3 @@
+  </body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/header.htm	Fri May 24 13:35:06 2013 +0200
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>c2html</title>
+  </head>
+  <body>
+

mercurial