src/c2html.c

Fri, 24 May 2013 13:53:52 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 24 May 2013 13:53:52 +0200
changeset 2
3bced1fe9193
parent 1
12c482ea4fc4
child 4
323f674931fe
permissions
-rw-r--r--

extra style for line numbers

/*
 * 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("<span class=\"c2html-lineno\">%*d:</span> %s\n",
            lnw(inputfile->count), i, inputfile->lines[i]);
      }
      printf("</pre>\n");
      freeinputfilebuffer(inputfile);
    }
  
    return 0;
  }
}

mercurial