]> git.lyx.org Git - lyx.git/blobdiff - lib/examples/Literate.lyx
* bind/math.bind: shortcut for \psi
[lyx.git] / lib / examples / Literate.lyx
index 47db33766a1c829d19bdb7035ceb1ed603bfc7da..9ad85287ced8b5dab0d17146a3843c0f7544f948 100644 (file)
@@ -1,8 +1,7 @@
-#This file was created by <wiensk> Tue Feb 23 22:25:52 1999
-#LyX 1.0 (C) 1995-1999 Matthias Ettrich and the LyX Team
-\lyxformat 2.15
+#LyX 1.2 created this file. For more info see http://www.lyx.org/
+\lyxformat 220
 \textclass literate-article
-\language default
+\language english
 \inputencoding default
 \fontscheme default
 \graphics default
@@ -12,6 +11,8 @@
 \paperpackage a4
 \use_geometry 0
 \use_amsmath 0
+\use_natbib 0
+\use_numerical_citations 0
 \paperorientation portrait
 \secnumdepth 3
 \tocdepth 3
@@ -33,17 +34,46 @@ An example program
 Edmar Wienskoski Jr.
 \newline 
 edmar-w-jr@technologist.com
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+Modified by Bernard Michael Hurley bernardh@westherts.ac.uk ---- Don't blame
+ Edmar for any errors that have crept in!
+\end_inset 
+
+
+\layout Abstract
+
+
+\series bold 
+Note:
+\series default 
+ This example program is provided for educational use only.
+ The functionality in this C program has been superceded by the equivalent
+ Python code in 
+\emph on 
+examples/listerrors.lyx
+\emph default 
+ which should be installed in the LyX scripts directory.
 \layout Date
 
 
-\latex latex 
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
 
 \backslash 
 today
+\end_inset 
+
+
 \layout Standard
 
 
-\begin_inset LatexCommand \tableofcontents
+\begin_inset LatexCommand \tableofcontents{}
 
 \end_inset 
 
@@ -70,12 +100,12 @@ In this document we present a filter that recognizes compilation error messages
 
 The filter is required to read from standard input, parse for error messages
  and copy the error messages to the standard output.
- During the output process, the filter must present the error messages in a
- format that LyX can interpret, currently, the LaTeX error message format.
- Of course, nothing will prevent future LyX releases from being able to read
- other formats as well (like gcc error messages for example).
- This mechanism is necessary to fully explore the literate programming
tool's capabilities.
+ During the output process, the filter must present the error messages in
format that LyX can interpret, currently, the LaTeX error message format.
+ Of course, nothing will prevent future LyX releases from being able to
read other formats as well (like gcc error messages for example).
+ This mechanism is necessary to fully explore the literate programming tool's
+ capabilities.
 \layout Section
 
 Algorithm
@@ -89,219 +119,51 @@ main (int argc, char **argv)
 \newline 
 {
 \newline 
-
-\protected_separator 
- if (argc == 2) {
+  if (argc == 2) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- switch (argv[1][0]) {
+    switch (argv[1][0]) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- case 'n':
+    case 'n':
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- <<Scan input for noweb error messages>>
+      <<Scan input for noweb error messages>>
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- break;
+      break;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- case 'x':
+    case 'x':
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- <<Scan input for xlc error messages>>
+      <<Scan input for xlc error messages>>
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- break;
+      break;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- case 'a':
+    case 'a':
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-<<AIX system using both noweb and xlc>>
+      <<AIX system using both noweb and xlc>>
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- break;
+      break;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- case 's':
+    case 's':
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- case 'b':
+    case 'b':
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- <<Solaris and Linux systems using both noweb and gcc>>
+      <<Solaris and Linux systems using both noweb and gcc>>
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- break;
+      break;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- case 'g':
+    case 'g':
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- default:
+    default:
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- <<Scan input for gcc error messages>>
+      <<Scan input for gcc error messages>>
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- break;
+      break;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- }
+    }
 \newline 
-
-\protected_separator 
- } else {
+  } else {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- <<Scan input for gcc error messages>>
+    <<Scan input for gcc error messages>>
 \newline 
-
-\protected_separator 
- }
+  }
 \newline 
 }
 \newline 
@@ -326,43 +188,13 @@ We resort to some global variables to allow access from several different
 
 <<Global variables>>=
 \newline 
