Thu, 11 Jul 2024 20:05:26 +0200
Added tag v3.1 for changeset 0f1c55d2a90a
23 | 1 | /* |
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
3 | * | |
35 | 4 | * Copyright 2016 Mike Becker. All rights reserved. |
23 | 5 | * |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions are met: | |
8 | * | |
9 | * 1. Redistributions of source code must retain the above copyright | |
10 | * notice, this list of conditions and the following disclaimer. | |
11 | * | |
12 | * 2. Redistributions in binary form must reproduce the above copyright | |
13 | * notice, this list of conditions and the following disclaimer in the | |
14 | * documentation and/or other materials provided with the distribution. | |
15 | * | |
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
26 | * POSSIBILITY OF SUCH DAMAGE. | |
27 | * | |
28 | */ | |
52
33ded421c512
merges all highlighter functions into one highlighter module
Mike Becker <universe@uap-core.de>
parents:
51
diff
changeset
|
29 | |
22
f463693b5eeb
added command line parameters for header and footer file
Mike Becker <universe@uap-core.de>
parents:
21
diff
changeset
|
30 | #include "c2html.h" |
1
12c482ea4fc4
first prototype: creates unformatted output with line numbers
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
31 | |
66 | 32 | #include <cx/array_list.h> |
33 | #include <cx/printf.h> | |
70
60cecca5e484
fix illegal memory access when input file does not end with line break
Mike Becker <universe@uap-core.de>
parents:
67
diff
changeset
|
34 | #include <string.h> |
53
5e47a26a16f0
adds appendfile() function to main module + adds TODOs for source files which do not terminate with a blank line
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
35 | |
66 | 36 | size_t c2html_format( |
37 | CxList const *lines, | |
38 | void *outbuf, | |
39 | cx_write_func wfnc, | |
40 | c2html_highlighter_func highlighter, | |
41 | int showln | |
42 | ) { | |
43 | /* total written bytes */ | |
44 | size_t written = 0; | |
45 | ||
46 | /* compute width of line numbering */ | |
47 | int lnw = 0; | |
48 | if (showln) { | |
49 | size_t no_lines = cxListSize(lines); | |
50 | for (size_t p = 1; p < no_lines; p *= 10) lnw++; | |
55
bf54085ce341
adds appropriate public API
Mike Becker <universe@uap-core.de>
parents:
53
diff
changeset
|
51 | } |
1
12c482ea4fc4
first prototype: creates unformatted output with line numbers
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
52 | |
66 | 53 | /* start code formatting */ |
54 | written += wfnc("<div class=\"c2html-code\">\n", 1, 26, outbuf); | |
39
ac35daceb24c
adds UCX + changes how the input file is read (uses an consecutive memory area now)
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
55 | |
44
2b4ac35d061d
cleans up formatfile function up to the parser call
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
56 | /* process lines */ |
66 | 57 | int lineno = 0; |
75
c72b250866ab
add basic support for line continuations in C highlighter
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
58 | c2html_highlighter_data hd = {0}; |
66 | 59 | cxBufferInit(&hd.primary_buffer, NULL, 256, NULL, CX_BUFFER_AUTO_EXTEND); |
60 | cxBufferInit(&hd.secondary_buffer, NULL, 32, NULL, CX_BUFFER_AUTO_EXTEND); | |
61 | CxBuffer out_line; | |
62 | cxBufferInit(&out_line, NULL, 128, NULL, CX_BUFFER_AUTO_EXTEND); | |
63 | ||
64 | CxIterator in_lines = cxListIterator(lines); | |
65 | cx_foreach(char*, in_line, in_lines) { | |
44
2b4ac35d061d
cleans up formatfile function up to the parser call
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
66 | /* increase line number and clean line buffer */ |
39
ac35daceb24c
adds UCX + changes how the input file is read (uses an consecutive memory area now)
Mike Becker <universe@uap-core.de>
parents:
38
diff
changeset
|
67 | lineno++; |
66 | 68 | cxBufferClear(&out_line); |
69 | ||
44
2b4ac35d061d
cleans up formatfile function up to the parser call
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
70 | /* write line number */ |
66 | 71 | if (showln) { |
72 | cx_bprintf(&out_line, "<a class=\"c2html-lineno\" name=\"l%d\" " | |
73 | "href=\"#l%d\">%*d </a>", | |
74 | lineno, lineno, lnw, lineno); | |
44
2b4ac35d061d
cleans up formatfile function up to the parser call
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
75 | } |
66 | 76 | |
45
1f3835182aeb
changes signature of parser functions to use a UcxBuffer - the functions itself don't use the API yet
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
77 | /* process code line */ |
66 | 78 | highlighter(in_line, &out_line, &hd); |
79 | ||
50
17408c3607ce
minor fixes and macro removals
Mike Becker <universe@uap-core.de>
parents:
49
diff
changeset
|
80 | /* write code line */ |
66 | 81 | written += wfnc(out_line.space, 1, out_line.size, outbuf); |
24
e43dee5892f4
improved code structure and added option for disabling line numbers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
23
diff
changeset
|
82 | } |
66 | 83 | |
84 | /* end code formatting */ | |
85 | written += wfnc("</div>\n", 1, 7, outbuf); | |
86 | ||
44
2b4ac35d061d
cleans up formatfile function up to the parser call
Mike Becker <universe@uap-core.de>
parents:
43
diff
changeset
|
87 | /* cleanup and return */ |
66 | 88 | cxBufferDestroy(&hd.primary_buffer); |
89 | cxBufferDestroy(&hd.secondary_buffer); | |
90 | cxBufferDestroy(&out_line); | |
91 | ||
55
bf54085ce341
adds appropriate public API
Mike Becker <universe@uap-core.de>
parents:
53
diff
changeset
|
92 | return written; |
24
e43dee5892f4
improved code structure and added option for disabling line numbers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
23
diff
changeset
|
93 | } |
e43dee5892f4
improved code structure and added option for disabling line numbers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
23
diff
changeset
|
94 | |
70
60cecca5e484
fix illegal memory access when input file does not end with line break
Mike Becker <universe@uap-core.de>
parents:
67
diff
changeset
|
95 | size_t c2html_textformat( |
66 | 96 | char const *inputbuffer, |
97 | void *outbuf, | |
98 | cx_write_func wfnc, | |
99 | c2html_highlighter_func highlighter, | |
100 | int showln | |
101 | ) { | |
102 | /* a rough estimate for the number of lines */ | |
70
60cecca5e484
fix illegal memory access when input file does not end with line break
Mike Becker <universe@uap-core.de>
parents:
67
diff
changeset
|
103 | size_t inputbuflen = strlen(inputbuffer); |
66 | 104 | size_t est_cap = 16 + inputbuflen / 40; |
1
12c482ea4fc4
first prototype: creates unformatted output with line numbers
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
105 | |
66 | 106 | /* create the line pointer array */ |
107 | CxList *lines = cxArrayListCreateSimple(CX_STORE_POINTERS, est_cap); | |
108 | cxListAdd(lines, inputbuffer); | |
71
d5af9261231d
fix incorrect highlighting when input file starts with line break
Mike Becker <universe@uap-core.de>
parents:
70
diff
changeset
|
109 | for (size_t i = 0; i < inputbuflen; i++) { |
66 | 110 | if (inputbuffer[i] == '\n' && i + 1 < inputbuflen) { |
111 | cxListAdd(lines, inputbuffer + i + 1); | |
57
eba880c1705c
improves API and adds functions for strings
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
112 | } |
eba880c1705c
improves API and adds functions for strings
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
113 | } |
66 | 114 | |
115 | /* invoke the other function */ | |
116 | size_t n = c2html_format(lines, outbuf, wfnc, highlighter, showln); | |
57
eba880c1705c
improves API and adds functions for strings
Mike Becker <universe@uap-core.de>
parents:
55
diff
changeset
|
117 | |
66 | 118 | /* cleanup and return */ |
119 | cxListDestroy(lines); | |
120 | return n; | |
121 | } |