highlighter now use the UcxBuffer API for writing to the destination buffer

Tue, 23 Aug 2016 17:24:58 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 23 Aug 2016 17:24:58 +0200
changeset 48
b2724c711203
parent 47
c39ecbbca7c0
child 49
f86f0b054464

highlighter now use the UcxBuffer API for writing to the destination buffer

src/c2html.c file | annotate | diff | comparison | revisions
src/ccodegen.c file | annotate | diff | comparison | revisions
src/ccodegen.h file | annotate | diff | comparison | revisions
src/codegens.c file | annotate | diff | comparison | revisions
src/codegens.h file | annotate | diff | comparison | revisions
src/javacodegen.c file | annotate | diff | comparison | revisions
src/javacodegen.h file | annotate | diff | comparison | revisions
     1.1 --- a/src/c2html.c	Tue Aug 23 16:34:02 2016 +0200
     1.2 +++ b/src/c2html.c	Tue Aug 23 17:24:58 2016 +0200
     1.3 @@ -47,18 +47,12 @@
     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, int* x) {
     1.9 -    size_t dp = 0;
    1.10 -    char *buf = dest->space + dest->pos;
    1.11 +static void plain_highlighter(char *src, UcxBuffer *dest, int* x) {
    1.12      while (*src && *src != '\n') {
    1.13 -        dp = writeescapedchar(buf, dp, *src);
    1.14 +        put_htmlescaped(dest, *src);
    1.15          src++;
    1.16      }
    1.17 -    buf[dp++] = '\n';
    1.18 -    buf[dp] = '\0';
    1.19 -    dest->pos += dp;
    1.20 -    dest->size += dp;
    1.21 +    ucx_buffer_putc(dest, '\n');
    1.22  }
    1.23  
    1.24  int formatlines(highlighter_func highlighter,
    1.25 @@ -101,7 +95,7 @@
    1.26          /* process code line */
    1.27          highlighter(sourceline->data, line, &multiline_comment);
    1.28          
    1.29 -        /* write code line */
    1.30 +        /* write code line and reset buffer */
    1.31          out(line->space, 1, line->size, stream);
    1.32      }
    1.33      
    1.34 @@ -177,13 +171,13 @@
    1.35          highlighter_func hltr = NULL;
    1.36          switch (sourcetype) {
    1.37              case SOURCE_C:
    1.38 -                hltr = cparseline;
    1.39 +                hltr = c_highlighter;
    1.40                  break;
    1.41              case SOURCE_JAVA:
    1.42 -                hltr = jparseline;
    1.43 +                hltr = java_highlighter;
    1.44                  break;
    1.45              case SOURCE_PLAIN:
    1.46 -                hltr = plainparseline;
    1.47 +                hltr = plain_highlighter;
    1.48                  break;
    1.49              default: /* should be unreachable */
    1.50                  fprintf(stderr, "error in enum source_type\n");
     2.1 --- a/src/ccodegen.c	Tue Aug 23 16:34:02 2016 +0200
     2.2 +++ b/src/ccodegen.c	Tue Aug 23 17:24:58 2016 +0200
     2.3 @@ -28,6 +28,7 @@
     2.4   */
     2.5  
     2.6  #include "ccodegen.h"
     2.7 +#include "ucx/utils.h"
     2.8  #include <string.h>
     2.9  #include <ctype.h>
    2.10  
    2.11 @@ -39,13 +40,7 @@
    2.12      "while", NULL
    2.13  };
    2.14  
    2.15 -#define memcpy_const(darr,doff,str) memcpy(&(darr[doff]), str, sizeof(str)-1); \
    2.16 -                                    dp += sizeof(str)-1
    2.17 -
    2.18 -void cparseline(char *src, UcxBuffer *destbuf, int *multiline_comment) {
    2.19 -    /* TODO: workaround for using old code with UcxBuffer */
    2.20 -    char *dest = destbuf->space + destbuf->pos;
    2.21 -
    2.22 +void c_highlighter(char *src, UcxBuffer *dest, int *multiline_comment) {
    2.23      /* TODO: try to replace these buffers */
    2.24      char wordbuf[WORDBUF_SIZE];
    2.25      sstr_t word;
    2.26 @@ -56,7 +51,7 @@
    2.27      includefile.ptr = includefilebuf;
    2.28      includefile.length = 0;
    2.29      
    2.30 -    size_t sp = (size_t)-1, dp = 0;
    2.31 +    size_t sp = (size_t)-1;
    2.32      int isstring = 0, iscomment = 0, isinclude = 0, parseinclude = 0;
    2.33      char quote = '\0';
    2.34      int isescaping = 0;
    2.35 @@ -64,7 +59,7 @@
    2.36      /* continue a multi line comment highlighting */
    2.37      if (*multiline_comment) {
    2.38          iscomment = 1;
    2.39 -        memcpy_const(dest, dp, "<span class=\"c2html-comment\">");
    2.40 +        ucx_buffer_puts(dest, "<span class=\"c2html-comment\">");
    2.41      }
    2.42  
    2.43      char c;
    2.44 @@ -77,113 +72,103 @@
    2.45              if (*multiline_comment && sp > 0 && src[sp-1] == '*') {
    2.46                  iscomment = 0;
    2.47                  *multiline_comment = 0;
    2.48 -                memcpy_const(dest, dp, "/</span>");
    2.49 +                ucx_buffer_puts(dest, "/</span>");
    2.50                  continue;
    2.51              } else if (!iscomment && (src[sp+1] == '/' || src[sp+1] == '*')) {
    2.52                  iscomment = 1;
    2.53                  *multiline_comment = (src[sp+1] == '*');
    2.54 -                memcpy_const(dest, dp, "<span class=\"c2html-comment\">");
    2.55 +                ucx_buffer_puts(dest, "<span class=\"c2html-comment\">");
    2.56              }
    2.57          }
    2.58  
    2.59          if (iscomment) {
    2.60              if (c == '\n') {
    2.61 -                memcpy_const(dest, dp,  "</span>");
    2.62 +                ucx_buffer_puts(dest, "</span>\n");
    2.63 +            } else {
    2.64 +                put_htmlescaped(dest, c);
    2.65              }
    2.66 -            dp = writeescapedchar(dest, dp, c);
    2.67          } else if (isinclude) {
    2.68              if (c == '<') {
    2.69 -                memcpy_const(dest, dp, "<span class=\"c2html-stdinclude\">");
    2.70 -                dp = writeescapedchar(dest, dp, c);
    2.71 +                ucx_buffer_puts(dest,
    2.72 +                        "<span class=\"c2html-stdinclude\">&lt;");
    2.73              } else if (c == '\"') {
    2.74                  if (parseinclude) {
    2.75 -                    dest[dp++] = '\"';
    2.76 -                    dest[dp++] = '>';
    2.77 -                    memcpy(&(dest[dp]), includefile.ptr, includefile.length);
    2.78 -                    dp += includefile.length;
    2.79 -
    2.80 -                    dp = writeescapedchar(dest, dp, c);
    2.81 -                    memcpy_const(dest, dp, "</a>");
    2.82 +                    ucx_bprintf(dest, "\">%.*s\"</a>",
    2.83 +                            includefile.length, includefile.ptr);
    2.84                      parseinclude = 0;
    2.85                  } else {
    2.86 -                    memcpy_const(dest, dp,
    2.87 -                        "<a class=\"c2html-userinclude\" href=");
    2.88 -                    dp = writeescapedchar(dest, dp, c);
    2.89 +                    ucx_buffer_puts(dest,
    2.90 +                            "<a class=\"c2html-userinclude\" href=\"");
    2.91                      includefile.length = 0;
    2.92                      includefile.ptr[includefile.length++] = '\"';
    2.93                      parseinclude = 1;
    2.94                  }
    2.95              } else if (c == '>') {
    2.96 -                dp = writeescapedchar(dest, dp, c);
    2.97 -                memcpy_const(dest, dp, "</span>");
    2.98 +                ucx_buffer_puts(dest,  "&gt;</span>");
    2.99              } else {
   2.100                  if (parseinclude) {
   2.101                      includefile.ptr[includefile.length++] = c;
   2.102                  }
   2.103 -                dp = writeescapedchar(dest, dp, c);
   2.104 +                put_htmlescaped(dest, c);
   2.105              }
   2.106          } else {
   2.107              /* strings */
   2.108              if (!isescaping && (c == '\'' || c == '\"')) {
   2.109                  if (isstring) {
   2.110 -                    dp = writeescapedchar(dest, dp, c);
   2.111 +                    put_htmlescaped(dest, c);
   2.112                      if (c == quote) {
   2.113                          isstring = 0;
   2.114 -                        memcpy_const(dest, dp, "</span>");
   2.115 +                        ucx_buffer_puts(dest, "</span>");
   2.116                      } else {
   2.117 -                        dp = writeescapedchar(dest, dp, c);
   2.118 +                        put_htmlescaped(dest, c);
   2.119                      }
   2.120                  } else {
   2.121                      isstring = 1;
   2.122                      quote = c;
   2.123 -                    memcpy_const(dest, dp,
   2.124 -                        "<span class=\"c2html-string\">");
   2.125 -                    dp = writeescapedchar(dest, dp, c);
   2.126 +                    ucx_buffer_puts(dest, "<span class=\"c2html-string\">");
   2.127 +                    put_htmlescaped(dest, c);
   2.128                  }
   2.129              } else {
   2.130                  if (isstring) {
   2.131 -                    dp = writeescapedchar(dest, dp, c);
   2.132 -                } else if (!iswordcharacter(c)) {
   2.133 +                    put_htmlescaped(dest, c);
   2.134 +                } else if (!check_alnumex(c)) {
   2.135                      if (word.length > 0 && word.length < WORDBUF_SIZE) {
   2.136                          int closespan = 1;
   2.137                          sstr_t typesuffix = ST("_t");
   2.138                          if (check_keyword(word, ckeywords)) {
   2.139 -                            memcpy_const(dest, dp, 
   2.140 -                                "<span class=\"c2html-keyword\">");
   2.141 +                            ucx_buffer_puts(dest,
   2.142 +                                    "<span class=\"c2html-keyword\">");
   2.143                          } else if (sstrsuffix(word, typesuffix)) {
   2.144 -                            memcpy_const(dest, dp, 
   2.145 +                            ucx_buffer_puts(dest,
   2.146                                  "<span class=\"c2html-type\">");
   2.147                          } else if (word.ptr[0] == '#') {
   2.148                              isinclude = !sstrcmp(word, S("#include"));
   2.149 -                            memcpy_const(dest, dp, 
   2.150 +                            ucx_buffer_puts(dest,
   2.151                                  "<span class=\"c2html-directive\">");
   2.152                          } else if (check_capsonly(word)) {
   2.153 -                            memcpy_const(dest, dp, 
   2.154 +                            ucx_buffer_puts(dest,
   2.155                                  "<span class=\"c2html-macroconst\">");
   2.156                          } else {
   2.157                              closespan = 0;
   2.158                          }
   2.159 -                        for (int i = 0 ; i < word.length ; i++) {
   2.160 -                            dp = writeescapedchar(dest, dp, word.ptr[i]);
   2.161 -                        }
   2.162 +                        put_htmlescapedstr(dest, word);
   2.163                          if (closespan) {
   2.164 -                            memcpy_const(dest, dp, "</span>");
   2.165 +                            ucx_buffer_puts(dest, "</span>");
   2.166                          }
   2.167                      }
   2.168                      word.length = 0;
   2.169 -                    dp = writeescapedchar(dest, dp, c);
   2.170 +                    put_htmlescaped(dest, c);
   2.171                  } else {
   2.172                      /* read word */
   2.173                      if (word.length < WORDBUF_SIZE) {
   2.174                          word.ptr[word.length++] = c;
   2.175                      } else if (word.length == WORDBUF_SIZE) {
   2.176 -                        for (int i = 0 ; i < WORDBUF_SIZE ; i++) {
   2.177 -                            dp = writeescapedchar(dest, dp, word.ptr[i]);
   2.178 -                        }
   2.179 -                        word.length++;
   2.180 -                        dp = writeescapedchar(dest, dp, c);
   2.181 +                        /* TODO: this will be removed */
   2.182 +                        ucx_buffer_puts(dest,
   2.183 +                                "!!! WARNING - WORD TOO LONG TO PARSE !!!");
   2.184 +                        word.length = 0;
   2.185                      } else {
   2.186 -                        dp = writeescapedchar(dest, dp, c);
   2.187 +                        put_htmlescaped(dest, c);
   2.188                      }
   2.189                  }
   2.190              }
   2.191 @@ -191,9 +176,4 @@
   2.192              isescaping = !isescaping & (c == '\\');
   2.193          }
   2.194      } while (c != '\n');
   2.195 -    dest[dp] = 0;
   2.196 -    
   2.197 -    /* TODO: workaround */
   2.198 -    destbuf->pos += dp;
   2.199 -    destbuf->size += dp;
   2.200  }
     3.1 --- a/src/ccodegen.h	Tue Aug 23 16:34:02 2016 +0200
     3.2 +++ b/src/ccodegen.h	Tue Aug 23 17:24:58 2016 +0200
     3.3 @@ -37,11 +37,7 @@
     3.4  extern "C" {
     3.5  #endif
     3.6  
     3.7 -extern const char* ckeywords[];
     3.8 -
     3.9 -int check_ctype(char *word, size_t len);
    3.10 -int check_cdirective(char *word);
    3.11 -void cparseline(char *src, UcxBuffer *dest, int *mlc);
    3.12 +void c_highlighter(char *src, UcxBuffer *dest, int *mlc);
    3.13  
    3.14  #ifdef	__cplusplus
    3.15  }
     4.1 --- a/src/codegens.c	Tue Aug 23 16:34:02 2016 +0200
     4.2 +++ b/src/codegens.c	Tue Aug 23 17:24:58 2016 +0200
     4.3 @@ -32,16 +32,20 @@
     4.4  #include "codegens.h"
     4.5  
     4.6  
     4.7 -size_t writeescapedchar(char *dest, size_t dp, char c) {
     4.8 +void put_htmlescaped(UcxBuffer *dest, char c) {
     4.9      if (c == '>') {
    4.10 -        dest[dp++] = '&'; dest[dp++] = 'g'; dest[dp++] = 't'; dest[dp++] = ';';
    4.11 +        ucx_buffer_puts(dest, "&gt;");
    4.12      } else if (c == '<') {
    4.13 -        dest[dp++] = '&'; dest[dp++] = 'l'; dest[dp++] = 't'; dest[dp++] = ';';
    4.14 +        ucx_buffer_puts(dest, "&lt;");
    4.15      } else {
    4.16 -        dest[dp++] = c;
    4.17 +        ucx_buffer_putc(dest, c);
    4.18      }
    4.19 +}
    4.20  
    4.21 -    return dp;
    4.22 +void put_htmlescapedstr(UcxBuffer *dest, sstr_t s) {
    4.23 +    for (int i = 0 ; i < s.length ; i++) {
    4.24 +        put_htmlescaped(dest, s.ptr[i]);
    4.25 +    }
    4.26  }
    4.27  
    4.28  int check_keyword(sstr_t word, const char** keywords) {
     5.1 --- a/src/codegens.h	Tue Aug 23 16:34:02 2016 +0200
     5.2 +++ b/src/codegens.h	Tue Aug 23 17:24:58 2016 +0200
     5.3 @@ -42,8 +42,10 @@
     5.4  
     5.5  typedef void(*highlighter_func)(char*,UcxBuffer*,int*);
     5.6  
     5.7 -#define iswordcharacter(c) (isalnum(c) || c=='_' || c=='#' || c=='@')
     5.8 -size_t writeescapedchar(char *dest, size_t dp, char c);
     5.9 +void put_htmlescaped(UcxBuffer *dest, char c);
    5.10 +void put_htmlescapedstr(UcxBuffer *dest, sstr_t s);
    5.11 +
    5.12 +#define check_alnumex(c) (isalnum(c) || c=='_' || c=='#' || c=='@')
    5.13  int check_keyword(sstr_t word, const char** keywords);
    5.14  int check_capsonly(sstr_t word);
    5.15  
     6.1 --- a/src/javacodegen.c	Tue Aug 23 16:34:02 2016 +0200
     6.2 +++ b/src/javacodegen.c	Tue Aug 23 17:24:58 2016 +0200
     6.3 @@ -41,26 +41,21 @@
     6.4      "volatile", "const", "float", "native", "super", "while", NULL
     6.5  };
     6.6  
     6.7 -#define memcpy_const(darr,doff,str) memcpy(&(darr[doff]), str, sizeof(str)-1); \
     6.8 -                                    dp += sizeof(str)-1
     6.9 +void java_highlighter(char *src, UcxBuffer *dest, int *multiline_comment) {
    6.10  
    6.11 -void jparseline(char *src, UcxBuffer *destbuf, int *multiline_comment) {
    6.12 -    /* TODO: workaround for using old code with UcxBuffer */
    6.13 -    char *dest = destbuf->space + destbuf->pos;
    6.14 -    
    6.15      /* TODO: try to replace this buffer */
    6.16      char wordbuf[WORDBUF_SIZE];
    6.17      sstr_t word;
    6.18      word.ptr = wordbuf; word.length = 0;
    6.19      
    6.20 -    size_t sp = (size_t)-1, dp = 0;
    6.21 +    size_t sp = (size_t)-1;
    6.22      int isstring = 0, iscomment = 0, isimport = 0;
    6.23      char quote = '\0';
    6.24      int isescaping = 0;
    6.25  
    6.26      if (*multiline_comment) {
    6.27          iscomment = 1;
    6.28 -        memcpy_const(dest, dp, "<span class=\"c2html-comment\">");
    6.29 +        ucx_buffer_puts(dest, "<span class=\"c2html-comment\">");
    6.30      }
    6.31  
    6.32      char c;
    6.33 @@ -73,83 +68,81 @@
    6.34              if (*multiline_comment && sp > 0 && src[sp-1] == '*') {
    6.35                  iscomment = 0;
    6.36                  *multiline_comment = 0;
    6.37 -                memcpy_const(dest, dp, "/</span>");
    6.38 +                ucx_buffer_puts(dest, "/</span>");
    6.39                  continue;
    6.40              } else if (!iscomment && (src[sp+1] == '/' || src[sp+1] == '*')) {
    6.41                  iscomment = 1;
    6.42                  *multiline_comment = (src[sp+1] == '*');
    6.43 -                memcpy_const(dest, dp, "<span class=\"c2html-comment\">");
    6.44 +                ucx_buffer_puts(dest, "<span class=\"c2html-comment\">");
    6.45              }
    6.46          }
    6.47  
    6.48          if (iscomment) {
    6.49              if (c == '\n') {
    6.50 -                memcpy(&(dest[dp]), "</span>", 7);
    6.51 -                dp += 7;
    6.52 +                ucx_buffer_puts(dest, "</span>\n");
    6.53 +            } else {
    6.54 +                put_htmlescaped(dest, c);
    6.55              }
    6.56 -            dp = writeescapedchar(dest, dp, c);
    6.57          } else if (isimport) {
    6.58              /* TODO: local imports */
    6.59          } else {
    6.60              /* strings */
    6.61              if (!isescaping && (c == '\'' || c == '\"')) {
    6.62                  if (isstring) {
    6.63 -                    dp = writeescapedchar(dest, dp, c);
    6.64 +                    put_htmlescaped(dest, c);
    6.65                      if (c == quote) {
    6.66                          isstring = 0;
    6.67 -                        memcpy_const(dest, dp, "</span>");
    6.68 +                        ucx_buffer_puts(dest, "</span>");
    6.69                      } else {
    6.70 -                        dp = writeescapedchar(dest, dp, c);
    6.71 +                        put_htmlescaped(dest, c);
    6.72                      }
    6.73                  } else {
    6.74                      isstring = 1;
    6.75                      quote = c;
    6.76 -                    memcpy_const(dest, dp,
    6.77 +                    ucx_buffer_puts(dest,
    6.78                          "<span class=\"c2html-string\">");
    6.79 -                    dp = writeescapedchar(dest, dp, c);
    6.80 +                    put_htmlescaped(dest, c);
    6.81                  }
    6.82              } else {
    6.83                  if (isstring) {
    6.84 -                    dp = writeescapedchar(dest, dp, c);
    6.85 -                } else if (!iswordcharacter(c)) {
    6.86 +                    put_htmlescaped(dest, c);
    6.87 +                } else if (!check_alnumex(c)) {
    6.88                      if (word.length > 0 && word.length < WORDBUF_SIZE) {
    6.89                          int closespan = 1;
    6.90                          if (check_keyword(word, jkeywords)) {
    6.91 -                            memcpy_const(dest, dp, 
    6.92 +                            ucx_buffer_puts(dest,
    6.93                                  "<span class=\"c2html-keyword\">");
    6.94                          } else if (isupper(word.ptr[0])) {
    6.95 -                            memcpy_const(dest, dp, 
    6.96 +                            ucx_buffer_puts(dest,
    6.97                                  "<span class=\"c2html-type\">");
    6.98                          } else if (word.ptr[0] == '@') {
    6.99 -                            memcpy_const(dest, dp, 
   6.100 +                            ucx_buffer_puts(dest,
   6.101                                  "<span class=\"c2html-directive\">");
   6.102                          } else if (check_capsonly(word)) {
   6.103 -                            memcpy_const(dest, dp, 
   6.104 +                            ucx_buffer_puts(dest,
   6.105                                  "<span class=\"c2html-macroconst\">");
   6.106                          } else {
   6.107                              closespan = 0;
   6.108                          }
   6.109 -                        for (int i = 0 ; i < word.length ; i++) {
   6.110 -                            dp = writeescapedchar(dest, dp, word.ptr[i]);
   6.111 -                        }
   6.112 +                        put_htmlescapedstr(dest, word);
   6.113 +                        
   6.114                          if (closespan) {
   6.115 -                            memcpy_const(dest, dp, "</span>");
   6.116 +                            ucx_buffer_puts(dest, "</span>");
   6.117                          }
   6.118                      }
   6.119                      word.length = 0;
   6.120 -                    dp = writeescapedchar(dest, dp, c);
   6.121 +                    put_htmlescaped(dest, c);
   6.122                  } else {
   6.123                      /* read word */
   6.124                      if (word.length < WORDBUF_SIZE) {
   6.125                          word.ptr[word.length++] = c;
   6.126                      } else if (word.length == WORDBUF_SIZE) {
   6.127 -                        for (int i = 0 ; i < WORDBUF_SIZE ; i++) {
   6.128 -                            dp = writeescapedchar(dest, dp, word.ptr[i]);
   6.129 -                        }
   6.130 -                        word.length++;
   6.131 -                        dp = writeescapedchar(dest, dp, c);
   6.132 +                        /* TODO: this will be removed */
   6.133 +                        ucx_buffer_puts(dest,
   6.134 +                                "!!! WARNING - WORD TOO LONG TO PARSE !!!");
   6.135 +                        word.length = 0;
   6.136                      } else {
   6.137 -                        dp = writeescapedchar(dest, dp, c);
   6.138 +                        put_htmlescaped(dest, c);
   6.139                      }
   6.140                  }
   6.141              }
   6.142 @@ -157,9 +150,4 @@
   6.143              isescaping = !isescaping & (c == '\\');
   6.144          }
   6.145      } while (c != '\n');
   6.146 -    dest[dp] = 0;
   6.147 -    
   6.148 -    /* TODO: workaround */
   6.149 -    destbuf->pos += dp;
   6.150 -    destbuf->size += dp;
   6.151  }
     7.1 --- a/src/javacodegen.h	Tue Aug 23 16:34:02 2016 +0200
     7.2 +++ b/src/javacodegen.h	Tue Aug 23 17:24:58 2016 +0200
     7.3 @@ -37,12 +37,7 @@
     7.4  extern "C" {
     7.5  #endif
     7.6  
     7.7 -extern const char* jkeywords[];
     7.8 -
     7.9 -int check_jtype(char *word, size_t len);
    7.10 -int check_jdirective(char *word);
    7.11 -void jparseline(char *src, UcxBuffer *dest, int *mlc);
    7.12 -
    7.13 +void java_highlighter(char *src, UcxBuffer *dest, int *mlc);
    7.14  
    7.15  #ifdef	__cplusplus
    7.16  }

mercurial