1 #LyX 2.3 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 \use_dash_ligatures false
30 \default_output_format default
32 \bibtex_command default
33 \index_command default
34 \paperfontsize default
39 \use_package amsmath 0
40 \use_package amssymb 0
43 \use_package mathdots 1
44 \use_package mathtools 0
46 \use_package stackrel 0
47 \use_package stmaryrd 0
48 \use_package undertilde 0
50 \cite_engine_type default
54 \paperorientation portrait
64 \paragraph_separation indent
65 \paragraph_indentation default
67 \math_numbering_side default
71 \paperpagestyle default
72 \tracking_changes false
84 and Literate Programming
85 \begin_inset Newline newline
93 \begin_inset Newline newline
96 edmar-w-jr@technologist.com
100 \begin_layout Plain Layout
101 Modified by Bernard Michael Hurley bernardh@westherts.ac.uk —- Don't blame
102 Edmar for any errors that have crept in!
114 \begin_layout Plain Layout
126 \begin_layout Abstract
131 This example program is provided for educational use only.
132 The functionality in this C program has been superceded by the equivalent
135 examples/listerrors.lyx
137 which should be installed in the \SpecialChar LyX
141 \begin_layout Standard
142 \begin_inset CommandInset toc
143 LatexCommand tableofcontents
150 \begin_layout Section
154 \begin_layout Standard
155 After typesetting a document, \SpecialChar LyX
156 scans the \SpecialChar LaTeX
157 log file looking for errors.
158 For each error found, the line number is obtained and a error box is displayed
159 in the \SpecialChar LyX
160 screen at that position.
163 \begin_layout Standard
164 To use this feature to view compilation errors while working with literate
165 documents, we need a program that filters the compilation errors and puts
166 them in a format suitable for \SpecialChar LyX
171 \begin_layout Standard
172 In this document we present a filter that recognizes compilation error messages
173 from noweb, gnu C, and the IBM C compiler (xlc).
176 \begin_layout Standard
177 The filter is required to read from standard input, parse for error messages
178 and copy the error messages to the standard output.
179 During the output process, the filter must present the error messages in
180 a format that \SpecialChar LyX
181 can interpret, currently, the \SpecialChar LaTeX
182 error message format.
183 Of course, nothing will prevent future \SpecialChar LyX
184 releases from being able to read
185 other formats as well (like gcc error messages for example).
186 This mechanism is necessary to fully explore the literate programming tool's
190 \begin_layout Section
194 \begin_layout Standard
195 \begin_inset Flex Chunk
198 \begin_layout Plain Layout
200 \begin_inset Argument 1
203 \begin_layout Plain Layout
212 \begin_layout Plain Layout
214 main (int argc, char **argv)
217 \begin_layout Plain Layout
222 \begin_layout Plain Layout
227 \begin_layout Plain Layout
229 switch (argv[1][0]) {
232 \begin_layout Plain Layout
237 \begin_layout Plain Layout
239 <<Scan input for noweb error messages>>
242 \begin_layout Plain Layout
247 \begin_layout Plain Layout
252 \begin_layout Plain Layout
254 <<Scan input for xlc error messages>>
257 \begin_layout Plain Layout
262 \begin_layout Plain Layout
267 \begin_layout Plain Layout
269 <<AIX system using both noweb and xlc>>
272 \begin_layout Plain Layout
277 \begin_layout Plain Layout
282 \begin_layout Plain Layout
287 \begin_layout Plain Layout
289 <<Solaris and Linux systems using both noweb and gcc>>
292 \begin_layout Plain Layout
297 \begin_layout Plain Layout
302 \begin_layout Plain Layout
307 \begin_layout Plain Layout
309 <<Scan input for gcc error messages>>
312 \begin_layout Plain Layout
317 \begin_layout Plain Layout
322 \begin_layout Plain Layout
327 \begin_layout Plain Layout
329 <<Scan input for gcc error messages>>
332 \begin_layout Plain Layout
337 \begin_layout Plain Layout
347 \begin_layout Standard
348 \begin_inset Flex Chunk
351 \begin_layout Plain Layout
353 \begin_inset Argument 1
356 \begin_layout Plain Layout
362 int main (int argc, char **argv);
370 \begin_layout Section
374 \begin_layout Standard
375 We resort to some global variables to allow access from several different
377 These are the buffer and related pointers used during the parse of the
381 \begin_layout Standard
385 \begin_layout Plain Layout
387 <<Global variables>>=
390 \begin_layout Plain Layout
392 char buffer[200][200];
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
464 \begin_layout Plain Layout
466 output_error (int buf_size, int error_line, char *tool)
469 \begin_layout Plain Layout
474 \begin_layout Plain Layout
479 \begin_layout Plain Layout
484 \begin_layout Plain Layout
486 fprintf(stdout, "! Build Error: ==> %s ==>
491 \begin_layout Plain Layout
493 fprintf(stdout, " ...
502 \begin_layout Plain Layout
507 \begin_layout Plain Layout
509 for (i=0; i<buf_size; i++)
512 \begin_layout Plain Layout
514 if (strlen(buffer[i]) != 0)
517 \begin_layout Plain Layout
519 fprintf(stdout, "%s", buffer[i]);
522 \begin_layout Plain Layout
527 \begin_layout Plain Layout
534 \begin_layout Plain Layout
544 \begin_layout Standard
545 \begin_inset Flex Chunk
548 \begin_layout Plain Layout
550 \begin_inset Argument 1
553 \begin_layout Plain Layout
559 void output_error (int buf_size, int error_line, char *tool);
567 \begin_layout Section
568 Functions Implementation
571 \begin_layout Standard
572 Both noweave and notangle routines, always output one single line for each
573 error found, thus to scan the buffer for noweb error messages is enough
574 to exam one input line at a time.
575 Note that the noweb software does not provide a line error number, so all
576 errors boxes related to noweb messages will be displayed at the beginning
580 \begin_layout Standard
581 \begin_inset Flex Chunk
584 \begin_layout Plain Layout
586 \begin_inset Argument 1
589 \begin_layout Plain Layout
590 Scan input for noweb error messages
598 \begin_layout Plain Layout
603 \begin_layout Plain Layout
605 while (fgets(buffer[0], 200, stdin)) {
608 \begin_layout Plain Layout
613 \begin_layout Plain Layout
615 output_error(1, err_line, "noweb");
618 \begin_layout Plain Layout
623 \begin_layout Plain Layout
633 \begin_layout Standard
634 The examination itself is very inefficient.
635 Unfortunately noweb doesn't have any characteristic that would help to
636 identify one of its error messages.
637 The solution is to collect all possible output messages in an array of
638 strings, and turn the examination process into a linear search in this
642 \begin_layout Standard
643 \begin_inset Flex Chunk
646 \begin_layout Plain Layout
650 \begin_layout Plain Layout
652 <<Global variables>>=
655 \begin_layout Plain Layout
657 char *noweb_msgs[] = {
660 \begin_layout Plain Layout
662 "couldn't open file",
665 \begin_layout Plain Layout
667 "couldn't open temporary file",
670 \begin_layout Plain Layout
672 "error writing temporary file",
675 \begin_layout Plain Layout
680 \begin_layout Plain Layout
685 \begin_layout Plain Layout
687 "Bad format sequence",
690 \begin_layout Plain Layout
692 "Can't open output file",
695 \begin_layout Plain Layout
697 "Can't open temporary file",
700 \begin_layout Plain Layout
702 "Capacity exceeded:",
705 \begin_layout Plain Layout
707 "Ignoring unknown option -",
710 \begin_layout Plain Layout
712 "This can't happen:",
715 \begin_layout Plain Layout
717 "non-numeric line number in"
720 \begin_layout Plain Layout
725 \begin_layout Plain Layout
729 \begin_layout Plain Layout
731 char *noweb_msgs_mimic_gcc[] = {
734 \begin_layout Plain Layout
736 ": unescaped << in documentation chunk"
739 \begin_layout Plain Layout
749 \begin_layout Standard
750 A noweb error message can be any string that contains a matching pair of
763 > >, or any of the above strings
766 \begin_layout Standard
770 \begin_layout Plain Layout
775 \begin_layout Plain Layout
777 int noweb_try (int buf_line)
780 \begin_layout Plain Layout
785 \begin_layout Plain Layout
790 \begin_layout Plain Layout
795 \begin_layout Plain Layout
799 \begin_layout Plain Layout
801 b = buffer[buf_line];
804 \begin_layout Plain Layout
809 \begin_layout Plain Layout
813 \begin_layout Plain Layout
815 for (i=0; i<1; i++) {
818 \begin_layout Plain Layout
820 s = (char *)strstr (b, noweb_msgs_mimic_gcc[i]);
823 \begin_layout Plain Layout
828 \begin_layout Plain Layout
830 t = (char *)strchr(buffer[buf_line], ':');
833 \begin_layout Plain Layout
835 err_line = atoi(t+1);
838 \begin_layout Plain Layout
840 t = buffer[buf_line];
843 \begin_layout Plain Layout
848 \begin_layout Plain Layout
850 while (*(t++) = *(s++));
853 \begin_layout Plain Layout
858 \begin_layout Plain Layout
863 \begin_layout Plain Layout
868 \begin_layout Plain Layout
870 s = (char *)strstr(b, "<<");
873 \begin_layout Plain Layout
878 \begin_layout Plain Layout
880 s = (char *)strstr(s+2, ">>");
883 \begin_layout Plain Layout
888 \begin_layout Plain Layout
893 \begin_layout Plain Layout
898 \begin_layout Plain Layout
903 \begin_layout Plain Layout
905 for (i = 0; i < 12; ++i) {
908 \begin_layout Plain Layout
910 s = (char *)strstr (b, noweb_msgs[i]);
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
948 \begin_layout Plain Layout
958 \begin_layout Standard
962 \begin_layout Plain Layout
964 <<Function prototypes>>=
967 \begin_layout Plain Layout
969 int noweb_try (int buf_line);
972 \begin_layout Plain Layout
982 \begin_layout Standard
983 The xlc compiler always outputs one single line for each error found, thus
984 to scan the buffer for xlc error messages it is enough to exam one input
988 \begin_layout Standard
989 \begin_inset Flex Chunk
992 \begin_layout Plain Layout
994 \begin_inset Argument 1
997 \begin_layout Plain Layout
998 Scan input for xlc error messages
1006 \begin_layout Plain Layout
1011 \begin_layout Plain Layout
1013 while (fgets(buffer[last_buf_line], 200, stdin)) {
1016 \begin_layout Plain Layout
1021 \begin_layout Plain Layout
1023 output_error(1, err_line, "xlc");
1026 \begin_layout Plain Layout
1031 \begin_layout Plain Layout
1041 \begin_layout Standard
1042 A xlc error message is easy to identify.
1043 Every error message starts with a quoted string with no spaces, a comma,
1045 \begin_inset Quotes eld
1049 \begin_inset Quotes erd
1052 , a space, and some variable text.
1053 The following routine tests if a given buffer line matches this criteria:
1056 \begin_layout Standard
1057 \begin_inset Flex Chunk
1060 \begin_layout Plain Layout
1064 \begin_layout Plain Layout
1068 \begin_layout Plain Layout
1070 <<Function bodies>>=
1073 \begin_layout Plain Layout
1078 \begin_layout Plain Layout
1080 xlc_try (int buf_line)
1083 \begin_layout Plain Layout
1088 \begin_layout Plain Layout
1093 \begin_layout Plain Layout
1098 \begin_layout Plain Layout
1100 t = buffer[buf_line];
1103 \begin_layout Plain Layout
1108 \begin_layout Plain Layout
1110 while (*s != '"' && *s != ' ' && *s != '
1115 \begin_layout Plain Layout
1120 \begin_layout Plain Layout
1122 if (*t != '"' || *s != '"' || strncmp(s+1, ", line ", 7) != 0)
1125 \begin_layout Plain Layout
1130 \begin_layout Plain Layout
1135 \begin_layout Plain Layout
1140 \begin_layout Plain Layout
1145 \begin_layout Plain Layout
1155 \begin_layout Standard
1156 \begin_inset Flex Chunk
1159 \begin_layout Plain Layout
1161 \begin_inset Argument 1
1164 \begin_layout Plain Layout
1170 int xlc_try (int buf_line);
1178 \begin_layout Standard
1179 The gcc compiler error messages are more complicated to scan.
1180 Each error can span more than one line in the buffer.
1181 The good news is that every buffer line on each error has the same pattern,
1182 and share the same line number.
1183 Thus the strategy will be to accumulate lines in the buffer while the reported
1184 line number is still the same.
1185 At the time they differ, all the accumulated lines, except the last one,
1186 will belong to one single error message, which now can be output-ed to
1191 \begin_layout Standard
1192 Every gcc error message contains a string with no space followed by a
1193 \begin_inset Quotes eld
1197 \begin_inset Quotes eld
1201 If the next character is a space, then this line is a header of a error
1202 message and the next line will detail the line number of the source code
1203 where the error was found.
1204 Otherwise, the next thing is a integer number followed by another
1205 \begin_inset Quotes eld
1209 \begin_inset Quotes eld
1215 \begin_layout Standard
1216 \begin_inset Flex Chunk
1219 \begin_layout Plain Layout
1221 \begin_inset Argument 1
1224 \begin_layout Plain Layout
1225 Scan input for gcc error messages
1233 \begin_layout Plain Layout
1238 \begin_layout Plain Layout
1243 \begin_layout Plain Layout
1248 \begin_layout Plain Layout
1250 while (fgets(buffer[last_buf_line], 200, stdin)) {
1253 \begin_layout Plain Layout
1255 /****** Skip lines until I find an error */
1258 \begin_layout Plain Layout
1260 s = (char *)strpbrk(buffer[last_buf_line], " :");
1263 \begin_layout Plain Layout
1265 if (s == NULL || *s == ' ')
1268 \begin_layout Plain Layout
1270 continue; /* No gcc error found here */
1273 \begin_layout Plain Layout
1278 \begin_layout Plain Layout
1280 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1283 \begin_layout Plain Layout
1285 /****** OK It is an error message, get line number */
1288 \begin_layout Plain Layout
1290 err_line = atoi(s+1);
1293 \begin_layout Plain Layout
1295 if (last_err_line == 0 || last_err_line == err_line) {
1298 \begin_layout Plain Layout
1300 last_err_line = err_line;
1303 \begin_layout Plain Layout
1305 continue; /* It's either a header or a continuation, don't output
1309 \begin_layout Plain Layout
1314 \begin_layout Plain Layout
1316 /****** Completed the scan of one error message, output it to LyX
1320 \begin_layout Plain Layout
1322 discharge_buffer(1);
1325 \begin_layout Plain Layout
1330 \begin_layout Plain Layout
1332 } while (fgets(buffer[last_buf_line], 200, stdin));
1335 \begin_layout Plain Layout
1340 \begin_layout Plain Layout
1342 /****** EOF completes the scan of whatever was being scanned */
1345 \begin_layout Plain Layout
1347 discharge_buffer(0);
1350 \begin_layout Plain Layout
1360 \begin_layout Standard
1361 \begin_inset Flex Chunk
1364 \begin_layout Plain Layout
1366 \begin_inset Argument 1
1369 \begin_layout Plain Layout
1370 gcc error message criteria is to find a "...:999:" or a "...: "
1375 /****** Search first ":" in the error number */
1378 \begin_layout Plain Layout
1380 s = (char *)strpbrk(buffer[last_buf_line], " :");
1383 \begin_layout Plain Layout
1388 \begin_layout Plain Layout
1390 if (s == NULL || *s == ' ')
1393 \begin_layout Plain Layout
1395 <<No gcc error found here, but it might terminate the scanning of a previous
1399 \begin_layout Plain Layout
1401 /****** Search second ":" in the error number */
1404 \begin_layout Plain Layout
1406 t = (char *)strpbrk(s+1, " :");if (t == NULL || *t == ' ') <<No gcc error
1407 found here, but it might terminate the scanning of a previous one>>/******
1408 Verify if is all digits between ":" */if (t != s+1+strspn(s+1, "0123456789"))
1409 <<No gcc error found here, but it might terminate the scanning of a previous
1413 \begin_layout Plain Layout
1417 \begin_layout Plain Layout
1421 \begin_layout Plain Layout
1423 <<No gcc error found here, but it might terminate the scanning of a previous
1427 \begin_layout Plain Layout
1432 \begin_layout Plain Layout
1437 \begin_layout Plain Layout
1439 discharge_buffer(1);
1442 \begin_layout Plain Layout
1447 \begin_layout Plain Layout
1457 \begin_layout Standard
1458 As we mentioned, when the scan of one gcc error message is completed everything
1459 in the buffer except the last line is one single error message.
1460 But if the scan terminates with a EOF or through finding one line that
1461 does not match the gcc error message criteria, then there is no
1462 \begin_inset Quotes eld
1466 \begin_inset Quotes erd
1469 in the buffer to be concerned with.
1470 In those cases we empty the buffer completely.
1473 \begin_layout Standard
1474 \begin_inset Flex Chunk
1477 \begin_layout Plain Layout
1481 \begin_layout Plain Layout
1485 \begin_layout Plain Layout
1487 <<Function bodies>>=
1490 \begin_layout Plain Layout
1495 \begin_layout Plain Layout
1497 discharge_buffer (int save_last)
1500 \begin_layout Plain Layout
1505 \begin_layout Plain Layout
1507 if (last_err_line != 0) {
1510 \begin_layout Plain Layout
1512 clean_gcc_messages();
1515 \begin_layout Plain Layout
1517 if (save_last != 0) {
1520 \begin_layout Plain Layout
1522 output_error(last_buf_line-1, last_err_line, "gcc");
1525 \begin_layout Plain Layout
1527 strcpy (buffer[0], buffer[last_buf_line-1]);
1530 \begin_layout Plain Layout
1532 last_err_line = err_line;
1535 \begin_layout Plain Layout
1540 \begin_layout Plain Layout
1545 \begin_layout Plain Layout
1550 \begin_layout Plain Layout
1552 clean_gcc_messages();
1555 \begin_layout Plain Layout
1557 output_error(last_buf_line-1, last_err_line, "gcc");
1560 \begin_layout Plain Layout
1565 \begin_layout Plain Layout
1570 \begin_layout Plain Layout
1575 \begin_layout Plain Layout
1580 \begin_layout Plain Layout
1590 \begin_layout Standard
1591 \begin_inset Flex Chunk
1594 \begin_layout Plain Layout
1596 \begin_inset Argument 1
1599 \begin_layout Plain Layout
1605 void discharge_buffer (int save_last);
1613 \begin_layout Standard
1615 \begin_inset Quotes eld
1619 \begin_inset Quotes erd
1622 superfluous information from gcc messages, namely the name of the noweb
1623 file and the line number of the Error.
1627 \begin_layout Plain Layout
1629 For instance, some way of distinguishing between gcc Errors and Warnings
1638 \begin_layout Standard
1639 \begin_inset Flex Chunk
1642 \begin_layout Plain Layout
1644 \begin_inset Argument 1
1647 \begin_layout Plain Layout
1656 \begin_layout Plain Layout
1658 clean_gcc_messages ()
1661 \begin_layout Plain Layout
1666 \begin_layout Plain Layout
1671 \begin_layout Plain Layout
1676 \begin_layout Plain Layout
1681 \begin_layout Plain Layout
1683 int search_len = sprintf(search, ".nw:%d:", last_err_line);
1686 \begin_layout Plain Layout
1691 \begin_layout Plain Layout
1693 for (index = 0; index < last_buf_line-1; index++) {
1696 \begin_layout Plain Layout
1698 tail = (char *)strstr (buffer[index], search);
1701 \begin_layout Plain Layout
1703 if ( tail == NULL) {
1706 \begin_layout Plain Layout
1708 tail = (char *) strstr (buffer[index], ".nw:");
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
1746 \begin_layout Plain Layout
1748 head = buffer[index];
1751 \begin_layout Plain Layout
1753 while (*(head++) = *(tail++));
1756 \begin_layout Plain Layout
1761 \begin_layout Plain Layout
1766 \begin_layout Plain Layout
1776 \begin_layout Standard
1777 \begin_inset Flex Chunk
1780 \begin_layout Plain Layout
1782 \begin_inset Argument 1
1785 \begin_layout Plain Layout
1791 void clean_gcc_messages ();
1799 \begin_layout Standard
1800 To combine the scan of noweb error messages and xlc error messages is very
1802 We just try each one for every input line:
1805 \begin_layout Standard
1809 \begin_layout Plain Layout
1811 <<AIX system using both noweb and xlc>>=
1814 \begin_layout Plain Layout
1819 \begin_layout Plain Layout
1824 \begin_layout Plain Layout
1826 while (fgets(buffer[0], 200, stdin)) {
1829 \begin_layout Plain Layout
1834 \begin_layout Plain Layout
1836 output_error(1, err_line, "noweb");
1839 \begin_layout Plain Layout
1841 else if (xlc_try(0))
1844 \begin_layout Plain Layout
1846 output_error(1, err_line, "xlc");
1849 \begin_layout Plain Layout
1854 \begin_layout Plain Layout
1859 \begin_layout Plain Layout
1869 \begin_layout Standard
1870 To combine the scan of noweb error messages and gcc error messages is simple
1871 if we realize that it is not possible to find a noweb error message in
1872 the middle of a gcc error message.
1873 So we just repeat the gcc procedure and test for noweb error messages in
1874 the beginning of the scan:
1877 \begin_layout Standard
1878 \begin_inset Flex Chunk
1881 \begin_layout Plain Layout
1883 \begin_inset Argument 1
1886 \begin_layout Plain Layout
1887 Solaris and Linux systems using both noweb and gcc
1895 \begin_layout Plain Layout
1900 \begin_layout Plain Layout
1905 \begin_layout Plain Layout
1910 \begin_layout Plain Layout
1912 while (fgets(buffer[last_buf_line], 200, stdin)) {
1915 \begin_layout Plain Layout
1917 /****** Skip lines until I find an error */
1920 \begin_layout Plain Layout
1922 if (last_buf_line == 0 && noweb_try(0)) {
1925 \begin_layout Plain Layout
1927 output_error(1, err_line, "noweb");
1930 \begin_layout Plain Layout
1935 \begin_layout Plain Layout
1940 \begin_layout Plain Layout
1942 s = (char *)strpbrk(buffer[last_buf_line], " :");
1945 \begin_layout Plain Layout
1947 if (s == NULL || *s == ' ')
1950 \begin_layout Plain Layout
1952 continue; /* No gcc error found here */
1955 \begin_layout Plain Layout
1960 \begin_layout Plain Layout
1962 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1965 \begin_layout Plain Layout
1967 /****** OK It is an error, get line number */
1970 \begin_layout Plain Layout
1972 err_line = atoi(s+1);
1975 \begin_layout Plain Layout
1977 if (last_err_line == 0 || last_err_line == err_line) {
1980 \begin_layout Plain Layout
1982 last_err_line = err_line;
1985 \begin_layout Plain Layout
1987 continue; /* It's either a header or a continuation, don't output
1991 \begin_layout Plain Layout
1996 \begin_layout Plain Layout
1998 /****** Completed the scan of one error message, output it to LyX
2002 \begin_layout Plain Layout
2004 discharge_buffer(1);
2007 \begin_layout Plain Layout
2012 \begin_layout Plain Layout
2014 } while (fgets(buffer[last_buf_line], 200, stdin));
2017 \begin_layout Plain Layout
2022 \begin_layout Plain Layout
2024 /****** EOF completes the scan of whatever was being scanned */
2027 \begin_layout Plain Layout
2029 discharge_buffer(0);
2032 \begin_layout Plain Layout
2042 \begin_layout Section
2043 Wrapping the code into a file
2046 \begin_layout Standard
2047 \begin_inset Flex Chunk
2050 \begin_layout Plain Layout
2052 \begin_inset Argument 1
2055 \begin_layout Plain Layout
2064 \begin_layout Plain Layout
2066 #include <strings.h>
2069 \begin_layout Plain Layout
2074 \begin_layout Plain Layout
2076 <<Global variables>>
2079 \begin_layout Plain Layout
2081 <<Function prototypes>>
2084 \begin_layout Plain Layout
2094 \begin_layout Standard
2095 To build this program, we want to add the
2096 \begin_inset Quotes eld
2100 \begin_inset Quotes erd
2103 option in the tangle command to force gdb to load the file
2112 In accordance with this, we pass the
2113 \begin_inset Quotes eld
2117 \begin_inset Quotes erd
2123 \begin_layout Standard
2124 \begin_inset Flex Chunk
2127 \begin_layout Plain Layout
2129 \begin_inset Argument 1
2132 \begin_layout Plain Layout
2141 \begin_layout Plain Layout
2143 if [ -z "$NOWEB_SOURCE" ]; then NOWEB_SOURCE=Literate.nw; fi
2146 \begin_layout Plain Layout
2148 if [ -z "$NOWEB_OUTPUT_DIR" ]; then NOWEB_OUTPUT_DIR=.; fi
2151 \begin_layout Plain Layout
2153 notangle -L -Rlisterrors.c ${NOWEB_SOURCE} > ${NOWEB_OUTPUT_DIR}/listerrors.c
2156 \begin_layout Plain Layout
2158 gcc -g -o listerrors listerrors.c
2166 \begin_layout Standard
2167 This project can be tangled and compiled from \SpecialChar LyX
2174 to call a generic script that always extracts a chunk named
2179 Here is a example of such generic script:
2182 \begin_layout LyX-Code
2184 \begin_inset Newline newline
2187 notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 NOWEB_OUTPUT_DIR=$r sh
2190 \begin_layout LyX-Code