src/c2html.c

changeset 45
1f3835182aeb
parent 44
2b4ac35d061d
child 46
534a4ef4143d
     1.1 --- a/src/c2html.c	Tue Aug 23 15:07:29 2016 +0200
     1.2 +++ b/src/c2html.c	Tue Aug 23 15:28:56 2016 +0200
     1.3 @@ -47,10 +47,23 @@
     1.4          "\n");
     1.5  }
     1.6  
     1.7 +/* TODO: remove this workaround after refactoring highlighter structure */
     1.8 +static void plainparseline(char *src, UcxBuffer *dest, highlighter_t* hltr) {
     1.9 +    size_t dp = 0;
    1.10 +    char *buf = dest->space + dest->pos;
    1.11 +    while (*src && *src != '\n') {
    1.12 +        dp = writeescapedchar(buf, dp, *src);
    1.13 +        src++;
    1.14 +    }
    1.15 +    buf[dp++] = '\n';
    1.16 +    buf[dp] = '\0';
    1.17 +    dest->pos += dp;
    1.18 +    dest->size += dp;
    1.19 +}
    1.20 +
    1.21  int formatfile(
    1.22          highlighter_t *highlighter,
    1.23 -        UcxList *in,
    1.24 -        write_func out, void *stream,
    1.25 +        UcxList *in, write_func out, void *stream,
    1.26          int showlineno) {
    1.27      
    1.28      /* compute width of line numbering */
    1.29 @@ -85,23 +98,8 @@
    1.30                      lineno, lineno, lnw, lineno);
    1.31          }
    1.32          
    1.33 -        /* TODO: backwards compatibility: replace line->space in all occasions
    1.34 -         * and use UcxBuffer functions
    1.35 -         */
    1.36 -        char *buf = line->space + line->pos;
    1.37 -        if (highlighter) {
    1.38 -            highlighter->parser(sourceline->data, buf, highlighter);
    1.39 -        } else {
    1.40 -            char *c = sourceline->data;
    1.41 -            size_t dp = 0;
    1.42 -            while (*c && *c != '\n') {
    1.43 -                dp = writeescapedchar(buf, dp, *c);
    1.44 -                c++;
    1.45 -            }
    1.46 -            buf[dp++] = '\n';
    1.47 -            buf[dp] = '\0';
    1.48 -        }
    1.49 -        line->size = strlen(line->space);
    1.50 +        /* process code line */
    1.51 +        highlighter->parser(sourceline->data, line, highlighter);
    1.52          
    1.53          /* write code line */
    1.54          out(line->space, 1, line->size, stream);
    1.55 @@ -115,22 +113,6 @@
    1.56      return 0;
    1.57  }
    1.58  
    1.59 -void init_c_highlighter(highlighter_t *highlighter) {
    1.60 -    memset(highlighter, 0, sizeof(highlighter_t));
    1.61 -    highlighter->isdirective = check_cdirective;
    1.62 -    highlighter->istype = check_ctype;
    1.63 -    highlighter->keywords = ckeywords;
    1.64 -    highlighter->parser = cparseline;
    1.65 -}
    1.66 -
    1.67 -void init_java_highlighter(highlighter_t *highlighter) {
    1.68 -    memset(highlighter, 0, sizeof(highlighter_t));
    1.69 -    highlighter->isdirective = check_jdirective;
    1.70 -    highlighter->istype = check_jtype;
    1.71 -    highlighter->keywords = jkeywords;
    1.72 -    highlighter->parser = jparseline;
    1.73 -}
    1.74 -
    1.75  #define FILEBUF_SIZE 4096
    1.76  
    1.77  enum source_type {
    1.78 @@ -192,17 +174,22 @@
    1.79          return EXIT_FAILURE;
    1.80      } else {
    1.81          /* Configure highlighter */
    1.82 -        highlighter_t highlighter;
    1.83 -        highlighter_t *hptr = &highlighter;
    1.84 +        highlighter_t *highlighter = calloc(1, sizeof(highlighter_t));
    1.85          switch (sourcetype) {
    1.86              case SOURCE_C:
    1.87 -                init_c_highlighter(&highlighter);
    1.88 +                highlighter->isdirective = check_cdirective;
    1.89 +                highlighter->istype = check_ctype;
    1.90 +                highlighter->keywords = ckeywords;
    1.91 +                highlighter->parser = cparseline;
    1.92                  break;
    1.93              case SOURCE_JAVA:
    1.94 -                init_java_highlighter(&highlighter);
    1.95 +                highlighter->isdirective = check_jdirective;
    1.96 +                highlighter->istype = check_jtype;
    1.97 +                highlighter->keywords = jkeywords;
    1.98 +                highlighter->parser = jparseline;
    1.99                  break;
   1.100              case SOURCE_PLAIN:
   1.101 -                hptr = NULL;
   1.102 +                highlighter->parser = plainparseline;
   1.103                  break;
   1.104              default: /* should be unreachable */
   1.105                  fprintf(stderr, "error in enum source_type\n");
   1.106 @@ -268,11 +255,13 @@
   1.107              }
   1.108              
   1.109              formatfile(
   1.110 -                    hptr,
   1.111 +                    highlighter,
   1.112                      inputlines,
   1.113                      (write_func) fwrite,
   1.114                      fout,
   1.115                      settings.showlinenumbers);
   1.116 +            
   1.117 +            free(highlighter);
   1.118              ucx_buffer_free(content);
   1.119          } else {
   1.120              perror("Error opening input file");

mercurial