1 #LyX 2.4 created this file. For more info see https://www.lyx.org/
5 \save_transient_properties true
6 \origin /systemlyxdir/examples/Modules/
8 \use_default_options false
12 \maintain_unincluded_children no
14 \language_package default
17 \font_roman "lmodern" "default"
18 \font_sans "default" "default"
19 \font_typewriter "default" "default"
20 \font_math "auto" "auto"
21 \font_default_family default
22 \use_non_tex_fonts false
26 \font_typewriter_osf false
27 \font_sf_scale 100 100
28 \font_tt_scale 100 100
30 \use_dash_ligatures false
32 \default_output_format default
34 \bibtex_command default
35 \index_command default
36 \paperfontsize default
41 \use_package amsmath 1
42 \use_package amssymb 1
45 \use_package mathdots 1
46 \use_package mathtools 1
48 \use_package stackrel 1
49 \use_package stmaryrd 1
50 \use_package undertilde 1
52 \cite_engine_type default
56 \paperorientation portrait
68 \paragraph_separation indent
69 \paragraph_indentation default
71 \math_numbering_side default
76 \paperpagestyle default
78 \tracking_changes false
81 \postpone_fragile_content false
85 \docbook_table_output 0
86 \docbook_mathml_prefix 1
93 and Literate Programming
94 \begin_inset Newline newline
102 \begin_inset Newline newline
105 edmar-w-jr@technologist.com
109 \begin_layout Plain Layout
110 Modified by Bernard Michael Hurley bernardh@westherts.ac.uk —- Don't blame
111 Edmar for any errors that have crept in!
119 \begin_layout Abstract
124 This example program is provided for educational use only.
125 The functionality in this C program has been superceded by the equivalent
130 which should be installed in the \SpecialChar LyX
134 \begin_layout Standard
135 \begin_inset CommandInset toc
136 LatexCommand tableofcontents
143 \begin_layout Section
147 \begin_layout Standard
148 After typesetting a document, \SpecialChar LyX
149 scans the \SpecialChar LaTeX
150 log file looking for errors.
151 For each error found, the line number is obtained and a error box is displayed
152 in the \SpecialChar LyX
153 screen at that position.
156 \begin_layout Standard
157 To use this feature to view compilation errors while working with literate
158 documents, we need a program that filters the compilation errors and puts
159 them in a format suitable for \SpecialChar LyX
164 \begin_layout Standard
165 In this document we present a filter that recognizes compilation error messages
166 from noweb, gnu C, and the IBM C compiler (xlc).
169 \begin_layout Standard
170 The filter is required to read from standard input, parse for error messages
171 and copy the error messages to the standard output.
172 During the output process, the filter must present the error messages in
173 a format that \SpecialChar LyX
174 can interpret, currently, the \SpecialChar LaTeX
175 error message format.
176 Of course, nothing will prevent future \SpecialChar LyX
177 releases from being able to read
178 other formats as well (like gcc error messages for example).
179 This mechanism is necessary to fully explore the literate programming tool's
183 \begin_layout Section
187 \begin_layout Standard
188 \begin_inset Flex Chunk
191 \begin_layout Plain Layout
193 \begin_inset Argument 1
196 \begin_layout Plain Layout
206 \begin_layout Plain Layout
208 main (int argc, char **argv)
211 \begin_layout Plain Layout
216 \begin_layout Plain Layout
221 \begin_layout Plain Layout
223 switch (argv[1][0]) {
226 \begin_layout Plain Layout
231 \begin_layout Plain Layout
233 <<Scan input for noweb error messages>>
236 \begin_layout Plain Layout
241 \begin_layout Plain Layout
246 \begin_layout Plain Layout
248 <<Scan input for xlc error messages>>
251 \begin_layout Plain Layout
256 \begin_layout Plain Layout
261 \begin_layout Plain Layout
263 <<AIX system using both noweb and xlc>>
266 \begin_layout Plain Layout
271 \begin_layout Plain Layout
276 \begin_layout Plain Layout
281 \begin_layout Plain Layout
283 <<Solaris and Linux systems using both noweb and gcc>>
286 \begin_layout Plain Layout
291 \begin_layout Plain Layout
296 \begin_layout Plain Layout
301 \begin_layout Plain Layout
303 <<Scan input for gcc error messages>>
306 \begin_layout Plain Layout
311 \begin_layout Plain Layout
316 \begin_layout Plain Layout
321 \begin_layout Plain Layout
323 <<Scan input for gcc error messages>>
326 \begin_layout Plain Layout
331 \begin_layout Plain Layout
341 \begin_layout Standard
342 \begin_inset Flex Chunk
345 \begin_layout Plain Layout
347 \begin_inset Argument 1
350 \begin_layout Plain Layout
357 int main (int argc, char **argv);
365 \begin_layout Section
369 \begin_layout Standard
370 We resort to some global variables to allow access from several different
372 These are the buffer and related pointers used during the parse of the
376 \begin_layout Standard
380 \begin_layout Plain Layout
382 <<Global variables>>=
385 \begin_layout Plain Layout
387 char buffer[200][200];
390 \begin_layout Plain Layout
395 \begin_layout Plain Layout
400 \begin_layout Plain Layout
405 \begin_layout Plain Layout
415 \begin_layout Section
419 \begin_layout Standard
420 The output format mimics the \SpecialChar TeX
421 error messages format.
422 This function prints a number of lines residing in the global variable
427 , a program name and line number.
428 There is no special requirement on the input strings, they can be anything.
432 \begin_layout Plain Layout
433 This function has been slightly changed from EW's original to make scanning
434 a bit easier with \SpecialChar LaTeX
436 The test has been added because \SpecialChar LyX
437 can crash if empty lines are allowed here
438 — I can't figure out why! — BMH
446 \begin_layout Standard
447 \begin_inset Flex Chunk
450 \begin_layout Plain Layout
452 \begin_inset Argument 1
455 \begin_layout Plain Layout
465 \begin_layout Plain Layout
467 output_error (int buf_size, int error_line, char *tool)
470 \begin_layout Plain Layout
475 \begin_layout Plain Layout
480 \begin_layout Plain Layout
485 \begin_layout Plain Layout
487 fprintf(stdout, "! Build Error: ==> %s ==>
492 \begin_layout Plain Layout
494 fprintf(stdout, " ...
503 \begin_layout Plain Layout
508 \begin_layout Plain Layout
510 for (i=0; i<buf_size; i++)
513 \begin_layout Plain Layout
515 if (strlen(buffer[i]) != 0)
518 \begin_layout Plain Layout
520 fprintf(stdout, "%s", buffer[i]);
523 \begin_layout Plain Layout
528 \begin_layout Plain Layout
535 \begin_layout Plain Layout
545 \begin_layout Standard
546 \begin_inset Flex Chunk
549 \begin_layout Plain Layout
551 \begin_inset Argument 1
554 \begin_layout Plain Layout
561 void output_error (int buf_size, int error_line, char *tool);
569 \begin_layout Section
570 Functions Implementation
573 \begin_layout Standard
574 Both noweave and notangle routines, always output one single line for each
575 error found, thus to scan the buffer for noweb error messages is enough
576 to exam one input line at a time.
577 Note that the noweb software does not provide a line error number, so all
578 errors boxes related to noweb messages will be displayed at the beginning
582 \begin_layout Standard
583 \begin_inset Flex Chunk
586 \begin_layout Plain Layout
588 \begin_inset Argument 1
591 \begin_layout Plain Layout
593 Scan input for noweb error messages
601 \begin_layout Plain Layout
606 \begin_layout Plain Layout
608 while (fgets(buffer[0], 200, stdin)) {
611 \begin_layout Plain Layout
616 \begin_layout Plain Layout
618 output_error(1, err_line, "noweb");
621 \begin_layout Plain Layout
626 \begin_layout Plain Layout
636 \begin_layout Standard
637 The examination itself is very inefficient.
638 Unfortunately noweb doesn't have any characteristic that would help to
639 identify one of its error messages.
640 The solution is to collect all possible output messages in an array of
641 strings, and turn the examination process into a linear search in this
645 \begin_layout Standard
646 \begin_inset Flex Chunk
649 \begin_layout Plain Layout
651 \begin_inset Argument 1
654 \begin_layout Plain Layout
664 \begin_layout Plain Layout
666 char *noweb_msgs[] = {
669 \begin_layout Plain Layout
671 "couldn't open file",
674 \begin_layout Plain Layout
676 "couldn't open temporary file",
679 \begin_layout Plain Layout
681 "error writing temporary file",
684 \begin_layout Plain Layout
689 \begin_layout Plain Layout
694 \begin_layout Plain Layout
696 "Bad format sequence",
699 \begin_layout Plain Layout
701 "Can't open output file",
704 \begin_layout Plain Layout
706 "Can't open temporary file",
709 \begin_layout Plain Layout
711 "Capacity exceeded:",
714 \begin_layout Plain Layout
716 "Ignoring unknown option -",
719 \begin_layout Plain Layout
721 "This can't happen:",
724 \begin_layout Plain Layout
726 "non-numeric line number in"
729 \begin_layout Plain Layout
734 \begin_layout Plain Layout
738 \begin_layout Plain Layout
740 char *noweb_msgs_mimic_gcc[] = {
743 \begin_layout Plain Layout
745 ": unescaped << in documentation chunk"
748 \begin_layout Plain Layout
758 \begin_layout Standard
759 A noweb error message can be any string that contains a matching pair of
772 > >, or any of the above strings
775 \begin_layout Standard
779 \begin_layout Plain Layout
784 \begin_layout Plain Layout
786 int noweb_try (int buf_line)
789 \begin_layout Plain Layout
794 \begin_layout Plain Layout
799 \begin_layout Plain Layout
804 \begin_layout Plain Layout
808 \begin_layout Plain Layout
810 b = buffer[buf_line];
813 \begin_layout Plain Layout
818 \begin_layout Plain Layout
822 \begin_layout Plain Layout
824 for (i=0; i<1; i++) {
827 \begin_layout Plain Layout
829 s = (char *)strstr (b, noweb_msgs_mimic_gcc[i]);
832 \begin_layout Plain Layout
837 \begin_layout Plain Layout
839 t = (char *)strchr(buffer[buf_line], ':');
842 \begin_layout Plain Layout
844 err_line = atoi(t+1);
847 \begin_layout Plain Layout
849 t = buffer[buf_line];
852 \begin_layout Plain Layout
857 \begin_layout Plain Layout
859 while (*(t++) = *(s++));
862 \begin_layout Plain Layout
867 \begin_layout Plain Layout
872 \begin_layout Plain Layout
877 \begin_layout Plain Layout
879 s = (char *)strstr(b, "<<");
882 \begin_layout Plain Layout
887 \begin_layout Plain Layout
889 s = (char *)strstr(s+2, ">>");
892 \begin_layout Plain Layout
897 \begin_layout Plain Layout
902 \begin_layout Plain Layout
907 \begin_layout Plain Layout
912 \begin_layout Plain Layout
914 for (i = 0; i < 12; ++i) {
917 \begin_layout Plain Layout
919 s = (char *)strstr (b, noweb_msgs[i]);
922 \begin_layout Plain Layout
927 \begin_layout Plain Layout
932 \begin_layout Plain Layout
937 \begin_layout Plain Layout
942 \begin_layout Plain Layout
947 \begin_layout Plain Layout
952 \begin_layout Plain Layout
957 \begin_layout Plain Layout
967 \begin_layout Standard
971 \begin_layout Plain Layout
973 <<Function prototypes>>=
976 \begin_layout Plain Layout
978 int noweb_try (int buf_line);
981 \begin_layout Plain Layout
991 \begin_layout Standard
992 The xlc compiler always outputs one single line for each error found, thus
993 to scan the buffer for xlc error messages it is enough to exam one input
997 \begin_layout Standard
998 \begin_inset Flex Chunk
1001 \begin_layout Plain Layout
1003 \begin_inset Argument 1
1006 \begin_layout Plain Layout
1008 Scan input for xlc error messages
1016 \begin_layout Plain Layout
1021 \begin_layout Plain Layout
1023 while (fgets(buffer[last_buf_line], 200, stdin)) {
1026 \begin_layout Plain Layout
1031 \begin_layout Plain Layout
1033 output_error(1, err_line, "xlc");
1036 \begin_layout Plain Layout
1041 \begin_layout Plain Layout
1051 \begin_layout Standard
1052 A xlc error message is easy to identify.
1053 Every error message starts with a quoted string with no spaces, a comma,
1055 \begin_inset Quotes eld
1059 \begin_inset Quotes erd
1062 , a space, and some variable text.
1063 The following routine tests if a given buffer line matches this criteria:
1066 \begin_layout Standard
1067 \begin_inset Flex Chunk
1070 \begin_layout Plain Layout
1074 \begin_layout Plain Layout
1078 \begin_layout Plain Layout
1080 \begin_inset Argument 1
1083 \begin_layout Plain Layout
1093 \begin_layout Plain Layout
1098 \begin_layout Plain Layout
1100 xlc_try (int buf_line)
1103 \begin_layout Plain Layout
1108 \begin_layout Plain Layout
1113 \begin_layout Plain Layout
1118 \begin_layout Plain Layout
1120 t = buffer[buf_line];
1123 \begin_layout Plain Layout
1128 \begin_layout Plain Layout
1130 while (*s != '"' && *s != ' ' && *s != '
1135 \begin_layout Plain Layout
1140 \begin_layout Plain Layout
1142 if (*t != '"' || *s != '"' || strncmp(s+1, ", line ", 7) != 0)
1145 \begin_layout Plain Layout
1150 \begin_layout Plain Layout
1155 \begin_layout Plain Layout
1160 \begin_layout Plain Layout
1165 \begin_layout Plain Layout
1175 \begin_layout Standard
1176 \begin_inset Flex Chunk
1179 \begin_layout Plain Layout
1181 \begin_inset Argument 1
1184 \begin_layout Plain Layout
1191 int xlc_try (int buf_line);
1199 \begin_layout Standard
1200 The gcc compiler error messages are more complicated to scan.
1201 Each error can span more than one line in the buffer.
1202 The good news is that every buffer line on each error has the same pattern,
1203 and share the same line number.
1204 Thus the strategy will be to accumulate lines in the buffer while the reported
1205 line number is still the same.
1206 At the time they differ, all the accumulated lines, except the last one,
1207 will belong to one single error message, which now can be output-ed to
1212 \begin_layout Standard
1213 Every gcc error message contains a string with no space followed by a
1214 \begin_inset Quotes eld
1218 \begin_inset Quotes eld
1222 If the next character is a space, then this line is a header of a error
1223 message and the next line will detail the line number of the source code
1224 where the error was found.
1225 Otherwise, the next thing is a integer number followed by another
1226 \begin_inset Quotes eld
1230 \begin_inset Quotes eld
1236 \begin_layout Standard
1237 \begin_inset Flex Chunk
1240 \begin_layout Plain Layout
1242 \begin_inset Argument 1
1245 \begin_layout Plain Layout
1247 Scan input for gcc error messages
1255 \begin_layout Plain Layout
1260 \begin_layout Plain Layout
1265 \begin_layout Plain Layout
1270 \begin_layout Plain Layout
1272 while (fgets(buffer[last_buf_line], 200, stdin)) {
1275 \begin_layout Plain Layout
1277 /****** Skip lines until I find an error */
1280 \begin_layout Plain Layout
1282 s = (char *)strpbrk(buffer[last_buf_line], " :");
1285 \begin_layout Plain Layout
1287 if (s == NULL || *s == ' ')
1290 \begin_layout Plain Layout
1292 continue; /* No gcc error found here */
1295 \begin_layout Plain Layout
1300 \begin_layout Plain Layout
1302 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1305 \begin_layout Plain Layout
1307 /****** OK It is an error message, get line number */
1310 \begin_layout Plain Layout
1312 err_line = atoi(s+1);
1315 \begin_layout Plain Layout
1317 if (last_err_line == 0 || last_err_line == err_line) {
1320 \begin_layout Plain Layout
1322 last_err_line = err_line;
1325 \begin_layout Plain Layout
1327 continue; /* It's either a header or a continuation, don't output
1331 \begin_layout Plain Layout
1336 \begin_layout Plain Layout
1338 /****** Completed the scan of one error message, output it to LyX
1342 \begin_layout Plain Layout
1344 discharge_buffer(1);
1347 \begin_layout Plain Layout
1352 \begin_layout Plain Layout
1354 } while (fgets(buffer[last_buf_line], 200, stdin));
1357 \begin_layout Plain Layout
1362 \begin_layout Plain Layout
1364 /****** EOF completes the scan of whatever was being scanned */
1367 \begin_layout Plain Layout
1369 discharge_buffer(0);
1372 \begin_layout Plain Layout
1382 \begin_layout Standard
1383 \begin_inset Flex Chunk
1386 \begin_layout Plain Layout
1388 \begin_inset Argument 1
1391 \begin_layout Plain Layout
1393 gcc error message criteria is to find a "...:999:" or a "...: "
1398 /****** Search first ":" in the error number */
1401 \begin_layout Plain Layout
1403 s = (char *)strpbrk(buffer[last_buf_line], " :");
1406 \begin_layout Plain Layout
1411 \begin_layout Plain Layout
1413 if (s == NULL || *s == ' ')
1416 \begin_layout Plain Layout
1418 <<No gcc error found here, but it might terminate the scanning of a previous
1422 \begin_layout Plain Layout
1424 /****** Search second ":" in the error number */
1427 \begin_layout Plain Layout
1429 t = (char *)strpbrk(s+1, " :");if (t == NULL || *t == ' ') <<No gcc error
1430 found here, but it might terminate the scanning of a previous one>>/******
1431 Verify if is all digits between ":" */if (t != s+1+strspn(s+1, "0123456789"))
1432 <<No gcc error found here, but it might terminate the scanning of a previous
1436 \begin_layout Plain Layout
1440 \begin_layout Plain Layout
1444 \begin_layout Plain Layout
1446 <<No gcc error found here, but it might terminate the scanning of a previous
1450 \begin_layout Plain Layout
1455 \begin_layout Plain Layout
1460 \begin_layout Plain Layout
1462 discharge_buffer(1);
1465 \begin_layout Plain Layout
1470 \begin_layout Plain Layout
1480 \begin_layout Standard
1481 As we mentioned, when the scan of one gcc error message is completed everything
1482 in the buffer except the last line is one single error message.
1483 But if the scan terminates with a EOF or through finding one line that
1484 does not match the gcc error message criteria, then there is no
1485 \begin_inset Quotes eld
1489 \begin_inset Quotes erd
1492 in the buffer to be concerned with.
1493 In those cases we empty the buffer completely.
1496 \begin_layout Standard
1497 \begin_inset Flex Chunk
1500 \begin_layout Plain Layout
1502 \begin_inset Argument 1
1505 \begin_layout Plain Layout
1515 \begin_layout Plain Layout
1520 \begin_layout Plain Layout
1522 discharge_buffer (int save_last)
1525 \begin_layout Plain Layout
1530 \begin_layout Plain Layout
1532 if (last_err_line != 0) {
1535 \begin_layout Plain Layout
1537 clean_gcc_messages();
1540 \begin_layout Plain Layout
1542 if (save_last != 0) {
1545 \begin_layout Plain Layout
1547 output_error(last_buf_line-1, last_err_line, "gcc");
1550 \begin_layout Plain Layout
1552 strcpy (buffer[0], buffer[last_buf_line-1]);
1555 \begin_layout Plain Layout
1557 last_err_line = err_line;
1560 \begin_layout Plain Layout
1565 \begin_layout Plain Layout
1570 \begin_layout Plain Layout
1575 \begin_layout Plain Layout
1577 clean_gcc_messages();
1580 \begin_layout Plain Layout
1582 output_error(last_buf_line-1, last_err_line, "gcc");
1585 \begin_layout Plain Layout
1590 \begin_layout Plain Layout
1595 \begin_layout Plain Layout
1600 \begin_layout Plain Layout
1605 \begin_layout Plain Layout
1615 \begin_layout Standard
1616 \begin_inset Flex Chunk
1619 \begin_layout Plain Layout
1621 \begin_inset Argument 1
1624 \begin_layout Plain Layout
1631 void discharge_buffer (int save_last);
1639 \begin_layout Standard
1641 \begin_inset Quotes eld
1645 \begin_inset Quotes erd
1648 superfluous information from gcc messages, namely the name of the noweb
1649 file and the line number of the Error.
1653 \begin_layout Plain Layout
1655 For instance, some way of distinguishing between gcc Errors and Warnings
1664 \begin_layout Standard
1665 \begin_inset Flex Chunk
1668 \begin_layout Plain Layout
1670 \begin_inset Argument 1
1673 \begin_layout Plain Layout
1683 \begin_layout Plain Layout
1685 clean_gcc_messages ()
1688 \begin_layout Plain Layout
1693 \begin_layout Plain Layout
1698 \begin_layout Plain Layout
1703 \begin_layout Plain Layout
1708 \begin_layout Plain Layout
1710 int search_len = sprintf(search, ".nw:%d:", last_err_line);
1713 \begin_layout Plain Layout
1718 \begin_layout Plain Layout
1720 for (index = 0; index < last_buf_line-1; index++) {
1723 \begin_layout Plain Layout
1725 tail = (char *)strstr (buffer[index], search);
1728 \begin_layout Plain Layout
1730 if ( tail == NULL) {
1733 \begin_layout Plain Layout
1735 tail = (char *) strstr (buffer[index], ".nw:");
1738 \begin_layout Plain Layout
1743 \begin_layout Plain Layout
1748 \begin_layout Plain Layout
1753 \begin_layout Plain Layout
1758 \begin_layout Plain Layout
1763 \begin_layout Plain Layout
1768 \begin_layout Plain Layout
1773 \begin_layout Plain Layout
1775 head = buffer[index];
1778 \begin_layout Plain Layout
1780 while (*(head++) = *(tail++));
1783 \begin_layout Plain Layout
1788 \begin_layout Plain Layout
1793 \begin_layout Plain Layout
1803 \begin_layout Standard
1804 \begin_inset Flex Chunk
1807 \begin_layout Plain Layout
1809 \begin_inset Argument 1
1812 \begin_layout Plain Layout
1819 void clean_gcc_messages ();
1827 \begin_layout Standard
1828 To combine the scan of noweb error messages and xlc error messages is very
1830 We just try each one for every input line:
1833 \begin_layout Standard
1837 \begin_layout Plain Layout
1839 <<AIX system using both noweb and xlc>>=
1842 \begin_layout Plain Layout
1847 \begin_layout Plain Layout
1852 \begin_layout Plain Layout
1854 while (fgets(buffer[0], 200, stdin)) {
1857 \begin_layout Plain Layout
1862 \begin_layout Plain Layout
1864 output_error(1, err_line, "noweb");
1867 \begin_layout Plain Layout
1869 else if (xlc_try(0))
1872 \begin_layout Plain Layout
1874 output_error(1, err_line, "xlc");
1877 \begin_layout Plain Layout
1882 \begin_layout Plain Layout
1887 \begin_layout Plain Layout
1897 \begin_layout Standard
1898 To combine the scan of noweb error messages and gcc error messages is simple
1899 if we realize that it is not possible to find a noweb error message in
1900 the middle of a gcc error message.
1901 So we just repeat the gcc procedure and test for noweb error messages in
1902 the beginning of the scan:
1905 \begin_layout Standard
1906 \begin_inset Flex Chunk
1909 \begin_layout Plain Layout
1911 \begin_inset Argument 1
1914 \begin_layout Plain Layout
1916 Solaris and Linux systems using both noweb and gcc
1924 \begin_layout Plain Layout
1929 \begin_layout Plain Layout
1934 \begin_layout Plain Layout
1939 \begin_layout Plain Layout
1941 while (fgets(buffer[last_buf_line], 200, stdin)) {
1944 \begin_layout Plain Layout
1946 /****** Skip lines until I find an error */
1949 \begin_layout Plain Layout
1951 if (last_buf_line == 0 && noweb_try(0)) {
1954 \begin_layout Plain Layout
1956 output_error(1, err_line, "noweb");
1959 \begin_layout Plain Layout
1964 \begin_layout Plain Layout
1969 \begin_layout Plain Layout
1971 s = (char *)strpbrk(buffer[last_buf_line], " :");
1974 \begin_layout Plain Layout
1976 if (s == NULL || *s == ' ')
1979 \begin_layout Plain Layout
1981 continue; /* No gcc error found here */
1984 \begin_layout Plain Layout
1989 \begin_layout Plain Layout
1991 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1994 \begin_layout Plain Layout
1996 /****** OK It is an error, get line number */
1999 \begin_layout Plain Layout
2001 err_line = atoi(s+1);
2004 \begin_layout Plain Layout
2006 if (last_err_line == 0 || last_err_line == err_line) {
2009 \begin_layout Plain Layout
2011 last_err_line = err_line;
2014 \begin_layout Plain Layout
2016 continue; /* It's either a header or a continuation, don't output
2020 \begin_layout Plain Layout
2025 \begin_layout Plain Layout
2027 /****** Completed the scan of one error message, output it to LyX
2031 \begin_layout Plain Layout
2033 discharge_buffer(1);
2036 \begin_layout Plain Layout
2041 \begin_layout Plain Layout
2043 } while (fgets(buffer[last_buf_line], 200, stdin));
2046 \begin_layout Plain Layout
2051 \begin_layout Plain Layout
2053 /****** EOF completes the scan of whatever was being scanned */
2056 \begin_layout Plain Layout
2058 discharge_buffer(0);
2061 \begin_layout Plain Layout
2071 \begin_layout Section
2072 Wrapping the code into a file
2075 \begin_layout Standard
2076 \begin_inset Flex Chunk
2079 \begin_layout Plain Layout
2081 \begin_inset Argument 1
2084 \begin_layout Plain Layout
2094 \begin_layout Plain Layout
2096 #include <strings.h>
2099 \begin_layout Plain Layout
2104 \begin_layout Plain Layout
2106 <<Global variables>>
2109 \begin_layout Plain Layout
2111 <<Function prototypes>>
2114 \begin_layout Plain Layout
2124 \begin_layout Standard
2125 To build this program, we want to add the
2126 \begin_inset Quotes eld
2130 \begin_inset Quotes erd
2133 option in the tangle command to force gdb to load the file
2142 In accordance with this, we pass the
2143 \begin_inset Quotes eld
2147 \begin_inset Quotes erd
2153 \begin_layout Standard
2154 \begin_inset Flex Chunk
2157 \begin_layout Plain Layout
2159 \begin_inset Argument 1
2162 \begin_layout Plain Layout
2172 \begin_layout Plain Layout
2174 if [ -z "$NOWEB_SOURCE" ]; then NOWEB_SOURCE=Literate.nw; fi
2177 \begin_layout Plain Layout
2179 if [ -z "$NOWEB_OUTPUT_DIR" ]; then NOWEB_OUTPUT_DIR=.; fi
2182 \begin_layout Plain Layout
2184 notangle -L -Rlisterrors.c ${NOWEB_SOURCE} > ${NOWEB_OUTPUT_DIR}/listerrors.c
2187 \begin_layout Plain Layout
2189 gcc -g -o listerrors listerrors.c
2197 \begin_layout Standard
2198 This project can be tangled and compiled from \SpecialChar LyX
2205 to call a generic script that always extracts a chunk named
2210 Here is a example of such generic script:
2213 \begin_layout LyX-Code
2215 \begin_inset Newline newline
2218 notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 NOWEB_OUTPUT_DIR=$r sh
2221 \begin_layout LyX-Code