1 #LyX 2.2 created this file. For more info see http://www.lyx.org/
5 \save_transient_properties true
6 \origin /systemlyxdir/examples/
8 \use_default_options false
12 \maintain_unincluded_children false
14 \language_package default
15 \inputencoding default
17 \font_roman "default" "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
25 \font_sf_scale 100 100
26 \font_tt_scale 100 100
28 \default_output_format default
30 \bibtex_command default
31 \index_command default
32 \paperfontsize default
37 \use_package amsmath 0
38 \use_package amssymb 0
41 \use_package mathdots 1
42 \use_package mathtools 0
44 \use_package stackrel 0
45 \use_package stmaryrd 0
46 \use_package undertilde 0
48 \cite_engine_type default
52 \paperorientation portrait
62 \paragraph_separation indent
63 \paragraph_indentation default
64 \quotes_language english
67 \paperpagestyle default
68 \tracking_changes false
79 and Literate Programming
80 \begin_inset Newline newline
88 \begin_inset Newline newline
91 edmar-w-jr@technologist.com
95 \begin_layout Plain Layout
96 Modified by Bernard Michael Hurley bernardh@westherts.ac.uk —- Don't blame
97 Edmar for any errors that have crept in!
105 \begin_layout Abstract
110 This example program is provided for educational use only.
111 The functionality in this C program has been superceded by the equivalent
114 examples/listerrors.lyx
116 which should be installed in the \SpecialChar LyX
124 \begin_layout Plain Layout
136 \begin_layout Standard
137 \begin_inset CommandInset toc
138 LatexCommand tableofcontents
145 \begin_layout Section
149 \begin_layout Standard
150 After typesetting a document, \SpecialChar LyX
151 scans the \SpecialChar LaTeX
152 log file looking for errors.
153 For each error found, the line number is obtained and a error box is displayed
154 in the \SpecialChar LyX
155 screen at that position.
158 \begin_layout Standard
159 To use this feature to view compilation errors while working with literate
160 documents, we need a program that filters the compilation errors and puts
161 them in a format suitable for \SpecialChar LyX
166 \begin_layout Standard
167 In this document we present a filter that recognizes compilation error messages
168 from noweb, gnu C, and the IBM C compiler (xlc).
171 \begin_layout Standard
172 The filter is required to read from standard input, parse for error messages
173 and copy the error messages to the standard output.
174 During the output process, the filter must present the error messages in
175 a format that \SpecialChar LyX
176 can interpret, currently, the \SpecialChar LaTeX
177 error message format.
178 Of course, nothing will prevent future \SpecialChar LyX
179 releases from being able to read
180 other formats as well (like gcc error messages for example).
181 This mechanism is necessary to fully explore the literate programming tool's
185 \begin_layout Section
189 \begin_layout Standard
190 \begin_inset Flex Chunk
193 \begin_layout Plain Layout
195 \begin_inset Argument 1
198 \begin_layout Plain Layout
207 \begin_layout Plain Layout
209 main (int argc, char **argv)
212 \begin_layout Plain Layout
217 \begin_layout Plain Layout
222 \begin_layout Plain Layout
224 switch (argv[1][0]) {
227 \begin_layout Plain Layout
232 \begin_layout Plain Layout
234 <<Scan input for noweb error messages>>
237 \begin_layout Plain Layout
242 \begin_layout Plain Layout
247 \begin_layout Plain Layout
249 <<Scan input for xlc error messages>>
252 \begin_layout Plain Layout
257 \begin_layout Plain Layout
262 \begin_layout Plain Layout
264 <<AIX system using both noweb and xlc>>
267 \begin_layout Plain Layout
272 \begin_layout Plain Layout
277 \begin_layout Plain Layout
282 \begin_layout Plain Layout
284 <<Solaris and Linux systems using both noweb and gcc>>
287 \begin_layout Plain Layout
292 \begin_layout Plain Layout
297 \begin_layout Plain Layout
302 \begin_layout Plain Layout
304 <<Scan input for gcc error messages>>
307 \begin_layout Plain Layout
312 \begin_layout Plain Layout
317 \begin_layout Plain Layout
322 \begin_layout Plain Layout
324 <<Scan input for gcc error messages>>
327 \begin_layout Plain Layout
332 \begin_layout Plain Layout
342 \begin_layout Standard
343 \begin_inset Flex Chunk
346 \begin_layout Plain Layout
348 \begin_inset Argument 1
351 \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
410 \begin_layout Section
414 \begin_layout Standard
415 The output format mimics the \SpecialChar TeX
416 error messages format.
417 This function prints a number of lines residing in the global variable
422 , a program name and line number.
423 There is no special requirement on the input strings, they can be anything.
427 \begin_layout Plain Layout
428 This function has been slightly changed from EW's original to make scanning
429 a bit easier with \SpecialChar LaTeX
431 The test has been added because \SpecialChar LyX
432 can crash if empty lines are allowed here
433 — I can't figure out why! — BMH
441 \begin_layout Standard
442 \begin_inset Flex Chunk
445 \begin_layout Plain Layout
447 \begin_inset Argument 1
450 \begin_layout Plain Layout
459 \begin_layout Plain Layout
461 output_error (int buf_size, int error_line, char *tool)
464 \begin_layout Plain Layout
469 \begin_layout Plain Layout
474 \begin_layout Plain Layout
479 \begin_layout Plain Layout
481 fprintf(stdout, "! Build Error: ==> %s ==>
486 \begin_layout Plain Layout
488 fprintf(stdout, " ...
497 \begin_layout Plain Layout
502 \begin_layout Plain Layout
504 for (i=0; i<buf_size; i++)
507 \begin_layout Plain Layout
509 if (strlen(buffer[i]) != 0)
512 \begin_layout Plain Layout
514 fprintf(stdout, "%s", buffer[i]);
517 \begin_layout Plain Layout
522 \begin_layout Plain Layout
529 \begin_layout Plain Layout
539 \begin_layout Standard
540 \begin_inset Flex Chunk
543 \begin_layout Plain Layout
545 \begin_inset Argument 1
548 \begin_layout Plain Layout
554 void output_error (int buf_size, int error_line, char *tool);
562 \begin_layout Section
563 Functions Implementation
566 \begin_layout Standard
567 Both noweave and notangle routines, always output one single line for each
568 error found, thus to scan the buffer for noweb error messages is enough
569 to exam one input line at a time.
570 Note that the noweb software does not provide a line error number, so all
571 errors boxes related to noweb messages will be displayed at the beginning
575 \begin_layout Standard
576 \begin_inset Flex Chunk
579 \begin_layout Plain Layout
581 \begin_inset Argument 1
584 \begin_layout Plain Layout
585 Scan input for noweb error messages
593 \begin_layout Plain Layout
598 \begin_layout Plain Layout
600 while (fgets(buffer[0], 200, stdin)) {
603 \begin_layout Plain Layout
608 \begin_layout Plain Layout
610 output_error(1, err_line, "noweb");
613 \begin_layout Plain Layout
618 \begin_layout Plain Layout
628 \begin_layout Standard
629 The examination itself is very inefficient.
630 Unfortunately noweb doesn't have any characteristic that would help to
631 identify one of its error messages.
632 The solution is to collect all possible output messages in an array of
633 strings, and turn the examination process into a linear search in this
637 \begin_layout Standard
638 \begin_inset Flex Chunk
641 \begin_layout Plain Layout
645 \begin_layout Plain Layout
647 <<Global variables>>=
650 \begin_layout Plain Layout
652 char *noweb_msgs[] = {
655 \begin_layout Plain Layout
657 "couldn't open file",
660 \begin_layout Plain Layout
662 "couldn't open temporary file",
665 \begin_layout Plain Layout
667 "error writing temporary file",
670 \begin_layout Plain Layout
675 \begin_layout Plain Layout
680 \begin_layout Plain Layout
682 "Bad format sequence",
685 \begin_layout Plain Layout
687 "Can't open output file",
690 \begin_layout Plain Layout
692 "Can't open temporary file",
695 \begin_layout Plain Layout
697 "Capacity exceeded:",
700 \begin_layout Plain Layout
702 "Ignoring unknown option -",
705 \begin_layout Plain Layout
707 "This can't happen:",
710 \begin_layout Plain Layout
712 "non-numeric line number in"
715 \begin_layout Plain Layout
720 \begin_layout Plain Layout
724 \begin_layout Plain Layout
726 char *noweb_msgs_mimic_gcc[] = {
729 \begin_layout Plain Layout
731 ": unescaped << in documentation chunk"
734 \begin_layout Plain Layout
744 \begin_layout Standard
745 A noweb error message can be any string that contains a matching pair of
758 > >, or any of the above strings
761 \begin_layout Standard
765 \begin_layout Plain Layout
770 \begin_layout Plain Layout
772 int noweb_try (int buf_line)
775 \begin_layout Plain Layout
780 \begin_layout Plain Layout
785 \begin_layout Plain Layout
790 \begin_layout Plain Layout
794 \begin_layout Plain Layout
796 b = buffer[buf_line];
799 \begin_layout Plain Layout
804 \begin_layout Plain Layout
808 \begin_layout Plain Layout
810 for (i=0; i<1; i++) {
813 \begin_layout Plain Layout
815 s = (char *)strstr (b, noweb_msgs_mimic_gcc[i]);
818 \begin_layout Plain Layout
823 \begin_layout Plain Layout
825 t = (char *)strchr(buffer[buf_line], ':');
828 \begin_layout Plain Layout
830 err_line = atoi(t+1);
833 \begin_layout Plain Layout
835 t = buffer[buf_line];
838 \begin_layout Plain Layout
843 \begin_layout Plain Layout
845 while (*(t++) = *(s++));
848 \begin_layout Plain Layout
853 \begin_layout Plain Layout
858 \begin_layout Plain Layout
863 \begin_layout Plain Layout
865 s = (char *)strstr(b, "<<");
868 \begin_layout Plain Layout
873 \begin_layout Plain Layout
875 s = (char *)strstr(s+2, ">>");
878 \begin_layout Plain Layout
883 \begin_layout Plain Layout
888 \begin_layout Plain Layout
893 \begin_layout Plain Layout
898 \begin_layout Plain Layout
900 for (i = 0; i < 12; ++i) {
903 \begin_layout Plain Layout
905 s = (char *)strstr (b, noweb_msgs[i]);
908 \begin_layout Plain Layout
913 \begin_layout Plain Layout
918 \begin_layout Plain Layout
923 \begin_layout Plain Layout
928 \begin_layout Plain Layout
933 \begin_layout Plain Layout
938 \begin_layout Plain Layout
943 \begin_layout Plain Layout
953 \begin_layout Standard
957 \begin_layout Plain Layout
959 <<Function prototypes>>=
962 \begin_layout Plain Layout
964 int noweb_try (int buf_line);
967 \begin_layout Plain Layout
977 \begin_layout Standard
978 The xlc compiler always outputs one single line for each error found, thus
979 to scan the buffer for xlc error messages it is enough to exam one input
983 \begin_layout Standard
984 \begin_inset Flex Chunk
987 \begin_layout Plain Layout
989 \begin_inset Argument 1
992 \begin_layout Plain Layout
993 Scan input for xlc error messages
1001 \begin_layout Plain Layout
1006 \begin_layout Plain Layout
1008 while (fgets(buffer[last_buf_line], 200, stdin)) {
1011 \begin_layout Plain Layout
1016 \begin_layout Plain Layout
1018 output_error(1, err_line, "xlc");
1021 \begin_layout Plain Layout
1026 \begin_layout Plain Layout
1036 \begin_layout Standard
1037 A xlc error message is easy to identify.
1038 Every error message starts with a quoted string with no spaces, a comma,
1040 \begin_inset Quotes eld
1044 \begin_inset Quotes erd
1047 , a space, and some variable text.
1048 The following routine tests if a given buffer line matches this criteria:
1051 \begin_layout Standard
1052 \begin_inset Flex Chunk
1055 \begin_layout Plain Layout
1059 \begin_layout Plain Layout
1063 \begin_layout Plain Layout
1065 <<Function bodies>>=
1068 \begin_layout Plain Layout
1073 \begin_layout Plain Layout
1075 xlc_try (int buf_line)
1078 \begin_layout Plain Layout
1083 \begin_layout Plain Layout
1088 \begin_layout Plain Layout
1093 \begin_layout Plain Layout
1095 t = buffer[buf_line];
1098 \begin_layout Plain Layout
1103 \begin_layout Plain Layout
1105 while (*s != '"' && *s != ' ' && *s != '
1110 \begin_layout Plain Layout
1115 \begin_layout Plain Layout
1117 if (*t != '"' || *s != '"' || strncmp(s+1, ", line ", 7) != 0)
1120 \begin_layout Plain Layout
1125 \begin_layout Plain Layout
1130 \begin_layout Plain Layout
1135 \begin_layout Plain Layout
1140 \begin_layout Plain Layout
1150 \begin_layout Standard
1151 \begin_inset Flex Chunk
1154 \begin_layout Plain Layout
1156 \begin_inset Argument 1
1159 \begin_layout Plain Layout
1165 int xlc_try (int buf_line);
1173 \begin_layout Standard
1174 The gcc compiler error messages are more complicated to scan.
1175 Each error can span more than one line in the buffer.
1176 The good news is that every buffer line on each error has the same pattern,
1177 and share the same line number.
1178 Thus the strategy will be to accumulate lines in the buffer while the reported
1179 line number is still the same.
1180 At the time they differ, all the accumulated lines, except the last one,
1181 will belong to one single error message, which now can be output-ed to
1186 \begin_layout Standard
1187 Every gcc error message contains a string with no space followed by a
1188 \begin_inset Quotes eld
1192 \begin_inset Quotes eld
1196 If the next character is a space, then this line is a header of a error
1197 message and the next line will detail the line number of the source code
1198 where the error was found.
1199 Otherwise, the next thing is a integer number followed by another
1200 \begin_inset Quotes eld
1204 \begin_inset Quotes eld
1210 \begin_layout Standard
1211 \begin_inset Flex Chunk
1214 \begin_layout Plain Layout
1216 \begin_inset Argument 1
1219 \begin_layout Plain Layout
1220 Scan input for gcc error messages
1228 \begin_layout Plain Layout
1233 \begin_layout Plain Layout
1238 \begin_layout Plain Layout
1243 \begin_layout Plain Layout
1245 while (fgets(buffer[last_buf_line], 200, stdin)) {
1248 \begin_layout Plain Layout
1250 /****** Skip lines until I find an error */
1253 \begin_layout Plain Layout
1255 s = (char *)strpbrk(buffer[last_buf_line], " :");
1258 \begin_layout Plain Layout
1260 if (s == NULL || *s == ' ')
1263 \begin_layout Plain Layout
1265 continue; /* No gcc error found here */
1268 \begin_layout Plain Layout
1273 \begin_layout Plain Layout
1275 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1278 \begin_layout Plain Layout
1280 /****** OK It is an error message, get line number */
1283 \begin_layout Plain Layout
1285 err_line = atoi(s+1);
1288 \begin_layout Plain Layout
1290 if (last_err_line == 0 || last_err_line == err_line) {
1293 \begin_layout Plain Layout
1295 last_err_line = err_line;
1298 \begin_layout Plain Layout
1300 continue; /* It's either a header or a continuation, don't output
1304 \begin_layout Plain Layout
1309 \begin_layout Plain Layout
1311 /****** Completed the scan of one error message, output it to LyX
1315 \begin_layout Plain Layout
1317 discharge_buffer(1);
1320 \begin_layout Plain Layout
1325 \begin_layout Plain Layout
1327 } while (fgets(buffer[last_buf_line], 200, stdin));
1330 \begin_layout Plain Layout
1335 \begin_layout Plain Layout
1337 /****** EOF completes the scan of whatever was being scanned */
1340 \begin_layout Plain Layout
1342 discharge_buffer(0);
1345 \begin_layout Plain Layout
1355 \begin_layout Standard
1356 \begin_inset Flex Chunk
1359 \begin_layout Plain Layout
1361 \begin_inset Argument 1
1364 \begin_layout Plain Layout
1365 gcc error message criteria is to find a "...:999:" or a "...: "
1370 /****** Search first ":" in the error number */
1373 \begin_layout Plain Layout
1375 s = (char *)strpbrk(buffer[last_buf_line], " :");
1378 \begin_layout Plain Layout
1383 \begin_layout Plain Layout
1385 if (s == NULL || *s == ' ')
1388 \begin_layout Plain Layout
1390 <<No gcc error found here, but it might terminate the scanning of a previous
1394 \begin_layout Plain Layout
1396 /****** Search second ":" in the error number */
1399 \begin_layout Plain Layout
1401 t = (char *)strpbrk(s+1, " :");if (t == NULL || *t == ' ') <<No gcc error
1402 found here, but it might terminate the scanning of a previous one>>/******
1403 Verify if is all digits between ":" */if (t != s+1+strspn(s+1, "0123456789"))
1404 <<No gcc error found here, but it might terminate the scanning of a previous
1408 \begin_layout Plain Layout
1412 \begin_layout Plain Layout
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
1427 \begin_layout Plain Layout
1432 \begin_layout Plain Layout
1434 discharge_buffer(1);
1437 \begin_layout Plain Layout
1442 \begin_layout Plain Layout
1452 \begin_layout Standard
1453 As we mentioned, when the scan of one gcc error message is completed everything
1454 in the buffer except the last line is one single error message.
1455 But if the scan terminates with a EOF or through finding one line that
1456 does not match the gcc error message criteria, then there is no
1457 \begin_inset Quotes eld
1461 \begin_inset Quotes erd
1464 in the buffer to be concerned with.
1465 In those cases we empty the buffer completely.
1468 \begin_layout Standard
1469 \begin_inset Flex Chunk
1472 \begin_layout Plain Layout
1476 \begin_layout Plain Layout
1480 \begin_layout Plain Layout
1482 <<Function bodies>>=
1485 \begin_layout Plain Layout
1490 \begin_layout Plain Layout
1492 discharge_buffer (int save_last)
1495 \begin_layout Plain Layout
1500 \begin_layout Plain Layout
1502 if (last_err_line != 0) {
1505 \begin_layout Plain Layout
1507 clean_gcc_messages();
1510 \begin_layout Plain Layout
1512 if (save_last != 0) {
1515 \begin_layout Plain Layout
1517 output_error(last_buf_line-1, last_err_line, "gcc");
1520 \begin_layout Plain Layout
1522 strcpy (buffer[0], buffer[last_buf_line-1]);
1525 \begin_layout Plain Layout
1527 last_err_line = err_line;
1530 \begin_layout Plain Layout
1535 \begin_layout Plain Layout
1540 \begin_layout Plain Layout
1545 \begin_layout Plain Layout
1547 clean_gcc_messages();
1550 \begin_layout Plain Layout
1552 output_error(last_buf_line-1, last_err_line, "gcc");
1555 \begin_layout Plain Layout
1560 \begin_layout Plain Layout
1565 \begin_layout Plain Layout
1570 \begin_layout Plain Layout
1575 \begin_layout Plain Layout
1585 \begin_layout Standard
1586 \begin_inset Flex Chunk
1589 \begin_layout Plain Layout
1591 \begin_inset Argument 1
1594 \begin_layout Plain Layout
1600 void discharge_buffer (int save_last);
1608 \begin_layout Standard
1610 \begin_inset Quotes eld
1614 \begin_inset Quotes erd
1617 superfluous information from gcc messages, namely the name of the noweb
1618 file and the line number of the Error.
1622 \begin_layout Plain Layout
1624 For instance, some way of distinguishing between gcc Errors and Warnings
1633 \begin_layout Standard
1634 \begin_inset Flex Chunk
1637 \begin_layout Plain Layout
1639 \begin_inset Argument 1
1642 \begin_layout Plain Layout
1651 \begin_layout Plain Layout
1653 clean_gcc_messages ()
1656 \begin_layout Plain Layout
1661 \begin_layout Plain Layout
1666 \begin_layout Plain Layout
1671 \begin_layout Plain Layout
1676 \begin_layout Plain Layout
1678 int search_len = sprintf(search, ".nw:%d:", last_err_line);
1681 \begin_layout Plain Layout
1686 \begin_layout Plain Layout
1688 for (index = 0; index < last_buf_line-1; index++) {
1691 \begin_layout Plain Layout
1693 tail = (char *)strstr (buffer[index], search);
1696 \begin_layout Plain Layout
1698 if ( tail == NULL) {
1701 \begin_layout Plain Layout
1703 tail = (char *) strstr (buffer[index], ".nw:");
1706 \begin_layout Plain Layout
1711 \begin_layout Plain Layout
1716 \begin_layout Plain Layout
1721 \begin_layout Plain Layout
1726 \begin_layout Plain Layout
1731 \begin_layout Plain Layout
1736 \begin_layout Plain Layout
1741 \begin_layout Plain Layout
1743 head = buffer[index];
1746 \begin_layout Plain Layout
1748 while (*(head++) = *(tail++));
1751 \begin_layout Plain Layout
1756 \begin_layout Plain Layout
1761 \begin_layout Plain Layout
1771 \begin_layout Standard
1772 \begin_inset Flex Chunk
1775 \begin_layout Plain Layout
1777 \begin_inset Argument 1
1780 \begin_layout Plain Layout
1786 void clean_gcc_messages ();
1794 \begin_layout Standard
1795 To combine the scan of noweb error messages and xlc error messages is very
1797 We just try each one for every input line:
1800 \begin_layout Standard
1804 \begin_layout Plain Layout
1806 <<AIX system using both noweb and xlc>>=
1809 \begin_layout Plain Layout
1814 \begin_layout Plain Layout
1819 \begin_layout Plain Layout
1821 while (fgets(buffer[0], 200, stdin)) {
1824 \begin_layout Plain Layout
1829 \begin_layout Plain Layout
1831 output_error(1, err_line, "noweb");
1834 \begin_layout Plain Layout
1836 else if (xlc_try(0))
1839 \begin_layout Plain Layout
1841 output_error(1, err_line, "xlc");
1844 \begin_layout Plain Layout
1849 \begin_layout Plain Layout
1854 \begin_layout Plain Layout
1864 \begin_layout Standard
1865 To combine the scan of noweb error messages and gcc error messages is simple
1866 if we realize that it is not possible to find a noweb error message in
1867 the middle of a gcc error message.
1868 So we just repeat the gcc procedure and test for noweb error messages in
1869 the beginning of the scan:
1872 \begin_layout Standard
1873 \begin_inset Flex Chunk
1876 \begin_layout Plain Layout
1878 \begin_inset Argument 1
1881 \begin_layout Plain Layout
1882 Solaris and Linux systems using both noweb and gcc
1890 \begin_layout Plain Layout
1895 \begin_layout Plain Layout
1900 \begin_layout Plain Layout
1905 \begin_layout Plain Layout
1907 while (fgets(buffer[last_buf_line], 200, stdin)) {
1910 \begin_layout Plain Layout
1912 /****** Skip lines until I find an error */
1915 \begin_layout Plain Layout
1917 if (last_buf_line == 0 && noweb_try(0)) {
1920 \begin_layout Plain Layout
1922 output_error(1, err_line, "noweb");
1925 \begin_layout Plain Layout
1930 \begin_layout Plain Layout
1935 \begin_layout Plain Layout
1937 s = (char *)strpbrk(buffer[last_buf_line], " :");
1940 \begin_layout Plain Layout
1942 if (s == NULL || *s == ' ')
1945 \begin_layout Plain Layout
1947 continue; /* No gcc error found here */
1950 \begin_layout Plain Layout
1955 \begin_layout Plain Layout
1957 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1960 \begin_layout Plain Layout
1962 /****** OK It is an error, get line number */
1965 \begin_layout Plain Layout
1967 err_line = atoi(s+1);
1970 \begin_layout Plain Layout
1972 if (last_err_line == 0 || last_err_line == err_line) {
1975 \begin_layout Plain Layout
1977 last_err_line = err_line;
1980 \begin_layout Plain Layout
1982 continue; /* It's either a header or a continuation, don't output
1986 \begin_layout Plain Layout
1991 \begin_layout Plain Layout
1993 /****** Completed the scan of one error message, output it to LyX
1997 \begin_layout Plain Layout
1999 discharge_buffer(1);
2002 \begin_layout Plain Layout
2007 \begin_layout Plain Layout
2009 } while (fgets(buffer[last_buf_line], 200, stdin));
2012 \begin_layout Plain Layout
2017 \begin_layout Plain Layout
2019 /****** EOF completes the scan of whatever was being scanned */
2022 \begin_layout Plain Layout
2024 discharge_buffer(0);
2027 \begin_layout Plain Layout
2037 \begin_layout Section
2038 Wrapping the code into a file
2041 \begin_layout Standard
2042 \begin_inset Flex Chunk
2045 \begin_layout Plain Layout
2047 \begin_inset Argument 1
2050 \begin_layout Plain Layout
2059 \begin_layout Plain Layout
2061 #include <strings.h>
2064 \begin_layout Plain Layout
2069 \begin_layout Plain Layout
2071 <<Global variables>>
2074 \begin_layout Plain Layout
2076 <<Function prototypes>>
2079 \begin_layout Plain Layout
2089 \begin_layout Standard
2090 To build this program, we want to add the
2091 \begin_inset Quotes eld
2095 \begin_inset Quotes erd
2098 option in the tangle command to force gdb to load the file
2107 In accordance with this, we pass the
2108 \begin_inset Quotes eld
2112 \begin_inset Quotes erd
2118 \begin_layout Standard
2119 \begin_inset Flex Chunk
2122 \begin_layout Plain Layout
2124 \begin_inset Argument 1
2127 \begin_layout Plain Layout
2136 \begin_layout Plain Layout
2138 if [ -z "$NOWEB_SOURCE" ]; then NOWEB_SOURCE=Literate.nw; fi
2141 \begin_layout Plain Layout
2143 if [ -z "$NOWEB_OUTPUT_DIR" ]; then NOWEB_OUTPUT_DIR=.; fi
2146 \begin_layout Plain Layout
2148 notangle -L -Rlisterrors.c ${NOWEB_SOURCE} > ${NOWEB_OUTPUT_DIR}/listerrors.c
2151 \begin_layout Plain Layout
2153 gcc -g -o listerrors listerrors.c
2161 \begin_layout Standard
2162 This project can be tangled and compiled from \SpecialChar LyX
2169 to call a generic script that always extracts a chunk named
2174 Here is a example of such generic script:
2177 \begin_layout LyX-Code
2179 \begin_inset Newline newline
2182 notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 NOWEB_OUTPUT_DIR=$r sh
2185 \begin_layout LyX-Code