+
+#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]), "<", 4);
+ dp += 4;
+ break;
+ case '>':
+ memcpy(&(dest[dp]), ">", 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("\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("%*d: %s\n",
- lnw(inputfile->count), i, inputfile->lines[i]);
+ lnw, i, line);
}
+ free(line);
printf("
\n");
freeinputfilebuffer(inputfile);
}