-char
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- buffer[200][200];
+char    buffer[200][200];
 \newline 
-int
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- last_buf_line;
+int     last_buf_line;
 \newline 
-int
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- last_err_line;
+int     last_err_line;
 \newline 
-int
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- err_line;
+int     err_line;
 \newline 
 @ 
 \layout Section
@@ -370,7 +202,7 @@ int
 The output format
 \layout Standard
 
-The output format mimics the LaTeX error messages format.
+The output format mimics the TeX error messages format.
  This function prints a number of lines residing in the global variable
  
 \family typewriter 
@@ -378,6 +210,18 @@ buffer
 \family default 
 , a program name and line number.
  There is no special requirement on the input strings, they can be anything.
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+This function has been slightly changed from EW's original to make scanning
+ a bit easier with LaTeX::scanLogFile().
+ The test has been added because LyX can crash if empty lines are allowed
+ here --- I can't figure out why! --- BMH
+\end_inset 
+
+
 \layout Scrap
 
 <<Function bodies>>=
@@ -388,52 +232,36 @@ output_error (int buf_size, int error_line, char *tool)
 \newline 
 {
 \newline 
-
-\protected_separator 
- int
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- i;
+  int     i;
 \newline 
-
-\protected_separator 
-
 \newline 
-
-\protected_separator 
- fprintf(stdout, "! Build Error: ==> %s ==>
+  fprintf(stdout, "! Build Error: ==> %s ==>
 \backslash 
 n", tool);
 \newline 
-
-\protected_separator 
- for (i=0; i<buf_size; i++)
-\newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- fprintf(stdout, "%s", buffer[i]);
-\newline 
-
-\protected_separator 
- fprintf(stdout, " ...
+  fprintf(stdout, " ...
 \backslash 
 n
 \backslash 
 nl.%d ...
 \backslash 
-n
-\backslash 
 n", error_line);
 \newline 
+\newline 
+  for (i=0; i<buf_size; i++)
+\newline 
+    if (strlen(buffer[i]) != 0)
+\newline 
+      fprintf(stdout, "%s", buffer[i]);
+\newline 
+\newline 
+  fprintf(stdout, "
+\backslash 
+n");
+\newline 
 }
 \newline 
 @
@@ -461,37 +289,15 @@ Both noweave and notangle routines, always output one single line for each
 \newline 
 {
 \newline 
-
-\protected_separator 
- last_buf_line = 0;
+  last_buf_line = 0;
 \newline 
-
-\protected_separator 
- while (fgets(buffer[0], 200, stdin)) {
+  while (fgets(buffer[0], 200, stdin)) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (noweb_try(0))
+    if (noweb_try(0))
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- output_error(1, 0, "noweb");
+      output_error(1, err_line, "noweb");
 \newline 
-
-\protected_separator 
- }
+  }
 \newline 
 }
 \newline 
@@ -510,53 +316,37 @@ The examination itself is very inefficient.
 \newline 
 char *noweb_msgs[] = {
 \newline 
-
-\protected_separator 
- "couldn't open file",
+  "couldn't open file",
 \newline 
-
-\protected_separator 
- "couldn't open temporary file",
+  "couldn't open temporary file",
 \newline 
-
-\protected_separator 
- "error writing temporary file",
+  "error writing temporary file",
 \newline 
-
-\protected_separator 
- "ill-formed option",
+  "ill-formed option",
 \newline 
-
-\protected_separator 
- "unknown option",
+  "unknown option",
 \newline 
-
-\protected_separator 
- "Bad format sequence",
+  "Bad format sequence",
 \newline 
-
-\protected_separator 
- "Can't open output file",
+  "Can't open output file",
 \newline 
-
-\protected_separator 
- "Can't open temporary file",
+  "Can't open temporary file",
 \newline 
-
-\protected_separator 
- "Capacity exceeded:",
+  "Capacity exceeded:",
 \newline 
-
-\protected_separator 
- "Ignoring unknown option -",
+  "Ignoring unknown option -",
 \newline 
-
-\protected_separator 
- "This can't happen:",
+  "This can't happen:",
+\newline 
+  "non-numeric line number in"
+\newline 
+};
 \newline 
 
-\protected_separator 
- "non-numeric line number in" 
+\newline 
+char *noweb_msgs_mimic_gcc[] = {
+\newline 
+  ": unescaped << in documentation chunk"
 \newline 
 };
 \newline 
@@ -564,13 +354,10 @@ char *noweb_msgs[] = {
 \layout Standard
 
 A noweb error message can be any string that contains a matching pair of
- < <
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-> >, or any of the above strings.
+ < <\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+> >, or any of the above strings
 \layout Scrap
 
 <<Function bodies>>=
@@ -581,161 +368,69 @@ noweb_try (int buf_line)
 \newline 
 {
 \newline 
-
-\protected_separator 
- char
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- *s, *b;
+  char    *s, *t, *b;
 \newline 
-
-\protected_separator 
- int
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- i;
+  int     i; 
 \newline 
 
-\protected_separator 
-
 \newline 
-
-\protected_separator 
- b = buffer[buf_line];
+  b = buffer[buf_line];
 \newline 
-
-\protected_separator 
- s = strstr(b, "<<");
+  err_line = 0;
 \newline 
 
-\protected_separator 
- if (s != NULL) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- s = strstr(s+2, ">>");
+  for (i=0; i<1; i++) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (s != NULL)
+      s = (char *)strstr (b, noweb_msgs_mimic_gcc[i]);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- return 1;
+      if (s != NULL) {
 \newline 
-
-\protected_separator 
- } else {
+        t = (char *)strchr(buffer[buf_line], ':');
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- for (i=0; i<12; i++) {
+        err_line = atoi(t+1);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- s = strstr (b, noweb_msgs[i]);
+        t = buffer[buf_line];
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (s != NULL)
+        ++s;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-break;
+        while (*(t++) = *(s++));
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- }
+        return 1;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (s != NULL)
+      }
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- return 1;
+  }
 \newline 
-
-\protected_separator 
- }
+  s = (char *)strstr(b, "<<");
 \newline 
-
-\protected_separator 
- return 0;
+  if (s != NULL) {
+\newline 
+    s = (char *)strstr(s+2, ">>");
+\newline 
+    if (s != NULL) {
+\newline 
+      return 1;
+\newline 
+    }
+\newline 
+  } else { 
+\newline 
+     for (i = 0; i < 12; ++i) {
+\newline 
+        s = (char *)strstr (b, noweb_msgs[i]);
+\newline 
+        if (s != NULL) {
+\newline 
+           return 1;
+\newline 
+        }
+\newline 
+    }
+\newline 
+  }
+\newline 
+  return 0;
 \newline 
 }
 \newline 
@@ -754,43 +449,19 @@ The xlc compiler always outputs one single line for each error found, thus
  line at a time.
 \layout Scrap
 
-<<Scan input for xlc error messages>>=
-\protected_separator 
-
+<<Scan input for xlc error messages>>= 
 \newline 
 {
 \newline 
-
-\protected_separator 
- last_buf_line = 0;
+  last_buf_line = 0;
 \newline 
-
-\protected_separator 
- while (fgets(buffer[last_buf_line], 200, stdin)) {
+  while (fgets(buffer[last_buf_line], 200, stdin)) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (xlc_try(0))
+    if (xlc_try(0))
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- output_error(1, err_line, "xlc");
+      output_error(1, err_line, "xlc");
 \newline 
-
-\protected_separator 
- }
+  }
 \newline 
 }
 \newline 
@@ -819,65 +490,29 @@ xlc_try (int buf_line)
 \newline 
 {
 \newline 
-
-\protected_separator 
- char
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- *s, *t;
+  char    *s, *t;
 \newline 
-
-\protected_separator 
-
 \newline 
-
-\protected_separator 
- t = buffer[buf_line];
+  t = buffer[buf_line];
 \newline 
-
-\protected_separator 
- s = t+1;
+  s = t+1;
 \newline 
-
-\protected_separator 
- while (*s != '"' && *s != ' ' && *s != '
+  while (*s != '"' && *s != ' ' && *s != '
 \backslash 
 0')
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- s++;
+    s++;
 \newline 
-
-\protected_separator 
- if (*t != '"' || *s != '"' || strncmp(s+1, ", line ", 7) != 0)
+  if (*t != '"' || *s != '"' || strncmp(s+1, ", line ", 7) != 0)
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- return 0;
+    return 0;
 \newline 
-
-\protected_separator 
- s += 8;
+  s += 8;
 \newline 
-
-\protected_separator 
- err_line = atoi(s);
+  err_line = atoi(s);
 \newline 
-
-\protected_separator 
- return 1;
+  return 1;
 \newline 
 }
 \newline 
@@ -929,223 +564,53 @@ Every gcc error message contains a string with no space followed by a
 \newline 
 {
 \newline 
-
-\protected_separator 
- char
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- *s, *t;
+  char    *s, *t;
 \newline 
-
-\protected_separator 
-
 \newline 
-
-\protected_separator 
- last_buf_line = 0;
+  last_buf_line = 0;
 \newline 
-
-\protected_separator 
- while (fgets(buffer[last_buf_line], 200, stdin)) {
+  while (fgets(buffer[last_buf_line], 200, stdin)) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- /****** Skip lines until I find an error */
+    /****** Skip lines until I find an error */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- s = strpbrk(buffer[last_buf_line], " :");
+    s = (char *)strpbrk(buffer[last_buf_line], " :");
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (s == NULL || *s == ' ')
+    if (s == NULL || *s == ' ')
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- continue; /* No gcc error found here */
+      continue; /* No gcc error found here */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- do {
+    do {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-<<gcc error message criteria is to find a "...:999:" or a "...: ">>
+      <<gcc error message criteria is to find a "...:999:" or a "...: ">>
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- /****** OK It is an error message, get line number */
+      /****** OK It is an error message, get line number */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- err_line = atoi(s+1);
+      err_line = atoi(s+1);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (last_err_line == 0 || last_err_line == err_line) {
+      if (last_err_line == 0 || last_err_line == err_line) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-last_err_line = err_line;
+        last_err_line = err_line;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-continue; /* It's either a header or a continuation, don't output yet */
+        continue; /* It's either a header or a continuation, don't output
+ yet */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- }
+      }
 \newline 
-
-\protected_separator 
-\protected_separator 
-\protected_separator 
- /****** Completed the scan of one error message, output it to LyX */
+      /****** Completed the scan of one error message, output it to LyX
+ */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- discharge_buffer(1);
+      discharge_buffer(1);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- break;
+      break;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- } while (fgets(buffer[last_buf_line], 200, stdin));
+    } while (fgets(buffer[last_buf_line], 200, stdin));
 \newline 
-
-\protected_separator 
- }
+  }
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-/****** EOF completes the scan of whatever was being scanned */
+  /****** EOF completes the scan of whatever was being scanned */
 \newline 
-
-\protected_separator 
- discharge_buffer(0);
+  discharge_buffer(0);
 \newline 
 }
 \newline 
@@ -1156,35 +621,29 @@ continue; /* It's either a header or a continuation, don't output yet */
 \newline 
 /****** Search first ":" in the error number */
 \newline 
-s = strpbrk(buffer[last_buf_line], " :");
+s = (char *)strpbrk(buffer[last_buf_line], " :");
 \newline 
 last_buf_line++;
 \newline 
 if (s == NULL || *s == ' ') 
 \newline 
-
-\protected_separator 
- <<No gcc error found here, but it might terminate the scanning of a previous
+  <<No gcc error found here, but it might terminate the scanning of a previous
  one>>
 \newline 
 /****** Search second ":" in the error number */
 \newline 
-t = strpbrk(s+1, " :");
+t = (char *)strpbrk(s+1, " :");
 \newline 
 if (t == NULL || *t == ' ')
 \newline 
-
-\protected_separator 
- <<No gcc error found here, but it might terminate the scanning of a previous
+  <<No gcc error found here, but it might terminate the scanning of a previous
  one>>
 \newline 
 /****** Verify if is all digits between ":" */
 \newline 
 if (t != s+1+strspn(s+1, "0123456789")) 
 \newline 
-
-\protected_separator 
- <<No gcc error found here, but it might terminate the scanning of a previous
+  <<No gcc error found here, but it might terminate the scanning of a previous
  one>>
 \newline 
 @
@@ -1195,23 +654,11 @@ if (t != s+1+strspn(s+1, "0123456789"))
 \newline 
 {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-err_line = 0;
+  err_line = 0;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-discharge_buffer(1);
+  discharge_buffer(1);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-continue;
+  continue;
 \newline 
 }
 \newline 
@@ -1241,121 +688,118 @@ discharge_buffer (int save_last)
 \newline 
 {
 \newline 
-
-\protected_separator 
- if (last_err_line != 0) {
+ if (last_err_line != 0) { 
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (save_last != 0) {
+   clean_gcc_messages();
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- output_error(last_buf_line-1, last_err_line, "gcc");
+   if (save_last != 0) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- strcpy (buffer[0], buffer[last_buf_line-1]);
+      output_error(last_buf_line-1, last_err_line, "gcc");
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- last_err_line = err_line;
+      strcpy (buffer[0], buffer[last_buf_line-1]);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- last_buf_line = 1;
+      last_err_line = err_line;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- } else {
+      last_buf_line = 1;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- output_error (last_buf_line, last_err_line, "gcc");
+    } else { 
 \newline 
+      ++last_buf_line;
+\newline 
+      clean_gcc_messages();
+\newline 
+      output_error(last_buf_line-1, last_err_line, "gcc");
+\newline 
+      last_err_line = 0;
+\newline 
+      last_buf_line = 0;
+\newline 
+    }
+\newline 
+  }
+\newline 
+}
+\newline 
+@
+\layout Scrap
 
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- last_err_line = 0;
+<<Function prototypes>>=
+\newline 
+void discharge_buffer (int save_last);
 \newline 
+@
+\layout Standard
 
-\protected_separator 
+The next function 
+\begin_inset Quotes eld
+\end_inset 
 
-\protected_separator 
+cleans
+\begin_inset Quotes erd
+\end_inset 
 
-\protected_separator 
+ superfluous information from gcc messages, namely the name of the noweb
+ file and the line number of the Error.
+\begin_inset Foot
+collapsed true
 
-\protected_separator 
+\layout Standard
 
-\protected_separator 
- last_buf_line = 0;
-\newline 
+More could be done.
+ For instance, some way of distinguishing between gcc Errors and Warnings
+ should be devised.
+\end_inset 
 
-\protected_separator 
 
-\protected_separator 
+\layout Scrap
 
-\protected_separator 
- }
+<<Function bodies>>=
 \newline 
-
-\protected_separator 
- }
+void
+\newline 
+clean_gcc_messages ()
+\newline 
+{
+\newline 
+  int index;
+\newline 
+  char search [30]; 
+\newline 
+  char *tail, *head; 
+\newline 
+  int search_len = sprintf(search, ".nw:%d:", last_err_line);
+\newline 
+  
+\newline 
+  for (index = 0; index < last_buf_line-1; index++) {
+\newline 
+    tail = (char *)strstr (buffer[index], search);
+\newline 
+    if ( tail == NULL) {
+\newline 
+       tail = (char *) strstr (buffer[index], ".nw:");
+\newline 
+       if (tail) {
+\newline 
+          tail += 4;
+\newline 
+       }
+\newline 
+    } else {
+\newline 
+       tail += search_len;
+\newline 
+    }
+\newline 
+    if (tail != NULL) {
+\newline 
+       head = buffer[index];
+\newline 
+       while (*(head++) = *(tail++));
+\newline 
+    }
+\newline 
+  }
 \newline 
 }
 \newline 
@@ -1364,7 +808,7 @@ discharge_buffer (int save_last)
 
 <<Function prototypes>>=
 \newline 
-void discharge_buffer (int save_last);
+void clean_gcc_messages ();
 \newline 
 @
 \layout Standard
@@ -1378,57 +822,19 @@ To combine the scan of noweb error messages and xlc error messages is very
 \newline 
 {
 \newline 
-
-\protected_separator 
- last_buf_line = 0;
+  last_buf_line = 0;
 \newline 
-
-\protected_separator 
- while (fgets(buffer[0], 200, stdin)) {
+  while (fgets(buffer[0], 200, stdin)) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (noweb_try(0))
+    if (noweb_try(0))
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- output_error(1, 0, "noweb");
+      output_error(1, err_line, "noweb");
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- else if (xlc_try(0))
+    else if (xlc_try(0))
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- output_error(1, err_line, "xlc");
+      output_error(1, err_line, "xlc");
 \newline 
-
-\protected_separator 
- }
+  }
 \newline 
 }
 \newline 
