-#LyX 1.5.0svn created this file. For more info see http://www.lyx.org/
-\lyxformat 276
+#LyX 2.2 created this file. For more info see http://www.lyx.org/
+\lyxformat 506
\begin_document
\begin_header
-\textclass literate-article
+\save_transient_properties true
+\origin /systemlyxdir/examples/
+\textclass article
\begin_preamble
%
% ps2pdf stuff
\def\nwendcode{\endtrivlist \endgroup \vfil\penalty10\vfilneg}
\let\nwdocspar=\smallbreak
\end_preamble
+\use_default_options false
+\begin_modules
+noweb
+\end_modules
+\maintain_unincluded_children false
\language english
+\language_package default
\inputencoding auto
-\font_roman times
-\font_sans helvet
-\font_typewriter courier
+\fontencoding global
+\font_roman "times" "default"
+\font_sans "helvet" "default"
+\font_typewriter "courier" "default"
+\font_math "auto" "auto"
\font_default_family default
+\use_non_tex_fonts false
\font_sc false
\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
+\font_sf_scale 100 100
+\font_tt_scale 100 100
\graphics default
+\default_output_format pdf
+\output_sync 0
+\bibtex_command default
+\index_command default
\paperfontsize default
\spacing single
+\use_hyperref false
\papersize default
\use_geometry false
-\use_amsmath 0
-\use_esint 0
+\use_package amsmath 0
+\use_package amssymb 0
+\use_package cancel 0
+\use_package esint 0
+\use_package mathdots 1
+\use_package mathtools 0
+\use_package mhchem 1
+\use_package stackrel 0
+\use_package stmaryrd 0
+\use_package undertilde 0
\cite_engine basic
+\cite_engine_type default
+\biblio_style plain
\use_bibtopic false
+\use_indices false
\paperorientation portrait
+\suppress_date false
+\justification true
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
-\defskip medskip
+\paragraph_indentation default
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
\end_header
\begin_body
\begin_layout Title
+\SpecialChar LyX
+ listerrors:
+\begin_inset Newline newline
+\end_inset
-LyX listerrors:
-\newline
rewritten in Python
\end_layout
\begin_layout Author
-
Kayvan A.
Sylvan
-\newline
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+mailto:kayvan@sylvan.com
+\end_layout
-\begin_inset LatexCommand url
-target "mailto:kayvan@sylvan.com"
\end_inset
\end_layout
\begin_layout Date
-
3/15/2002
\end_layout
\begin_layout Abstract
-
The listerrors program used to be compiled as a C program and installed
- as
-\emph default
-
+ as
\emph on
BINDIR/listerrors
\emph default
- along with LyX in order to perform some simple re-formatting of noweb and
+ along with \SpecialChar LyX
+ in order to perform some simple re-formatting of noweb and
GCC error messages.
This document describes and implements the Python version of the same program.
\end_layout
\begin_layout Standard
+\begin_inset CommandInset toc
+LatexCommand tableofcontents
-
-\begin_inset LatexCommand tableofcontents
\end_inset
\end_layout
\begin_layout Section
-
Introduction
\end_layout
\begin_layout Standard
-
-The motivation for this program was Bugzilla bug 190
+The motivation for this program was \SpecialChar LyX
+ bug 190
\begin_inset Foot
status collapsed
-\begin_layout Standard
-
+\begin_layout Plain Layout
Visit
-\begin_inset LatexCommand url
-target "http://bugzilla.lyx.org/show_bug.cgi?id=190"
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+http://www.lyx.org/trac/ticket/190
+\end_layout
+
\end_inset
for the details.
\end_layout
\begin_layout Standard
-
What is
\begin_inset Quotes eld
\end_inset
\begin_inset Quotes erd
\end_inset
-? Usually, LyX has great support for parsing of error messages.
- For each error in the log file, LyX pops up an error box at that location
- in the LyX window.
+? Usually, \SpecialChar LyX
+ has great support for parsing of error messages.
+ For each error in the log file, \SpecialChar LyX
+ pops up an error box at that location
+ in the \SpecialChar LyX
+ window.
The error scanning routines expect these errors to be in a certain format
- (similar to LaTeX errors).
+ (similar to \SpecialChar LaTeX
+ errors).
When dealing with Literate Programs, you have
\begin_inset Quotes eld
\end_inset
\begin_inset Foot
status collapsed
-\begin_layout Standard
-
+\begin_layout Plain Layout
See
-\begin_inset LatexCommand url
-target "http://www.eecs.harvard.edu/~nr/noweb"
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+http://www.eecs.harvard.edu/~nr/noweb
+\end_layout
+
\end_inset
for more information about noweb.
as well as gcc error messages (and potentially others).
The listerrors program attempts to standardize these error messages to
- a format that LyX can parse and react to.
+ a format that \SpecialChar LyX
+ can parse and react to.
\end_layout
\begin_layout Standard
-
In a nutshell, the problems with the old implementation of listerrors that
bug 190 refers to were::
\end_layout
\begin_layout Enumerate
-
It was a C program and it was installed in the user path in the same directory
- as LyX.
- Having such a generically named binary in, for example,
-\emph default
-
+ as \SpecialChar LyX
+.
+ Having such a generically named binary in, for example,
\emph on
/usr/bin
\emph default
\end_layout
\begin_layout Enumerate
-
It required that noweb be installed on the compiling machine (the source
- was extracted by noweb from
-\emph default
-
+ was extracted by noweb from
\emph on
SRCDIR/examples/Literate.lyx
\emph default
\end_layout
\begin_layout Standard
-
The new version deals with these problems in the following fashion:
\end_layout
\begin_layout Enumerate
-
Both the example file (this document) and the program are to be added to
- the LyX CVS repository.
+ the \SpecialChar LyX
+ CVS repository.
\end_layout
\begin_layout Enumerate
-
-The program itself will be installed in
-\emph default
-
+The program itself will be installed in
\emph on
SHAREDIR/lyx/scripts
\emph default
-, along with other LyX-specific helper scripts.
+, along with other \SpecialChar LyX
+-specific helper scripts.
\end_layout
\begin_layout Standard
-
In the design and implementation of this new
\begin_inset Quotes eld
\end_inset
\begin_inset Foot
status collapsed
-\begin_layout Standard
-
+\begin_layout Plain Layout
See the Python home page (
-\begin_inset LatexCommand url
-target "http://www.python.org"
+\begin_inset Flex URL
+status collapsed
+
+\begin_layout Plain Layout
+
+http://www.python.org
+\end_layout
+
\end_inset
) for more information.
available for all other platforms.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<listerrors>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
#!/usr/bin/python -tt
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"""reformat noweb and compiler errors for LyX.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
Expects to read from stdin and output to stdout.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"""
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
__author__ = "Kayvan A.
Sylvan <kayvan@sylvan.com>"
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
__date__ = "$Date: 2005/07/18 09:42:26 $"
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
__version__ = "$Revision: 1.5 $"
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
__credits__ = """Edmar Wienskoski Jr.
<edmar-w-jr@technologist.com>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
original Literate support for LyX.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
Bernard Michael Hurley <berhardh@westherts.ac.uk>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
modifications to original listerrors."""
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
__copyright__ = "Copyright 2002 - Kayvan Sylvan."
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
import sys, string
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
<<Function Bodies>>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
if __name__ == "__main__":
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
main()
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
@
\end_layout
+\end_inset
+
+
+\end_layout
+
\begin_layout Section
+\SpecialChar LaTeX
+ style error message
+\end_layout
-LaTeX style error message
+\begin_layout Standard
+The following function mimics the \SpecialChar TeX
+ error message format.
\end_layout
\begin_layout Standard
+\begin_inset ERT
+status open
-The following function mimics the TeX error message format.
+\begin_layout Plain Layout
+
+<<Function Bodies>>=
\end_layout
-\begin_layout Scrap
+\begin_layout Plain Layout
-<<Function Bodies>>=
-\newline
def write_error(msg, tool = "noweb", line_number = 1):
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"""Write out the given message in TeX error style.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
called like: write_error(msg, tool, line_number)."""
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
print "! Build Error: ==> %s ==>
\backslash
n" % (tool),
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
print " ...
\backslash
n
nl.%d ...
\backslash
n" % (line_number),
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if type(msg) == type("str"): # simple string
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
print msg
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
else: # some kind of list (sequence or tuple)
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
for m in msg:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if m != "": print m,
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
print
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
@ %def write_error
\end_layout
-\begin_layout Section
+\end_inset
+
+
+\end_layout
+\begin_layout Section
Filtering errors
\end_layout
\begin_layout Standard
-
The only complication in our filtering code is that some parsers might need
to push back lines that are read in to be read again later.
We solve this problem by implementing a
set of functions:
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<Function Bodies>>=
-\newline
-__lines = [] # lines pushed back
-\newline
-
-\newline
-def getline(file = sys.stdin):
-\newline
- """read a line from internal stack or from file.
-\newline
+\end_layout
-\newline
- optional file argument defaults to sys.stdin."""
-\newline
- global __lines
-\newline
- lines = __lines
-\newline
- if lines:
-\newline
- line = lines.pop()
-\newline
- else:
-\newline
- line = file.readline()
-\newline
- return line
-\newline
+\begin_layout Plain Layout
-\newline
-@ %def getline
+__lines = [] # lines pushed back
\end_layout
-\begin_layout Standard
+\begin_layout Plain Layout
-And now for the corresponding pushline function:
\end_layout
-\begin_layout Scrap
-
-<<Function Bodies>>=
-\newline
-def pushline(line):
-\newline
- "push a line onto the pushback stack."
-\newline
- global __lines
-\newline
- lines = __lines
-\newline
- lines.append(line)
-\newline
+\begin_layout Plain Layout
-\newline
-@ %def pushline
+def getline(file = sys.stdin):
\end_layout
-\begin_layout Standard
+\begin_layout Plain Layout
-The main() entry point function is extremely simple.
- Note that this version of
-\begin_inset Quotes eld
-\end_inset
+ """read a line from internal stack or from file.
+\end_layout
-listerrors
-\begin_inset Quotes erd
-\end_inset
+\begin_layout Plain Layout
- takes no options and simply filters, attempting simply to match against
- the known error message patterns.
- The listerrors C program handled a single-character command-line argument
- that the current code no longer needs.
-
\end_layout
-\begin_layout Scrap
+\begin_layout Plain Layout
-<<Function Bodies>>=
-\newline
-def main():
-\newline
- """Entry point for listerrors.
- Takes no options.
-\newline
+ optional file argument defaults to sys.stdin."""
+\end_layout
-\newline
- Reads stdin and writes to stdout.
- Filter errors"""
-\newline
+\begin_layout Plain Layout
-\newline
- while 1:
-\newline
- line = getline()
-\newline
- if line == "": break
-\newline
- <<Check line against patterns and take action>>
-\newline
-@ %def main
+ global __lines
\end_layout
-\begin_layout Standard
+\begin_layout Plain Layout
-For each line read in, we need to find out if it matches any of our tools
- (noweb, gcc, etc.) and act accordingly.
+ lines = __lines
\end_layout
-\begin_layout Scrap
+\begin_layout Plain Layout
-<<Check line against patterns and take action>>=
-\newline
-try_patterns_dispatch = [ noweb_try, gcc_try, xlc_try ]
-\newline
-for predicate in try_patterns_dispatch:
-\newline
- if predicate(line): break
-\newline
-@
+ if lines:
\end_layout
-\begin_layout Section
+\begin_layout Plain Layout
-Different Error Formats
+ line = lines.pop()
\end_layout
-\begin_layout Standard
+\begin_layout Plain Layout
-The following sections handle the various error message formats that we
- recognize in this program.
-
+ else:
\end_layout
-\begin_layout Subsection
+\begin_layout Plain Layout
-noweb errors
+ line = file.readline()
\end_layout
-\begin_layout Standard
+\begin_layout Plain Layout
-Noweb errors are output on a single line, so examining just the current
- line is enough.
+ return line
\end_layout
-\begin_layout Scrap
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+@ %def getline
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+And now for the corresponding pushline function:
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+<<Function Bodies>>=
+\end_layout
+
+\begin_layout Plain Layout
+
+def pushline(line):
+\end_layout
+
+\begin_layout Plain Layout
+
+ "push a line onto the pushback stack."
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ global __lines
+\end_layout
+
+\begin_layout Plain Layout
+
+ lines = __lines
+\end_layout
+
+\begin_layout Plain Layout
+
+lines.append(line)
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+@ %def pushline
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The main() entry point function is extremely simple.
+ Note that this version of
+\begin_inset Quotes eld
+\end_inset
+
+listerrors
+\begin_inset Quotes erd
+\end_inset
+
+ takes no options and simply filters, attempting simply to match against
+ the known error message patterns.
+ The listerrors C program handled a single-character command-line argument
+ that the current code no longer needs.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<Function Bodies>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+def main():
+\end_layout
+
+\begin_layout Plain Layout
+
+ """Entry point for listerrors.
+ Takes no options.
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ Reads stdin and writes to stdout.
+ Filter errors"""
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ while 1:
+\end_layout
+
+\begin_layout Plain Layout
+
+ line = getline()
+\end_layout
+
+\begin_layout Plain Layout
+
+ if line == "": break
+\end_layout
+
+\begin_layout Plain Layout
+
+ <<Check line against patterns and take action>>
+\end_layout
+
+\begin_layout Plain Layout
+
+@ %def main
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+For each line read in, we need to find out if it matches any of our tools
+ (noweb, gcc, etc.) and act accordingly.
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+<<Check line against patterns and take action>>=
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+try_patterns_dispatch = [ noweb_try, gcc_try, xlc_try ]
+\end_layout
+
+\begin_layout Plain Layout
+
+for predicate in try_patterns_dispatch:
+\end_layout
+
+\begin_layout Plain Layout
+
+ if predicate(line): break
+\end_layout
+
+\begin_layout Plain Layout
+
+@
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Different Error Formats
+\end_layout
+
+\begin_layout Standard
+The following sections handle the various error message formats that we
+ recognize in this program.
+
+\end_layout
+
+\begin_layout Subsection
+noweb errors
+\end_layout
+
+\begin_layout Standard
+Noweb errors are output on a single line, so examining just the current
+ line is enough.
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+<<Function Bodies>>=
+\end_layout
+
+\begin_layout Plain Layout
+
def noweb_try(line):
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"""see if line is a noweb error.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
Returns 1 on success, 0 otherwise.
Outputs on stdout."""
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 0
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
<<Look for the unescaped angle-brackets in documentation>>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
<<Look for anything with double angle brackets>>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
<<Last ditch effort scan for specific strings>>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
return retval
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
@ %def noweb_try
\end_layout
-\begin_layout Standard
+\end_inset
+
+
+\end_layout
+\begin_layout Standard
First, we look for the
\begin_inset Quotes eld
\end_inset
This is the only message with an associated line number from noweb.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
<<Look for the unescaped angle-brackets in documentation>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if string.find(line, ": unescaped << in documentation chunk") != -1:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
line_parts = string.split(line, ':')
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
num_str = line_parts[1]
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
num_len = len(num_str)
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
i = 0
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
while i < num_len and (num_str[i] in string.digits): i = i + 1
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if i == num_len:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
write_error(":" + line_parts[2], "noweb", int(num_str))
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 1
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
@
\end_layout
-\begin_layout Standard
+\end_inset
+
-Some noweb messages are simply about undefined scraps.
+\end_layout
+
+\begin_layout Standard
+Some noweb messages are simply about undefined chunks.
These can be seen by looking for matching double-angle-brackets.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<Look for anything with double angle brackets>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
if (not retval):
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
left = string.find(line, "<<")
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if (left != -1) and ((left + 2) < len(line)) and
\backslash
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
(string.find(line[left+2:], ">>") != -1):
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
write_error(line, "noweb");
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 1;
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
@
\end_layout
-\begin_layout Standard
+\end_inset
+
+\end_layout
+
+\begin_layout Standard
Finally, here is an additional list of explicit strings to check for.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<Last ditch effort scan for specific strings>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if (not retval):
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
msgs_to_try = ("couldn't open file",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"couldn't open temporary file",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"error writing temporary file",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"ill-formed option",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"unknown option",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"Bad format sequence",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"Can't open output file",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"Can't open temporary file",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"Capacity exceeded:",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"Ignoring unknown option -",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"This can't happen:",
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"non-numeric line number in")
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
for msg in msgs_to_try:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if string.find(line, msg) != -1:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
write_error(line, "noweb")
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 1
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
break
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
@
\end_layout
-\begin_layout Subsection
+\end_inset
+
+
+\end_layout
+\begin_layout Subsection
gcc errors
\end_layout
\begin_layout Standard
-
The gcc errors can be multi-line, with the following format:
\end_layout
-\begin_layout LyX-Code
+\begin_layout LyX-Code
+foo.c: In function `main':
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+foo.c:3: `bar' undeclared (first use in this function)
+\end_layout
+
+\begin_layout Plain Layout
+
+foo.c:3: (Each undeclared identifier is reported only once
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+foo.c:3: for each function it appears in.)
+\end_layout
+
+\begin_layout Plain Layout
+
+foo.c:3: parse error before `x'
+\end_layout
+
+\end_inset
+
-foo.c: In function `main':
-\newline
-foo.c:3: `bar' undeclared (first use in this function)
-\newline
-foo.c:3: (Each undeclared identifier is reported only once
-\newline
-foo.c:3: for each function it appears in.)
-\newline
-foo.c:3: parse error before `x'
\end_layout
\begin_layout Standard
-
In order to parse this, the gcc error handler has to look ahead and return
any and all lines that do not match the expected pattern.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<Function Bodies>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
def gcc_try(line):
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"""See if line is a gcc error.
Read ahead to handle all the lines.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
Returns 1 on success, 0 otherwise.
Outputs on stdout."""
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 0
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
<<Handle the gcc error message>>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
return retval
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
@ %def gcc_try
\end_layout
-\begin_layout Standard
+\end_inset
+
+
+\end_layout
+\begin_layout Standard
The error message starts with a gcc header (as above) without an associated
line number.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<Handle the gcc error message>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
first_space = string.find(line, ' ')
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if first_space > 1: # The smallest would be "X: "
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if line[first_space - 1] == ':':
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
header_to_see = line[:first_space - 1]
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
next_line = getline()
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if next_line and next_line[:first_space - 1] == header_to_see:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
num_end = first_space
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
while next_line[num_end] in string.digits: num_end = num_end + 1
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if num_end > first_space: # good!
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
<<Accumulate gcc error lines and print it>>
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
else: # oops! Not a gcc error.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
pushline(next_line)
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
elif next_line:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
pushline(next_line) # return this line to input stream
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
@
\end_layout
-\begin_layout Standard
+\end_inset
+
+\end_layout
+
+\begin_layout Standard
At the point in the code that we know that we are in the middle of an error
message, we do the following:
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<Accumulate gcc error lines and print it>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
num_str = next_line[first_space:num_end]
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
msgs = [line[first_space:]]
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
msgs.append(next_line[num_end + 1:])
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
header_to_see = next_line[:num_end]
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
next_line = getline()
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
while next_line and next_line[:num_end] == header_to_see:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
msgs.append(next_line[num_end + 1:])
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
next_line = getline()
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if next_line: pushline(next_line)
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
write_error(msgs, "gcc", int(num_str))
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 1
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
@
\end_layout
-\begin_layout Subsection
+\end_inset
+
+
+\end_layout
+\begin_layout Subsection
xlc errors
\end_layout
\begin_layout Standard
-
A xlc error message is easy to identify.
Every error message starts with a quoted string with no spaces, a comma,
a space, the word
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
<<Function Bodies>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
def xlc_try(line):
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
"""see if line is an xlc error.
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
-\newline
Returns 1 on success, 0 otherwise.
Outputs on stdout."""
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 0
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if line[0] == '"': # This is the first character of all xlc errors
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
next_quote = string.find(line, '"', 1)
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
first_space = string.find(line, ' ')
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if (next_quote != -1) and (first_space > next_quote): # no space inisde
quotes
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if line[first_space - 1:first_space + 6] == ", line ":
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
num_start = num_end = first_space + 6
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
while line[num_end] in string.digits: num_end = num_end + 1
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if num_end > num_start:
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
write_error(line, "xlc", int(line[num_start : num_end]))
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
retval = 1
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
return retval
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
@ %def xlc_try
\end_layout
-\begin_layout Section
+\end_inset
+
+
+\end_layout
+\begin_layout Section
Extracting the code
\end_layout
\begin_layout Standard
-
-This project can be tangled from LyX if you set your
+This project can be tangled from \SpecialChar LyX
+ if you set your
\begin_inset Quotes eld
\end_inset
\begin_inset Quotes erd
\end_inset
- convertor to call a generic script that always extracts a scrap named
-\family default
-
+ convertor to call a generic script that always extracts a chunk named
\family typewriter
build-script
\family default
\end_layout
\begin_layout LyX-Code
-
#!/bin/sh
-\newline
-notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 sh
\end_layout
-\begin_layout Standard
+\begin_layout LyX-Code
+notangle -Rbuild-script $1 | env NOWEB_SOURCE=$1 NOWEB_OUTPUT_DIR=$2 sh
+\end_layout
+\begin_layout Standard
This section defines our build-script, which extracts the code.
\end_layout
-\begin_layout Scrap
+\begin_layout Standard
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
<<build-script>>=
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
#!/bin/sh
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
if [ -z "$NOWEB_SOURCE" ]; then NOWEB_SOURCE=listerrors.nw; fi
-\newline
-notangle -Rlisterrors ${NOWEB_SOURCE} > listerrors
-\newline
-chmod +x listerrors
-\newline
+\end_layout
+
+\begin_layout Plain Layout
+
+if [ -z "$NOWEB_OUTPUT_DIR" ]; then NOWEB_OUTPUT_DIR=.; fi
+\end_layout
+
+\begin_layout Plain Layout
+
+notangle -Rlisterrors ${NOWEB_SOURCE} > ${NOWEB_OUTPUT_DIR}/listerrors
+\end_layout
+
+\begin_layout Plain Layout
+
+chmod +x ${NOWEB_OUTPUT_DIR}/listerrors
+\end_layout
+
+\begin_layout Plain Layout
+
@
\end_layout
-\begin_layout Section
+\end_inset
+
+
+\end_layout
+\begin_layout Section
Indices
\end_layout
\begin_layout Standard
-
This section provides cross-references into the rest of the program.
\end_layout
\begin_layout Subsection
-
Macros
\end_layout
\begin_layout Standard
-
-
\begin_inset ERT
status collapsed
-\begin_layout Standard
+\begin_layout Plain Layout
+
\backslash
nowebchunks
\end_layout
\begin_layout Subsection
-
Identifiers
\end_layout
\begin_layout Standard
-
-
\begin_inset ERT
status collapsed
-\begin_layout Standard
+\begin_layout Plain Layout
+
\backslash
nowebindex