src/c2html.c

changeset 1
12c482ea4fc4
parent 0
e78e463e1aa9
child 2
3bced1fe9193
--- 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;
+  }
+}
+

mercurial