@@ -1436,8 +842,8 @@ To combine the scan of noweb error messages and xlc error messages is very
 \layout Standard
 
 To combine the scan of noweb error messages and gcc error messages is simple
- if we realize that it is not possible to find a noweb error message
in the middle of a gcc error message.
+ if we realize that it is not possible to find a noweb error message in
+ the middle of a gcc error message.
  So we just repeat the gcc procedure and test for noweb error messages in
  the beginning of the scan:
 \layout Scrap
@@ -1446,263 +852,61 @@ To combine the scan of noweb error messages and gcc error messages is simple
 \newline 
 {
 \newline 
-
-\protected_separator 
- char
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- *s, *t;
+  char    *s, *t;
 \newline 
-
-\protected_separator 
-
 \newline 
-
-\protected_separator 
- last_buf_line = 0;
+  last_buf_line = 0;
 \newline 
-
-\protected_separator 
- while (fgets(buffer[last_buf_line], 200, stdin)) {
+  while (fgets(buffer[last_buf_line], 200, stdin)) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- /****** Skip lines until I find an error */
+    /****** Skip lines until I find an error */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (last_buf_line == 0 && noweb_try(0)) {
+    if (last_buf_line == 0 && noweb_try(0)) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- output_error(1, 0, "noweb");
+      output_error(1, err_line, "noweb");
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- continue;
+      continue;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- }
+    }
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- s = strpbrk(buffer[last_buf_line], " :");
+    s = (char *)strpbrk(buffer[last_buf_line], " :");
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (s == NULL || *s == ' ')
+    if (s == NULL || *s == ' ')
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- continue; /* No gcc error found here */
+      continue; /* No gcc error found here */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- do {
+    do {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-<<gcc error message criteria is to find a "...:999:" or a "...: ">>
+      <<gcc error message criteria is to find a "...:999:" or a "...: ">>
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- /****** OK It is an error, get line number */
+      /****** OK It is an error, get line number */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- err_line = atoi(s+1);
+      err_line = atoi(s+1);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- if (last_err_line == 0 || last_err_line == err_line) {
+      if (last_err_line == 0 || last_err_line == err_line) {
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-last_err_line = err_line;
+        last_err_line = err_line;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-continue; /* It's either a header or a continuation, don't output yet */
+        continue; /* It's either a header or a continuation, don't output
+ yet */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- }
+      }
 \newline 
-
-\protected_separator 
-\protected_separator 
-\protected_separator 
- /****** Completed the scan of one error message, output it to LyX */
+      /****** Completed the scan of one error message, output it to LyX
+ */
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- discharge_buffer(1);
+      discharge_buffer(1);
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- break;
+      break;
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-
-\protected_separator 
- } while (fgets(buffer[last_buf_line], 200, stdin));
+    } while (fgets(buffer[last_buf_line], 200, stdin));
 \newline 
-
-\protected_separator 
- }
+  }
 \newline 
