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 false
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
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 1
40 \use_package amssymb 1
43 \use_package mathdots 1
44 \use_package mathtools 1
46 \use_package stackrel 1
47 \use_package stmaryrd 1
48 \use_package undertilde 1
50 \cite_engine_type default
54 \paperorientation portrait
65 \paragraph_separation indent
66 \paragraph_indentation default
68 \math_numbering_side default
73 \paperpagestyle default
74 \tracking_changes false
85 and Literate Programming
86 \begin_inset Newline newline
94 \begin_inset Newline newline
97 edmar-w-jr@technologist.com
101 \begin_layout Plain Layout
102 Modified by Bernard Michael Hurley bernardh@westherts.ac.uk —- Don't blame
103 Edmar for any errors that have crept in!
111 \begin_layout Abstract
116 This example program is provided for educational use only.
117 The functionality in this C program has been superceded by the equivalent
120 examples/listerrors.lyx
122 which should be installed in the \SpecialChar LyX
126 \begin_layout Standard
127 \begin_inset CommandInset toc
128 LatexCommand tableofcontents
135 \begin_layout Section
139 \begin_layout Standard
140 After typesetting a document, \SpecialChar LyX
141 scans the \SpecialChar LaTeX
142 log file looking for errors.
143 For each error found, the line number is obtained and a error box is displayed
144 in the \SpecialChar LyX
145 screen at that position.
148 \begin_layout Standard
149 To use this feature to view compilation errors while working with literate
150 documents, we need a program that filters the compilation errors and puts
151 them in a format suitable for \SpecialChar LyX
156 \begin_layout Standard
157 In this document we present a filter that recognizes compilation error messages
158 from noweb, gnu C, and the IBM C compiler (xlc).
161 \begin_layout Standard
162 The filter is required to read from standard input, parse for error messages
163 and copy the error messages to the standard output.
164 During the output process, the filter must present the error messages in
165 a format that \SpecialChar LyX
166 can interpret, currently, the \SpecialChar LaTeX
167 error message format.
168 Of course, nothing will prevent future \SpecialChar LyX
169 releases from being able to read
170 other formats as well (like gcc error messages for example).
171 This mechanism is necessary to fully explore the literate programming tool's
175 \begin_layout Section
179 \begin_layout Standard
180 \begin_inset Flex Chunk
183 \begin_layout Plain Layout
185 \begin_inset Argument 1
188 \begin_layout Plain Layout
198 \begin_layout Plain Layout
200 main (int argc, char **argv)
203 \begin_layout Plain Layout
208 \begin_layout Plain Layout
213 \begin_layout Plain Layout
215 switch (argv[1][0]) {
218 \begin_layout Plain Layout
223 \begin_layout Plain Layout
225 <<Scan input for noweb error messages>>
228 \begin_layout Plain Layout
233 \begin_layout Plain Layout
238 \begin_layout Plain Layout
240 <<Scan input for xlc error messages>>
243 \begin_layout Plain Layout
248 \begin_layout Plain Layout
253 \begin_layout Plain Layout
255 <<AIX system using both noweb and xlc>>
258 \begin_layout Plain Layout
263 \begin_layout Plain Layout
268 \begin_layout Plain Layout
273 \begin_layout Plain Layout
275 <<Solaris and Linux systems using both noweb and gcc>>
278 \begin_layout Plain Layout
283 \begin_layout Plain Layout
288 \begin_layout Plain Layout
293 \begin_layout Plain Layout
295 <<Scan input for gcc error messages>>
298 \begin_layout Plain Layout
303 \begin_layout Plain Layout
308 \begin_layout Plain Layout
313 \begin_layout Plain Layout
315 <<Scan input for gcc error messages>>
318 \begin_layout Plain Layout
323 \begin_layout Plain Layout
333 \begin_layout Standard
334 \begin_inset Flex Chunk
337 \begin_layout Plain Layout
339 \begin_inset Argument 1
342 \begin_layout Plain Layout
349 int main (int argc, char **argv);
357 \begin_layout Section
361 \begin_layout Standard
362 We resort to some global variables to allow access from several different
364 These are the buffer and related pointers used during the parse of the
368 \begin_layout Standard
372 \begin_layout Plain Layout
374 <<Global variables>>=
377 \begin_layout Plain Layout
379 char buffer[200][200];
382 \begin_layout Plain Layout
387 \begin_layout Plain Layout
392 \begin_layout Plain Layout
402 \begin_layout Section
406 \begin_layout Standard
407 The output format mimics the \SpecialChar TeX
408 error messages format.
409 This function prints a number of lines residing in the global variable
414 , a program name and line number.
415 There is no special requirement on the input strings, they can be anything.
419 \begin_layout Plain Layout
420 This function has been slightly changed from EW's original to make scanning
421 a bit easier with \SpecialChar LaTeX
423 The test has been added because \SpecialChar LyX
424 can crash if empty lines are allowed here
425 — I can't figure out why! — BMH
433 \begin_layout Standard
434 \begin_inset Flex Chunk
437 \begin_layout Plain Layout
439 \begin_inset Argument 1
442 \begin_layout Plain Layout
452 \begin_layout Plain Layout
454 output_error (int buf_size, int error_line, char *tool)
457 \begin_layout Plain Layout
462 \begin_layout Plain Layout
467 \begin_layout Plain Layout
472 \begin_layout Plain Layout
474 fprintf(stdout, "! Build Error: ==> %s ==>
479 \begin_layout Plain Layout
481 fprintf(stdout, " ...
490 \begin_layout Plain Layout
495 \begin_layout Plain Layout
497 for (i=0; i<buf_size; i++)
500 \begin_layout Plain Layout
502 if (strlen(buffer[i]) != 0)
505 \begin_layout Plain Layout
507 fprintf(stdout, "%s", buffer[i]);
510 \begin_layout Plain Layout
515 \begin_layout Plain Layout
522 \begin_layout Plain Layout
532 \begin_layout Standard
533 \begin_inset Flex Chunk
536 \begin_layout Plain Layout
538 \begin_inset Argument 1
541 \begin_layout Plain Layout
548 void output_error (int buf_size, int error_line, char *tool);
556 \begin_layout Section
557 Functions Implementation
560 \begin_layout Standard
561 Both noweave and notangle routines, always output one single line for each
562 error found, thus to scan the buffer for noweb error messages is enough
563 to exam one input line at a time.
564 Note that the noweb software does not provide a line error number, so all
565 errors boxes related to noweb messages will be displayed at the beginning
569 \begin_layout Standard
570 \begin_inset Flex Chunk
573 \begin_layout Plain Layout
575 \begin_inset Argument 1
578 \begin_layout Plain Layout
580 Scan input for noweb error messages
588 \begin_layout Plain Layout
593 \begin_layout Plain Layout
595 while (fgets(buffer[0], 200, stdin)) {
598 \begin_layout Plain Layout
603 \begin_layout Plain Layout
605 output_error(1, err_line, "noweb");
608 \begin_layout Plain Layout
613 \begin_layout Plain Layout
623 \begin_layout Standard
624 The examination itself is very inefficient.
625 Unfortunately noweb doesn't have any characteristic that would help to
626 identify one of its error messages.
627 The solution is to collect all possible output messages in an array of
628 strings, and turn the examination process into a linear search in this
632 \begin_layout Standard
633 \begin_inset Flex Chunk
636 \begin_layout Plain Layout
640 \begin_layout Plain Layout
642 <<Global variables>>=
645 \begin_layout Plain Layout
647 char *noweb_msgs[] = {
650 \begin_layout Plain Layout
652 "couldn't open file",
655 \begin_layout Plain Layout
657 "couldn't open temporary file",
660 \begin_layout Plain Layout
662 "error writing temporary file",
665 \begin_layout Plain Layout
670 \begin_layout Plain Layout
675 \begin_layout Plain Layout
677 "Bad format sequence",
680 \begin_layout Plain Layout
682 "Can't open output file",
685 \begin_layout Plain Layout
687 "Can't open temporary file",
690 \begin_layout Plain Layout
692 "Capacity exceeded:",
695 \begin_layout Plain Layout
697 "Ignoring unknown option -",
700 \begin_layout Plain Layout
702 "This can't happen:",
705 \begin_layout Plain Layout
707 "non-numeric line number in"
710 \begin_layout Plain Layout
715 \begin_layout Plain Layout
719 \begin_layout Plain Layout
721 char *noweb_msgs_mimic_gcc[] = {
724 \begin_layout Plain Layout
726 ": unescaped << in documentation chunk"
729 \begin_layout Plain Layout
739 \begin_layout Standard
740 A noweb error message can be any string that contains a matching pair of
753 > >, or any of the above strings
756 \begin_layout Standard
760 \begin_layout Plain Layout
765 \begin_layout Plain Layout
767 int noweb_try (int buf_line)
770 \begin_layout Plain Layout
775 \begin_layout Plain Layout
780 \begin_layout Plain Layout
785 \begin_layout Plain Layout
789 \begin_layout Plain Layout
791 b = buffer[buf_line];
794 \begin_layout Plain Layout
799 \begin_layout Plain Layout
803 \begin_layout Plain Layout
805 for (i=0; i<1; i++) {
808 \begin_layout Plain Layout
810 s = (char *)strstr (b, noweb_msgs_mimic_gcc[i]);
813 \begin_layout Plain Layout
818 \begin_layout Plain Layout
820 t = (char *)strchr(buffer[buf_line], ':');
823 \begin_layout Plain Layout
825 err_line = atoi(t+1);
828 \begin_layout Plain Layout
830 t = buffer[buf_line];
833 \begin_layout Plain Layout
838 \begin_layout Plain Layout
840 while (*(t++) = *(s++));
843 \begin_layout Plain Layout
848 \begin_layout Plain Layout
853 \begin_layout Plain Layout
858 \begin_layout Plain Layout
860 s = (char *)strstr(b, "<<");
863 \begin_layout Plain Layout
868 \begin_layout Plain Layout
870 s = (char *)strstr(s+2, ">>");
873 \begin_layout Plain Layout
878 \begin_layout Plain Layout
883 \begin_layout Plain Layout
888 \begin_layout Plain Layout
893 \begin_layout Plain Layout
895 for (i = 0; i < 12; ++i) {
898 \begin_layout Plain Layout
900 s = (char *)strstr (b, noweb_msgs[i]);
903 \begin_layout Plain Layout
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
948 \begin_layout Standard
952 \begin_layout Plain Layout
954 <<Function prototypes>>=
957 \begin_layout Plain Layout
959 int noweb_try (int buf_line);
962 \begin_layout Plain Layout
972 \begin_layout Standard
973 The xlc compiler always outputs one single line for each error found, thus
974 to scan the buffer for xlc error messages it is enough to exam one input
978 \begin_layout Standard
979 \begin_inset Flex Chunk
982 \begin_layout Plain Layout
984 \begin_inset Argument 1
987 \begin_layout Plain Layout
989 Scan input for xlc error messages
997 \begin_layout Plain Layout
1002 \begin_layout Plain Layout
1004 while (fgets(buffer[last_buf_line], 200, stdin)) {
1007 \begin_layout Plain Layout
1012 \begin_layout Plain Layout
1014 output_error(1, err_line, "xlc");
1017 \begin_layout Plain Layout
1022 \begin_layout Plain Layout
1032 \begin_layout Standard
1033 A xlc error message is easy to identify.
1034 Every error message starts with a quoted string with no spaces, a comma,
1036 \begin_inset Quotes eld
1040 \begin_inset Quotes erd
1043 , a space, and some variable text.
1044 The following routine tests if a given buffer line matches this criteria:
1047 \begin_layout Standard
1048 \begin_inset Flex Chunk
1051 \begin_layout Plain Layout
1055 \begin_layout Plain Layout
1059 \begin_layout Plain Layout
1061 <<Function bodies>>=
1064 \begin_layout Plain Layout
1069 \begin_layout Plain Layout
1071 xlc_try (int buf_line)
1074 \begin_layout Plain Layout
1079 \begin_layout Plain Layout
1084 \begin_layout Plain Layout
1089 \begin_layout Plain Layout
1091 t = buffer[buf_line];
1094 \begin_layout Plain Layout
1099 \begin_layout Plain Layout
1101 while (*s != '"' && *s != ' ' && *s != '
1106 \begin_layout Plain Layout
1111 \begin_layout Plain Layout
1113 if (*t != '"' || *s != '"' || strncmp(s+1, ", line ", 7) != 0)
1116 \begin_layout Plain Layout
1121 \begin_layout Plain Layout
1126 \begin_layout Plain Layout
1131 \begin_layout Plain Layout
1136 \begin_layout Plain Layout
1146 \begin_layout Standard
1147 \begin_inset Flex Chunk
1150 \begin_layout Plain Layout
1152 \begin_inset Argument 1
1155 \begin_layout Plain Layout
1162 int xlc_try (int buf_line);
1170 \begin_layout Standard
1171 The gcc compiler error messages are more complicated to scan.
1172 Each error can span more than one line in the buffer.
1173 The good news is that every buffer line on each error has the same pattern,
1174 and share the same line number.
1175 Thus the strategy will be to accumulate lines in the buffer while the reported
1176 line number is still the same.
1177 At the time they differ, all the accumulated lines, except the last one,
1178 will belong to one single error message, which now can be output-ed to
1183 \begin_layout Standard
1184 Every gcc error message contains a string with no space followed by a
1185 \begin_inset Quotes eld
1189 \begin_inset Quotes eld
1193 If the next character is a space, then this line is a header of a error
1194 message and the next line will detail the line number of the source code
1195 where the error was found.
1196 Otherwise, the next thing is a integer number followed by another
1197 \begin_inset Quotes eld
1201 \begin_inset Quotes eld
1207 \begin_layout Standard
1208 \begin_inset Flex Chunk
1211 \begin_layout Plain Layout
1213 \begin_inset Argument 1
1216 \begin_layout Plain Layout
1218 Scan input for gcc error messages
1226 \begin_layout Plain Layout
1231 \begin_layout Plain Layout
1236 \begin_layout Plain Layout
1241 \begin_layout Plain Layout
1243 while (fgets(buffer[last_buf_line], 200, stdin)) {
1246 \begin_layout Plain Layout
1248 /****** Skip lines until I find an error */
1251 \begin_layout Plain Layout
1253 s = (char *)strpbrk(buffer[last_buf_line], " :");
1256 \begin_layout Plain Layout
1258 if (s == NULL || *s == ' ')
1261 \begin_layout Plain Layout
1263 continue; /* No gcc error found here */
1266 \begin_layout Plain Layout
1271 \begin_layout Plain Layout
1273 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1276 \begin_layout Plain Layout
1278 /****** OK It is an error message, get line number */
1281 \begin_layout Plain Layout
1283 err_line = atoi(s+1);
1286 \begin_layout Plain Layout
1288 if (last_err_line == 0 || last_err_line == err_line) {
1291 \begin_layout Plain Layout
1293 last_err_line = err_line;
1296 \begin_layout Plain Layout
1298 continue; /* It's either a header or a continuation, don't output
1302 \begin_layout Plain Layout
1307 \begin_layout Plain Layout
1309 /****** Completed the scan of one error message, output it to LyX
1313 \begin_layout Plain Layout
1315 discharge_buffer(1);
1318 \begin_layout Plain Layout
1323 \begin_layout Plain Layout
1325 } while (fgets(buffer[last_buf_line], 200, stdin));
1328 \begin_layout Plain Layout
1333 \begin_layout Plain Layout
1335 /****** EOF completes the scan of whatever was being scanned */
1338 \begin_layout Plain Layout
1340 discharge_buffer(0);
1343 \begin_layout Plain Layout
1353 \begin_layout Standard
1354 \begin_inset Flex Chunk
1357 \begin_layout Plain Layout
1359 \begin_inset Argument 1
1362 \begin_layout Plain Layout
1364 gcc error message criteria is to find a "...:999:" or a "...: "
1369 /****** Search first ":" in the error number */
1372 \begin_layout Plain Layout
1374 s = (char *)strpbrk(buffer[last_buf_line], " :");
1377 \begin_layout Plain Layout
1382 \begin_layout Plain Layout
1384 if (s == NULL || *s == ' ')
1387 \begin_layout Plain Layout
1389 <<No gcc error found here, but it might terminate the scanning of a previous
1393 \begin_layout Plain Layout
1395 /****** Search second ":" in the error number */
1398 \begin_layout Plain Layout
1400 t = (char *)strpbrk(s+1, " :");if (t == NULL || *t == ' ') <<No gcc error
1401 found here, but it might terminate the scanning of a previous one>>/******
1402 Verify if is all digits between ":" */if (t != s+1+strspn(s+1, "0123456789"))
1403 <<No gcc error found here, but it might terminate the scanning of a previous
1407 \begin_layout Plain Layout
1411 \begin_layout Plain Layout
1415 \begin_layout Plain Layout
1417 <<No gcc error found here, but it might terminate the scanning of a previous
1421 \begin_layout Plain Layout
1426 \begin_layout Plain Layout
1431 \begin_layout Plain Layout
1433 discharge_buffer(1);
1436 \begin_layout Plain Layout
1441 \begin_layout Plain Layout
1451 \begin_layout Standard
1452 As we mentioned, when the scan of one gcc error message is completed everything
1453 in the buffer except the last line is one single error message.
1454 But if the scan terminates with a EOF or through finding one line that
1455 does not match the gcc error message criteria, then there is no
1456 \begin_inset Quotes eld
1460 \begin_inset Quotes erd
1463 in the buffer to be concerned with.
1464 In those cases we empty the buffer completely.
1467 \begin_layout Standard
1468 \begin_inset Flex Chunk
1471 \begin_layout Plain Layout
1475 \begin_layout Plain Layout
1479 \begin_layout Plain Layout
1481 <<Function bodies>>=
1484 \begin_layout Plain Layout
1489 \begin_layout Plain Layout
1491 discharge_buffer (int save_last)
1494 \begin_layout Plain Layout
1499 \begin_layout Plain Layout
1501 if (last_err_line != 0) {
1504 \begin_layout Plain Layout
1506 clean_gcc_messages();
1509 \begin_layout Plain Layout
1511 if (save_last != 0) {
1514 \begin_layout Plain Layout
1516 output_error(last_buf_line-1, last_err_line, "gcc");
1519 \begin_layout Plain Layout
1521 strcpy (buffer[0], buffer[last_buf_line-1]);
1524 \begin_layout Plain Layout
1526 last_err_line = err_line;
1529 \begin_layout Plain Layout
1534 \begin_layout Plain Layout
1539 \begin_layout Plain Layout
1544 \begin_layout Plain Layout
1546 clean_gcc_messages();
1549 \begin_layout Plain Layout
1551 output_error(last_buf_line-1, last_err_line, "gcc");
1554 \begin_layout Plain Layout
1559 \begin_layout Plain Layout
1564 \begin_layout Plain Layout
1569 \begin_layout Plain Layout
1574 \begin_layout Plain Layout
1584 \begin_layout Standard
1585 \begin_inset Flex Chunk
1588 \begin_layout Plain Layout
1590 \begin_inset Argument 1
1593 \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
1652 \begin_layout Plain Layout
1654 clean_gcc_messages ()
1657 \begin_layout Plain Layout
1662 \begin_layout Plain Layout
1667 \begin_layout Plain Layout
1672 \begin_layout Plain Layout
1677 \begin_layout Plain Layout
1679 int search_len = sprintf(search, ".nw:%d:", last_err_line);
1682 \begin_layout Plain Layout
1687 \begin_layout Plain Layout
1689 for (index = 0; index < last_buf_line-1; index++) {
1692 \begin_layout Plain Layout
1694 tail = (char *)strstr (buffer[index], search);
1697 \begin_layout Plain Layout
1699 if ( tail == NULL) {
1702 \begin_layout Plain Layout
1704 tail = (char *) strstr (buffer[index], ".nw:");
1707 \begin_layout Plain Layout
1712 \begin_layout Plain Layout
1717 \begin_layout Plain Layout
1722 \begin_layout Plain Layout
1727 \begin_layout Plain Layout
1732 \begin_layout Plain Layout
1737 \begin_layout Plain Layout
1742 \begin_layout Plain Layout
1744 head = buffer[index];
1747 \begin_layout Plain Layout
1749 while (*(head++) = *(tail++));
1752 \begin_layout Plain Layout
1757 \begin_layout Plain Layout
1762 \begin_layout Plain Layout
1772 \begin_layout Standard
1773 \begin_inset Flex Chunk
1776 \begin_layout Plain Layout
1778 \begin_inset Argument 1
1781 \begin_layout Plain Layout
1788 void clean_gcc_messages ();
1796 \begin_layout Standard
1797 To combine the scan of noweb error messages and xlc error messages is very
1799 We just try each one for every input line:
1802 \begin_layout Standard
1806 \begin_layout Plain Layout
1808 <<AIX system using both noweb and xlc>>=
1811 \begin_layout Plain Layout
1816 \begin_layout Plain Layout
1821 \begin_layout Plain Layout
1823 while (fgets(buffer[0], 200, stdin)) {
1826 \begin_layout Plain Layout
1831 \begin_layout Plain Layout
1833 output_error(1, err_line, "noweb");
1836 \begin_layout Plain Layout
1838 else if (xlc_try(0))
1841 \begin_layout Plain Layout
1843 output_error(1, err_line, "xlc");
1846 \begin_layout Plain Layout
1851 \begin_layout Plain Layout
1856 \begin_layout Plain Layout
1866 \begin_layout Standard
1867 To combine the scan of noweb error messages and gcc error messages is simple
1868 if we realize that it is not possible to find a noweb error message in
1869 the middle of a gcc error message.
1870 So we just repeat the gcc procedure and test for noweb error messages in
1871 the beginning of the scan:
1874 \begin_layout Standard
1875 \begin_inset Flex Chunk
1878 \begin_layout Plain Layout
1880 \begin_inset Argument 1
1883 \begin_layout Plain Layout
1885 Solaris and Linux systems using both noweb and gcc
1893 \begin_layout Plain Layout
1898 \begin_layout Plain Layout
1903 \begin_layout Plain Layout
1908 \begin_layout Plain Layout
1910 while (fgets(buffer[last_buf_line], 200, stdin)) {
1913 \begin_layout Plain Layout
1915 /****** Skip lines until I find an error */
1918 \begin_layout Plain Layout
1920 if (last_buf_line == 0 && noweb_try(0)) {
1923 \begin_layout Plain Layout
1925 output_error(1, err_line, "noweb");
1928 \begin_layout Plain Layout
1933 \begin_layout Plain Layout
1938 \begin_layout Plain Layout
1940 s = (char *)strpbrk(buffer[last_buf_line], " :");
1943 \begin_layout Plain Layout
1945 if (s == NULL || *s == ' ')
1948 \begin_layout Plain Layout
1950 continue; /* No gcc error found here */
1953 \begin_layout Plain Layout
1958 \begin_layout Plain Layout
1960 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1963 \begin_layout Plain Layout
1965 /****** OK It is an error, get line number */
1968 \begin_layout Plain Layout
1970 err_line = atoi(s+1);
1973 \begin_layout Plain Layout
1975 if (last_err_line == 0 || last_err_line == err_line) {
1978 \begin_layout Plain Layout
1980 last_err_line = err_line;
1983 \begin_layout Plain Layout
1985 continue; /* It's either a header or a continuation, don't output
1989 \begin_layout Plain Layout
1994 \begin_layout Plain Layout
1996 /****** Completed the scan of one error message, output it to LyX
2000 \begin_layout Plain Layout
2002 discharge_buffer(1);
2005 \begin_layout Plain Layout
2010 \begin_layout Plain Layout
2012 } while (fgets(buffer[last_buf_line], 200, stdin));
2015 \begin_layout Plain Layout
2020 \begin_layout Plain Layout
2022 /****** EOF completes the scan of whatever was being scanned */
2025 \begin_layout Plain Layout
2027 discharge_buffer(0);
2030 \begin_layout Plain Layout
2040 \begin_layout Section
2041 Wrapping the code into a file
2044 \begin_layout Standard
2045 \begin_inset Flex Chunk
2048 \begin_layout Plain Layout
2050 \begin_inset Argument 1
2053 \begin_layout Plain Layout
2063 \begin_layout Plain Layout
2065 #include <strings.h>
2068 \begin_layout Plain Layout
2073 \begin_layout Plain Layout
2075 <<Global variables>>
2078 \begin_layout Plain Layout
2080 <<Function prototypes>>
2083 \begin_layout Plain Layout
2093 \begin_layout Standard
2094 To build this program, we want to add the
2095 \begin_inset Quotes eld
2099 \begin_inset Quotes erd
2102 option in the tangle command to force gdb to load the file
2111 In accordance with this, we pass the
2112 \begin_inset Quotes eld
2116 \begin_inset Quotes erd
2122 \begin_layout Standard
2123 \begin_inset Flex Chunk
2126 \begin_layout Plain Layout
2128 \begin_inset Argument 1
2131 \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