1 #LyX 2.1 created this file. For more info see http://www.lyx.org/
6 \use_default_options false
10 \maintain_unincluded_children false
12 \language_package default
13 \inputencoding default
17 \font_typewriter default
19 \font_default_family default
20 \use_non_tex_fonts false
26 \default_output_format default
28 \bibtex_command default
29 \index_command default
30 \paperfontsize default
35 \use_package amsmath 0
36 \use_package amssymb 0
39 \use_package mathdots 1
40 \use_package mathtools 0
42 \use_package stackrel 0
43 \use_package stmaryrd 0
44 \use_package undertilde 0
46 \cite_engine_type default
50 \paperorientation portrait
60 \paragraph_separation indent
61 \paragraph_indentation default
62 \quotes_language english
65 \paperpagestyle default
66 \tracking_changes false
76 LyX and Literate Programming
77 \begin_inset Newline newline
85 \begin_inset Newline newline
88 edmar-w-jr@technologist.com
92 \begin_layout Plain Layout
93 Modified by Bernard Michael Hurley bernardh@westherts.ac.uk ---- Don't blame
94 Edmar for any errors that have crept in!
102 \begin_layout Abstract
107 This example program is provided for educational use only.
108 The functionality in this C program has been superceded by the equivalent
111 examples/listerrors.lyx
113 which should be installed in the LyX scripts directory.
120 \begin_layout Plain Layout
132 \begin_layout Standard
133 \begin_inset CommandInset toc
134 LatexCommand tableofcontents
141 \begin_layout Section
145 \begin_layout Standard
146 After typesetting a document, LyX scans the LaTeX log file looking for errors.
147 For each error found, the line number is obtained and a error box is displayed
148 in the LyX screen at that position.
151 \begin_layout Standard
152 To use this feature to view compilation errors while working with literate
153 documents, we need a program that filters the compilation errors and puts
154 them in a format suitable for LyX reading it.
158 \begin_layout Standard
159 In this document we present a filter that recognizes compilation error messages
160 from noweb, gnu C, and the IBM C compiler (xlc).
163 \begin_layout Standard
164 The filter is required to read from standard input, parse for error messages
165 and copy the error messages to the standard output.
166 During the output process, the filter must present the error messages in
167 a format that LyX can interpret, currently, the LaTeX error message format.
168 Of course, nothing will prevent future LyX releases from being able to
169 read other formats as well (like gcc error messages for example).
170 This mechanism is necessary to fully explore the literate programming tool's
174 \begin_layout Section
178 \begin_layout Standard
179 \begin_inset Flex Chunk
182 \begin_layout Plain Layout
184 \begin_inset Argument 1
187 \begin_layout Plain Layout
196 \begin_layout Plain Layout
198 main (int argc, char **argv)
201 \begin_layout Plain Layout
206 \begin_layout Plain Layout
211 \begin_layout Plain Layout
213 switch (argv[1][0]) {
216 \begin_layout Plain Layout
221 \begin_layout Plain Layout
223 <<Scan input for noweb error messages>>
226 \begin_layout Plain Layout
231 \begin_layout Plain Layout
236 \begin_layout Plain Layout
238 <<Scan input for xlc error messages>>
241 \begin_layout Plain Layout
246 \begin_layout Plain Layout
251 \begin_layout Plain Layout
253 <<AIX system using both noweb and xlc>>
256 \begin_layout Plain Layout
261 \begin_layout Plain Layout
266 \begin_layout Plain Layout
271 \begin_layout Plain Layout
273 <<Solaris and Linux systems using both noweb and gcc>>
276 \begin_layout Plain Layout
281 \begin_layout Plain Layout
286 \begin_layout Plain Layout
291 \begin_layout Plain Layout
293 <<Scan input for gcc error messages>>
296 \begin_layout Plain Layout
301 \begin_layout Plain Layout
306 \begin_layout Plain Layout
311 \begin_layout Plain Layout
313 <<Scan input for gcc error messages>>
316 \begin_layout Plain Layout
321 \begin_layout Plain Layout
331 \begin_layout Standard
332 \begin_inset Flex Chunk
335 \begin_layout Plain Layout
337 \begin_inset Argument 1
340 \begin_layout Plain Layout
346 int main (int argc, char **argv);
354 \begin_layout Section
358 \begin_layout Standard
359 We resort to some global variables to allow access from several different
361 These are the buffer and related pointers used during the parse of the
365 \begin_layout Standard
369 \begin_layout Plain Layout
371 <<Global variables>>=
374 \begin_layout Plain Layout
376 char buffer[200][200];
379 \begin_layout Plain Layout
384 \begin_layout Plain Layout
389 \begin_layout Plain Layout
399 \begin_layout Section
403 \begin_layout Standard
404 The output format mimics the TeX error messages format.
405 This function prints a number of lines residing in the global variable
410 , a program name and line number.
411 There is no special requirement on the input strings, they can be anything.
415 \begin_layout Plain Layout
416 This function has been slightly changed from EW's original to make scanning
417 a bit easier with LaTeX::scanLogFile().
418 The test has been added because LyX can crash if empty lines are allowed
419 here --- I can't figure out why! --- BMH
427 \begin_layout Standard
428 \begin_inset Flex Chunk
431 \begin_layout Plain Layout
433 \begin_inset Argument 1
436 \begin_layout Plain Layout
445 \begin_layout Plain Layout
447 output_error (int buf_size, int error_line, char *tool)
450 \begin_layout Plain Layout
455 \begin_layout Plain Layout
460 \begin_layout Plain Layout
465 \begin_layout Plain Layout
467 fprintf(stdout, "! Build Error: ==> %s ==>
472 \begin_layout Plain Layout
474 fprintf(stdout, " ...
483 \begin_layout Plain Layout
488 \begin_layout Plain Layout
490 for (i=0; i<buf_size; i++)
493 \begin_layout Plain Layout
495 if (strlen(buffer[i]) != 0)
498 \begin_layout Plain Layout
500 fprintf(stdout, "%s", buffer[i]);
503 \begin_layout Plain Layout
508 \begin_layout Plain Layout
515 \begin_layout Plain Layout
525 \begin_layout Standard
526 \begin_inset Flex Chunk
529 \begin_layout Plain Layout
531 \begin_inset Argument 1
534 \begin_layout Plain Layout
540 void output_error (int buf_size, int error_line, char *tool);
548 \begin_layout Section
549 Functions Implementation
552 \begin_layout Standard
553 Both noweave and notangle routines, always output one single line for each
554 error found, thus to scan the buffer for noweb error messages is enough
555 to exam one input line at a time.
556 Note that the noweb software does not provide a line error number, so all
557 errors boxes related to noweb messages will be displayed at the beginning
561 \begin_layout Standard
562 \begin_inset Flex Chunk
565 \begin_layout Plain Layout
567 \begin_inset Argument 1
570 \begin_layout Plain Layout
571 Scan input for noweb error messages
579 \begin_layout Plain Layout
584 \begin_layout Plain Layout
586 while (fgets(buffer[0], 200, stdin)) {
589 \begin_layout Plain Layout
594 \begin_layout Plain Layout
596 output_error(1, err_line, "noweb");
599 \begin_layout Plain Layout
604 \begin_layout Plain Layout
614 \begin_layout Standard
615 The examination itself is very inefficient.
616 Unfortunately noweb doesn't have any characteristic that would help to
617 identify one of its error messages.
618 The solution is to collect all possible output messages in an array of
619 strings, and turn the examination process into a linear search in this
623 \begin_layout Standard
624 \begin_inset Flex Chunk
627 \begin_layout Plain Layout
631 \begin_layout Plain Layout
633 <<Global variables>>=
636 \begin_layout Plain Layout
638 char *noweb_msgs[] = {
641 \begin_layout Plain Layout
643 "couldn't open file",
646 \begin_layout Plain Layout
648 "couldn't open temporary file",
651 \begin_layout Plain Layout
653 "error writing temporary file",
656 \begin_layout Plain Layout
661 \begin_layout Plain Layout
666 \begin_layout Plain Layout
668 "Bad format sequence",
671 \begin_layout Plain Layout
673 "Can't open output file",
676 \begin_layout Plain Layout
678 "Can't open temporary file",
681 \begin_layout Plain Layout
683 "Capacity exceeded:",
686 \begin_layout Plain Layout
688 "Ignoring unknown option -",
691 \begin_layout Plain Layout
693 "This can't happen:",
696 \begin_layout Plain Layout
698 "non-numeric line number in"
701 \begin_layout Plain Layout
706 \begin_layout Plain Layout
710 \begin_layout Plain Layout
712 char *noweb_msgs_mimic_gcc[] = {
715 \begin_layout Plain Layout
717 ": unescaped << in documentation chunk"
720 \begin_layout Plain Layout
730 \begin_layout Standard
731 A noweb error message can be any string that contains a matching pair of
744 > >, or any of the above strings
747 \begin_layout Standard
751 \begin_layout Plain Layout
756 \begin_layout Plain Layout
758 int noweb_try (int buf_line)
761 \begin_layout Plain Layout
766 \begin_layout Plain Layout
771 \begin_layout Plain Layout
776 \begin_layout Plain Layout
780 \begin_layout Plain Layout
782 b = buffer[buf_line];
785 \begin_layout Plain Layout
790 \begin_layout Plain Layout
794 \begin_layout Plain Layout
796 for (i=0; i<1; i++) {
799 \begin_layout Plain Layout
801 s = (char *)strstr (b, noweb_msgs_mimic_gcc[i]);
804 \begin_layout Plain Layout
809 \begin_layout Plain Layout
811 t = (char *)strchr(buffer[buf_line], ':');
814 \begin_layout Plain Layout
816 err_line = atoi(t+1);
819 \begin_layout Plain Layout
821 t = buffer[buf_line];
824 \begin_layout Plain Layout
829 \begin_layout Plain Layout
831 while (*(t++) = *(s++));
834 \begin_layout Plain Layout
839 \begin_layout Plain Layout
844 \begin_layout Plain Layout
849 \begin_layout Plain Layout
851 s = (char *)strstr(b, "<<");
854 \begin_layout Plain Layout
859 \begin_layout Plain Layout
861 s = (char *)strstr(s+2, ">>");
864 \begin_layout Plain Layout
869 \begin_layout Plain Layout
874 \begin_layout Plain Layout
879 \begin_layout Plain Layout
884 \begin_layout Plain Layout
886 for (i = 0; i < 12; ++i) {
889 \begin_layout Plain Layout
891 s = (char *)strstr (b, noweb_msgs[i]);
894 \begin_layout Plain Layout
899 \begin_layout Plain Layout
904 \begin_layout Plain Layout
909 \begin_layout Plain Layout
914 \begin_layout Plain Layout
919 \begin_layout Plain Layout
924 \begin_layout Plain Layout
929 \begin_layout Plain Layout
939 \begin_layout Standard
943 \begin_layout Plain Layout
945 <<Function prototypes>>=
948 \begin_layout Plain Layout
950 int noweb_try (int buf_line);
953 \begin_layout Plain Layout
963 \begin_layout Standard
964 The xlc compiler always outputs one single line for each error found, thus
965 to scan the buffer for xlc error messages it is enough to exam one input
969 \begin_layout Standard
970 \begin_inset Flex Chunk
973 \begin_layout Plain Layout
975 \begin_inset Argument 1
978 \begin_layout Plain Layout
979 Scan input for xlc error messages
987 \begin_layout Plain Layout
992 \begin_layout Plain Layout
994 while (fgets(buffer[last_buf_line], 200, stdin)) {
997 \begin_layout Plain Layout
1002 \begin_layout Plain Layout
1004 output_error(1, err_line, "xlc");
1007 \begin_layout Plain Layout
1012 \begin_layout Plain Layout
1022 \begin_layout Standard
1023 A xlc error message is easy to identify.
1024 Every error message starts with a quoted string with no spaces, a comma,
1026 \begin_inset Quotes eld
1030 \begin_inset Quotes erd
1033 , a space, and some variable text.
1034 The following routine tests if a given buffer line matches this criteria:
1037 \begin_layout Standard
1038 \begin_inset Flex Chunk
1041 \begin_layout Plain Layout
1045 \begin_layout Plain Layout
1049 \begin_layout Plain Layout
1051 <<Function bodies>>=
1054 \begin_layout Plain Layout
1059 \begin_layout Plain Layout
1061 xlc_try (int buf_line)
1064 \begin_layout Plain Layout
1069 \begin_layout Plain Layout
1074 \begin_layout Plain Layout
1079 \begin_layout Plain Layout
1081 t = buffer[buf_line];
1084 \begin_layout Plain Layout
1089 \begin_layout Plain Layout
1091 while (*s != '"' && *s != ' ' && *s != '
1096 \begin_layout Plain Layout
1101 \begin_layout Plain Layout
1103 if (*t != '"' || *s != '"' || strncmp(s+1, ", line ", 7) != 0)
1106 \begin_layout Plain Layout
1111 \begin_layout Plain Layout
1116 \begin_layout Plain Layout
1121 \begin_layout Plain Layout
1126 \begin_layout Plain Layout
1136 \begin_layout Standard
1137 \begin_inset Flex Chunk
1140 \begin_layout Plain Layout
1142 \begin_inset Argument 1
1145 \begin_layout Plain Layout
1151 int xlc_try (int buf_line);
1159 \begin_layout Standard
1160 The gcc compiler error messages are more complicated to scan.
1161 Each error can span more than one line in the buffer.
1162 The good news is that every buffer line on each error has the same pattern,
1163 and share the same line number.
1164 Thus the strategy will be to accumulate lines in the buffer while the reported
1165 line number is still the same.
1166 At the time they differ, all the accumulated lines, except the last one,
1167 will belong to one single error message, which now can be output-ed to
1171 \begin_layout Standard
1172 Every gcc error message contains a string with no space followed by a
1173 \begin_inset Quotes eld
1177 \begin_inset Quotes eld
1181 If the next character is a space, then this line is a header of a error
1182 message and the next line will detail the line number of the source code
1183 where the error was found.
1184 Otherwise, the next thing is a integer number followed by another
1185 \begin_inset Quotes eld
1189 \begin_inset Quotes eld
1195 \begin_layout Standard
1196 \begin_inset Flex Chunk
1199 \begin_layout Plain Layout
1201 \begin_inset Argument 1
1204 \begin_layout Plain Layout
1205 Scan input for gcc error messages
1213 \begin_layout Plain Layout
1218 \begin_layout Plain Layout
1223 \begin_layout Plain Layout
1228 \begin_layout Plain Layout
1230 while (fgets(buffer[last_buf_line], 200, stdin)) {
1233 \begin_layout Plain Layout
1235 /****** Skip lines until I find an error */
1238 \begin_layout Plain Layout
1240 s = (char *)strpbrk(buffer[last_buf_line], " :");
1243 \begin_layout Plain Layout
1245 if (s == NULL || *s == ' ')
1248 \begin_layout Plain Layout
1250 continue; /* No gcc error found here */
1253 \begin_layout Plain Layout
1258 \begin_layout Plain Layout
1260 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1263 \begin_layout Plain Layout
1265 /****** OK It is an error message, get line number */
1268 \begin_layout Plain Layout
1270 err_line = atoi(s+1);
1273 \begin_layout Plain Layout
1275 if (last_err_line == 0 || last_err_line == err_line) {
1278 \begin_layout Plain Layout
1280 last_err_line = err_line;
1283 \begin_layout Plain Layout
1285 continue; /* It's either a header or a continuation, don't output
1289 \begin_layout Plain Layout
1294 \begin_layout Plain Layout
1296 /****** Completed the scan of one error message, output it to LyX
1300 \begin_layout Plain Layout
1302 discharge_buffer(1);
1305 \begin_layout Plain Layout
1310 \begin_layout Plain Layout
1312 } while (fgets(buffer[last_buf_line], 200, stdin));
1315 \begin_layout Plain Layout
1320 \begin_layout Plain Layout
1322 /****** EOF completes the scan of whatever was being scanned */
1325 \begin_layout Plain Layout
1327 discharge_buffer(0);
1330 \begin_layout Plain Layout
1340 \begin_layout Standard
1341 \begin_inset Flex Chunk
1344 \begin_layout Plain Layout
1346 \begin_inset Argument 1
1349 \begin_layout Plain Layout
1350 gcc error message criteria is to find a "...:999:" or a "...: "
1355 /****** Search first ":" in the error number */
1358 \begin_layout Plain Layout
1360 s = (char *)strpbrk(buffer[last_buf_line], " :");
1363 \begin_layout Plain Layout
1368 \begin_layout Plain Layout
1370 if (s == NULL || *s == ' ')
1373 \begin_layout Plain Layout
1375 <<No gcc error found here, but it might terminate the scanning of a previous
1379 \begin_layout Plain Layout
1381 /****** Search second ":" in the error number */
1384 \begin_layout Plain Layout
1386 t = (char *)strpbrk(s+1, " :");if (t == NULL || *t == ' ') <<No gcc error
1387 found here, but it might terminate the scanning of a previous one>>/******
1388 Verify if is all digits between ":" */if (t != s+1+strspn(s+1, "0123456789"))
1389 <<No gcc error found here, but it might terminate the scanning of a previous
1393 \begin_layout Plain Layout
1397 \begin_layout Plain Layout
1401 \begin_layout Plain Layout
1403 <<No gcc error found here, but it might terminate the scanning of a previous
1407 \begin_layout Plain Layout
1412 \begin_layout Plain Layout
1417 \begin_layout Plain Layout
1419 discharge_buffer(1);
1422 \begin_layout Plain Layout
1427 \begin_layout Plain Layout
1437 \begin_layout Standard
1438 As we mentioned, when the scan of one gcc error message is completed everything
1439 in the buffer except the last line is one single error message.
1440 But if the scan terminates with a EOF or through finding one line that
1441 does not match the gcc error message criteria, then there is no
1442 \begin_inset Quotes eld
1446 \begin_inset Quotes erd
1449 in the buffer to be concerned with.
1450 In those cases we empty the buffer completely.
1453 \begin_layout Standard
1454 \begin_inset Flex Chunk
1457 \begin_layout Plain Layout
1461 \begin_layout Plain Layout
1465 \begin_layout Plain Layout
1467 <<Function bodies>>=
1470 \begin_layout Plain Layout
1475 \begin_layout Plain Layout
1477 discharge_buffer (int save_last)
1480 \begin_layout Plain Layout
1485 \begin_layout Plain Layout
1487 if (last_err_line != 0) {
1490 \begin_layout Plain Layout
1492 clean_gcc_messages();
1495 \begin_layout Plain Layout
1497 if (save_last != 0) {
1500 \begin_layout Plain Layout
1502 output_error(last_buf_line-1, last_err_line, "gcc");
1505 \begin_layout Plain Layout
1507 strcpy (buffer[0], buffer[last_buf_line-1]);
1510 \begin_layout Plain Layout
1512 last_err_line = err_line;
1515 \begin_layout Plain Layout
1520 \begin_layout Plain Layout
1525 \begin_layout Plain Layout
1530 \begin_layout Plain Layout
1532 clean_gcc_messages();
1535 \begin_layout Plain Layout
1537 output_error(last_buf_line-1, last_err_line, "gcc");
1540 \begin_layout Plain Layout
1545 \begin_layout Plain Layout
1550 \begin_layout Plain Layout
1555 \begin_layout Plain Layout
1560 \begin_layout Plain Layout
1570 \begin_layout Standard
1571 \begin_inset Flex Chunk
1574 \begin_layout Plain Layout
1576 \begin_inset Argument 1
1579 \begin_layout Plain Layout
1585 void discharge_buffer (int save_last);
1593 \begin_layout Standard
1595 \begin_inset Quotes eld
1599 \begin_inset Quotes erd
1602 superfluous information from gcc messages, namely the name of the noweb
1603 file and the line number of the Error.
1607 \begin_layout Plain Layout
1609 For instance, some way of distinguishing between gcc Errors and Warnings
1618 \begin_layout Standard
1619 \begin_inset Flex Chunk
1622 \begin_layout Plain Layout
1624 \begin_inset Argument 1
1627 \begin_layout Plain Layout
1636 \begin_layout Plain Layout
1638 clean_gcc_messages ()
1641 \begin_layout Plain Layout
1646 \begin_layout Plain Layout
1651 \begin_layout Plain Layout
1656 \begin_layout Plain Layout
1661 \begin_layout Plain Layout
1663 int search_len = sprintf(search, ".nw:%d:", last_err_line);
1666 \begin_layout Plain Layout
1671 \begin_layout Plain Layout
1673 for (index = 0; index < last_buf_line-1; index++) {
1676 \begin_layout Plain Layout
1678 tail = (char *)strstr (buffer[index], search);
1681 \begin_layout Plain Layout
1683 if ( tail == NULL) {
1686 \begin_layout Plain Layout
1688 tail = (char *) strstr (buffer[index], ".nw:");
1691 \begin_layout Plain Layout
1696 \begin_layout Plain Layout
1701 \begin_layout Plain Layout
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
1728 head = buffer[index];
1731 \begin_layout Plain Layout
1733 while (*(head++) = *(tail++));
1736 \begin_layout Plain Layout
1741 \begin_layout Plain Layout
1746 \begin_layout Plain Layout
1756 \begin_layout Standard
1757 \begin_inset Flex Chunk
1760 \begin_layout Plain Layout
1762 \begin_inset Argument 1
1765 \begin_layout Plain Layout
1771 void clean_gcc_messages ();
1779 \begin_layout Standard
1780 To combine the scan of noweb error messages and xlc error messages is very
1782 We just try each one for every input line:
1785 \begin_layout Standard
1789 \begin_layout Plain Layout
1791 <<AIX system using both noweb and xlc>>=
1794 \begin_layout Plain Layout
1799 \begin_layout Plain Layout
1804 \begin_layout Plain Layout
1806 while (fgets(buffer[0], 200, stdin)) {
1809 \begin_layout Plain Layout
1814 \begin_layout Plain Layout
1816 output_error(1, err_line, "noweb");
1819 \begin_layout Plain Layout
1821 else if (xlc_try(0))
1824 \begin_layout Plain Layout
1826 output_error(1, err_line, "xlc");
1829 \begin_layout Plain Layout
1834 \begin_layout Plain Layout
1839 \begin_layout Plain Layout
1849 \begin_layout Standard
1850 To combine the scan of noweb error messages and gcc error messages is simple
1851 if we realize that it is not possible to find a noweb error message in
1852 the middle of a gcc error message.
1853 So we just repeat the gcc procedure and test for noweb error messages in
1854 the beginning of the scan:
1857 \begin_layout Standard
1858 \begin_inset Flex Chunk
1861 \begin_layout Plain Layout
1863 \begin_inset Argument 1
1866 \begin_layout Plain Layout
1867 Solaris and Linux systems using both noweb and gcc
1875 \begin_layout Plain Layout
1880 \begin_layout Plain Layout
1885 \begin_layout Plain Layout
1890 \begin_layout Plain Layout
1892 while (fgets(buffer[last_buf_line], 200, stdin)) {
1895 \begin_layout Plain Layout
1897 /****** Skip lines until I find an error */
1900 \begin_layout Plain Layout
1902 if (last_buf_line == 0 && noweb_try(0)) {
1905 \begin_layout Plain Layout
1907 output_error(1, err_line, "noweb");
1910 \begin_layout Plain Layout
1915 \begin_layout Plain Layout
1920 \begin_layout Plain Layout
1922 s = (char *)strpbrk(buffer[last_buf_line], " :");
1925 \begin_layout Plain Layout
1927 if (s == NULL || *s == ' ')
1930 \begin_layout Plain Layout
1932 continue; /* No gcc error found here */
1935 \begin_layout Plain Layout
1940 \begin_layout Plain Layout
1942 <<gcc error message criteria is to find a "...:999:" or a "...: ">>
1945 \begin_layout Plain Layout
1947 /****** OK It is an error, get line number */
1950 \begin_layout Plain Layout
1952 err_line = atoi(s+1);
1955 \begin_layout Plain Layout
1957 if (last_err_line == 0 || last_err_line == err_line) {
1960 \begin_layout Plain Layout
1962 last_err_line = err_line;
1965 \begin_layout Plain Layout
1967 continue; /* It's either a header or a continuation, don't output
1971 \begin_layout Plain Layout
1976 \begin_layout Plain Layout
1978 /****** Completed the scan of one error message, output it to LyX
1982 \begin_layout Plain Layout
1984 discharge_buffer(1);
1987 \begin_layout Plain Layout
1992 \begin_layout Plain Layout
1994 } while (fgets(buffer[last_buf_line], 200, stdin));
1997 \begin_layout Plain Layout
2002 \begin_layout Plain Layout
2004 /****** EOF completes the scan of whatever was being scanned */
2007 \begin_layout Plain Layout
2009 discharge_buffer(0);
2012 \begin_layout Plain Layout
2022 \begin_layout Section
2023 Wrapping the code into a file
2026 \begin_layout Standard
2027 \begin_inset Flex Chunk
2030 \begin_layout Plain Layout
2032 \begin_inset Argument 1
2035 \begin_layout Plain Layout
2044 \begin_layout Plain Layout
2046 #include <strings.h>
2049 \begin_layout Plain Layout
2054 \begin_layout Plain Layout
2056 <<Global variables>>
2059 \begin_layout Plain Layout
2061 <<Function prototypes>>
2064 \begin_layout Plain Layout
2074 \begin_layout Standard
2075 To build this program, we want to add the
2076 \begin_inset Quotes eld
2080 \begin_inset Quotes erd
2083 option in the tangle command to force gdb to load the file
2092 In accordance with this, we pass the
2093 \begin_inset Quotes eld
2097 \begin_inset Quotes erd
2103 \begin_layout Standard
2104 \begin_inset Flex Chunk
2107 \begin_layout Plain Layout
2109 \begin_inset Argument 1
2112 \begin_layout Plain Layout
2121 \begin_layout Plain Layout
2123 if [ -z "$NOWEB_SOURCE" ]; then NOWEB_SOURCE=Literate.nw; fi
2126 \begin_layout Plain Layout
2128 if [ -z "$NOWEB_OUTPUT_DIR" ]; then NOWEB_OUTPUT_DIR=.; fi
2131 \begin_layout Plain Layout
2133 notangle -L -Rlisterrors.c ${NOWEB_SOURCE} > ${NOWEB_OUTPUT_DIR}/listerrors.c
2136 \begin_layout Plain Layout
2138 gcc -g -o listerrors listerrors.c
2146 \begin_layout Standard
2147 This project can be tangled and compiled from LyX if you set
2153 to call a generic script that always extracts a chunk named
2158 Here is a example of such generic script:
2161 \begin_layout LyX-Code
2163 \begin_inset Newline newline
2166 notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 NOWEB_OUTPUT_DIR=$r sh
2169 \begin_layout LyX-Code