-
-\protected_separator 
-
-\protected_separator 
-/****** EOF completes the scan of whatever was being scanned */
+  /****** EOF completes the scan of whatever was being scanned */
 \newline 
-
-\protected_separator 
- discharge_buffer(0);
+  discharge_buffer(0);
 \newline 
 }
 \newline 
@@ -1716,17 +920,9 @@ Wrapping the code into a file
 \newline 
 #include <stdio.h>
 \newline 
-#include <strings.h> 
-\protected_separator 
-\protected_separator 
-\protected_separator 
+#include <strings.h>       
 \newline 
-
-\protected_separator 
-
 \newline 
 <<Global variables>>
 \newline 
@@ -1767,9 +963,11 @@ listerrors.c
 
 <<build-script>>=
 \newline 
-#!/usr/local/bin/bash
+#!/bin/sh
+\newline 
+if [ -z "$NOWEB_SOURCE" ]; then NOWEB_SOURCE=Literate.nw; fi
 \newline 
-notangle -L -Rlisterrors.c Literate.nw > listerrors.c
+notangle -L -Rlisterrors.c ${NOWEB_SOURCE} > listerrors.c
 \newline 
 gcc -g -o listerrors listerrors.c
 \newline 
@@ -1792,11 +990,7 @@ build-script
 
 #!/bin/sh
 \newline 
-notangle -Rbuild-script $1 | sh
-\the_end
-
-
-
-
-
+notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 sh
+\layout LyX-Code
 
+\the_end