home *** CD-ROM | disk | FTP | other *** search
Wrap
Text File | 1993-04-10 | 130.9 KB | 3,471 lines
Newsgroups: comp.sources.unix From: ross@spam.adelaide.edu.au (Ross Williams) Subject: v26i124: funnelweb - a tool for literate programming in C, Part04/20 Sender: unix-sources-moderator@vix.com Approved: paul@vix.com Submitted-By: ross@spam.adelaide.edu.au (Ross Williams) Posting-Number: Volume 26, Issue 124 Archive-Name: funnelweb/part04 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 4 (of 20)." # Contents: answers/sc07.lis answers/sc23.lis hackman/h_manual.idx # hackman/h_manual.sin hackman/h_manual.tex scripts/master.fws # sources/help.h sources/list.c sources/table.h sources/writfile.c # userman/u_ch0.tex userman/u_cha.tex userman/u_manual.tex # Wrapped by vixie@gw.home.vix.com on Sun Apr 11 11:00:13 1993 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'answers/sc07.lis' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'answers/sc07.lis'\" else echo shar: Extracting \"'answers/sc07.lis'\" \(10474 characters\) sed "s/^X//" >'answers/sc07.lis' <<'END_OF_FILE' XFUNNELWEB LISTING FILE X====================== X Dump of mapped file "<<Suppressed>>". X MEMORY DUMP OF MAPPED FILE X========================== X X+-------------------------------------------------+------------------+ X| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 0123456789ABCDEF | X+-------------------------------------------------+------------------+ X| 53 43 30 37 3A 20 50 72 6F 63 65 73 73 69 6E 67 | SC07: Processing | X| 20 6F 66 20 6C 6F 6E 67 20 6C 69 6E 65 73 2E 0A | of long lines.. | X| 0A 53 43 30 37 2E 31 3A 20 44 65 74 65 63 74 69 | .SC07.1: Detecti | X| 6F 6E 20 6F 66 20 61 20 6C 69 6E 65 20 6C 6F 6E | on of a line lon | X| 67 65 72 20 74 68 61 6E 20 74 68 65 20 64 65 66 | ger than the def | X| 61 75 6C 74 20 6C 69 6D 69 74 2E 0A 0A 54 68 65 | ault limit...The | X| 20 64 65 66 61 75 6C 74 20 6C 69 6D 69 74 20 69 | default limit i | X| 73 20 38 30 20 63 68 61 72 61 63 74 65 72 73 20 | s 80 characters | X| 73 6F 20 77 65 20 77 69 6C 6C 20 74 65 73 74 20 | so we will test | X| 6F 6E 20 65 69 74 68 65 72 20 73 69 64 65 20 6F | on either side o | X| 66 0A 74 68 61 74 3A 0A 20 20 20 20 20 20 20 20 | f.that:. | X| 20 31 20 20 20 20 20 20 20 20 20 32 20 20 20 20 | 1 2 | X| 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 34 | 3 4 | X| 20 20 20 20 20 20 20 20 20 35 20 20 20 20 20 20 | 5 | X| 20 20 20 36 20 20 20 20 20 20 20 20 20 37 20 20 | 6 7 | X| 20 20 20 20 20 20 20 38 0A 31 32 33 34 35 36 37 | 8.1234567 | X| 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 | 8901234567890123 | X| 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 | 4567890123456789 | X| 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 | 0123456789012345 | X| 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 | 6789012345678901 | X| 32 33 34 35 36 37 38 39 30 0A 54 68 65 20 61 62 | 234567890.The ab | X| 6F 76 65 20 73 68 6F 75 6C 64 20 6E 6F 74 20 74 | ove should not t | X| 72 69 67 67 65 72 20 61 20 22 6C 69 6E 65 20 74 | rigger a "line t | X| 6F 6F 20 6C 6F 6E 67 20 65 72 72 6F 72 22 2E 20 | oo long error". | X| 42 75 74 20 74 68 69 73 20 6C 69 6E 65 20 73 68 | But this line sh | X| 6F 75 6C 64 21 2D 2D 2D 2D 2D 2D 0A 0A 53 43 30 | ould!------..SC0 | X| 37 2E 33 3A 20 54 65 73 74 20 74 68 65 20 6C 69 | 7.3: Test the li | X| 6D 69 74 20 73 65 74 20 61 74 20 69 6E 66 69 6E | mit set at infin | X| 69 74 79 2E 0A 0A 40 70 20 6D 61 78 69 6D 75 6D | ity...@p maximum | X| 5F 69 6E 70 75 74 5F 6C 69 6E 65 5F 6C 65 6E 67 | _input_line_leng | X| 74 68 20 3D 20 69 6E 66 69 6E 69 74 79 0A 0A 20 | th = infinity.. | X| 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 | 1 | X| 20 20 32 20 20 20 20 20 20 20 20 20 33 20 20 20 | 2 3 | X| 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 | 4 | X| 35 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 | 5 6 | X| 20 20 20 20 37 20 20 20 20 20 20 20 20 20 38 0A | 7 8. | X| 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 | 1234567890123456 | X| 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 | 7890123456789012 | X| 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 | 3456789012345678 | X| 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 | 9012345678901234 | X| 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 | 5678901234567890 | X| 0A 54 68 65 20 61 62 6F 76 65 20 73 68 6F 75 6C | .The above shoul | X| 64 20 6E 6F 74 20 74 72 69 67 67 65 72 20 61 20 | d not trigger a | X| 22 6C 69 6E 65 20 74 6F 6F 20 6C 6F 6E 67 20 65 | "line too long e | X| 72 72 6F 72 22 2E 20 4E 6F 72 20 73 68 6F 75 6C | rror". Nor shoul | X| 64 20 74 68 69 73 20 6F 6E 65 21 2D 2D 2D 2D 2D | d this one!----- | X| 2D 2D 0A 0A 53 43 30 37 2E 33 3A 20 54 65 73 74 | --..SC07.3: Test | X| 20 74 68 65 20 6C 69 6D 69 74 20 73 65 74 20 6C | the limit set l | X| 6F 77 65 72 2E 0A 0A 40 70 20 6D 61 78 69 6D 75 | ower...@p maximu | X| 6D 5F 69 6E 70 75 74 5F 6C 69 6E 65 5F 6C 65 6E | m_input_line_len | X| 67 74 68 20 3D 20 35 30 0A 0A 20 20 20 20 20 20 | gth = 50.. | X| 20 20 20 31 20 20 20 20 20 20 20 20 20 32 20 20 | 1 2 | X| 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 | 3 | X| 20 34 20 20 20 20 20 20 20 20 20 35 0A 31 32 33 | 4 5.123 | X| 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 | 4567890123456789 | X| 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 | 0123456789012345 | X| 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 0A | 678901234567890. | X| 4E 6F 20 65 72 72 6F 72 20 66 6F 72 20 74 68 65 | No error for the | X| 20 61 62 6F 76 65 20 62 75 74 20 74 68 69 73 20 | above but this | X| 6C 69 6E 65 20 77 69 6C 6C 21 2D 2D 2D 2D 2D 2D | line will!------ | X| 2D 2D 2D 0A | ---. | X+-------------------------------------------------+------------------+ X X X=========================== Start of LINE LIST DUMP ============================ X Globl Local| Text X-----------+-------------------------------------------------------------------- X00001 00001| SC07: Processing of long lines.<010> X00002 00002| <010> X00003 00003| SC07.1: Detection of a line longer than the default limit.<010> X00004 00004| <010> X00005 00005| The default limit is 80 characters so we will test on either side of<010> X00006 00006| that:<010> X00007 00007| 1 2 3 4 5 6 7 8<010> X00008 00008| 12345678901234567890123456789012345678901234567890123456789012345678901234567890<010> X00009 00009| The above should not trigger a "line too long error". But this line should!------<010> X00010 00010| <010> X00011 00011| SC07.3: Test the limit set at infinity.<010> X00012 00012| <010> X00013 00013| @p maximum_input_line_length = infinity<010> X00014 00014| <010> X00015 00015| 1 2 3 4 5 6 7 8<010> X00016 00016| 12345678901234567890123456789012345678901234567890123456789012345678901234567890<010> X00017 00017| The above should not trigger a "line too long error". Nor should this one!-------<010> X00018 00018| <010> X00019 00019| SC07.3: Test the limit set lower.<010> X00020 00020| <010> X00021 00021| @p maximum_input_line_length = 50<010> X00022 00022| <010> X00023 00023| 1 2 3 4 5<010> X00024 00024| 12345678901234567890123456789012345678901234567890<010> X00025 00025| No error for the above but this line will!---------<010> X00026 00026| <End-Of-File><010> X-----------+-------------------------------------------------------------------- Globl Local| Text X X============================ End of LINE LIST DUMP ============================= X X X=========================== Start of TOKEN LIST DUMP =========================== X Summary: There are 4 tokens in the token list. X Line[Column]: Token Description X------------------------------- X X0001[01]: Text. Text scrap[Grey]="SC07: Processing of long lines.<010> X<010> SC07.1: Detection of a line longer than the default limit.<010> X<010> The default limit is 80 characters so we will test on either side of<010> that:<010> X 1 2 3 4 5 6 7 8<010> X12345678901234567890123456789012345678901234567890123456789012345678901234567890<010> The above should not trigger a "line too long error". But this line should!------<010> X<010> SC07.3: Test the limit set at infinity.<010> X<010> X" X0014[01]: Text. Text scrap[Grey]="<010> X 1 2 3 4 5 6 7 8<010> X12345678901234567890123456789012345678901234567890123456789012345678901234567890<010> The above should not trigger a "line too long error". Nor should this one!-------<010> X<010> SC07.3: Test the limit set lower.<010> X<010> X" X0022[01]: Text. Text scrap[Grey]="<010> X 1 2 3 4 5<010> X12345678901234567890123456789012345678901234567890<010> No error for the above but this line will!---------<010> X" X0026[01]: End Of File. X============================ End of TOKEN LIST DUMP ============================ X Macro table dump skipped (Parser was not invoked). Document list dump skipped (Parser was not invoked). X Global Local| Input File X------------+------------------------------------------------------------------- X 1 1| SC07: Processing of long lines. X 2 2| X 3 3| SC07.1: Detection of a line longer than the default limit. X 4 4| X 5 5| The default limit is 80 characters so we will test on either side of X 6 6| that: X 7 7| 1 2 3 4 5 6 7 8 X 8 8| 12345678901234567890123456789012345678901234567890123456789012345678901234567890 X 9 9| The above should not trigger a "line too long error". But this line should!------ X Error|.................................................................................^Input line is too long (this character is the first offender). X |.................................................................................^Currently, the maximum allowable input line length is 80. X |.................................................................................^Note: You can change this using a pragma directive (@p). X 10 10| X 11 11| SC07.3: Test the limit set at infinity. X 12 12| X 13 13| @p maximum_input_line_length = infinity X 14 14| X 15 15| 1 2 3 4 5 6 7 8 X 16 16| 12345678901234567890123456789012345678901234567890123456789012345678901234567890 X 17 17| The above should not trigger a "line too long error". Nor should this one!------- X 18 18| X 19 19| SC07.3: Test the limit set lower. X 20 20| X 21 21| @p maximum_input_line_length = 50 X 22 22| X 23 23| 1 2 3 4 5 X 24 24| 12345678901234567890123456789012345678901234567890 X 25 25| No error for the above but this line will!--------- X Error|...................................................^Input line is too long (this character is the first offender). X |...................................................^Currently, the maximum allowable input line length is 50. X |...................................................^Note: You can change this using a pragma directive (@p). X | <End-Of-File> X------------+------------------------------------------------------------------- X There were 2 Errors. END_OF_FILE if test 10474 -ne `wc -c <'answers/sc07.lis'`; then echo shar: \"'answers/sc07.lis'\" unpacked with wrong size! fi # end of 'answers/sc07.lis' fi if test -f 'answers/sc23.lis' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'answers/sc23.lis'\" else echo shar: Extracting \"'answers/sc23.lis'\" \(9060 characters\) sed "s/^X//" >'answers/sc23.lis' <<'END_OF_FILE' XFUNNELWEB LISTING FILE X====================== X Dump of mapped file "<<Suppressed>>". X MEMORY DUMP OF MAPPED FILE X========================== X X+-------------------------------------------------+------------------+ X| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 0123456789ABCDEF | X+-------------------------------------------------+------------------+ X| 53 43 32 33 3A 20 54 65 73 74 20 73 79 6E 74 61 | SC23: Test synta | X| 78 20 63 68 65 63 6B 69 6E 67 20 6F 66 20 6F 75 | x checking of ou | X| 74 70 75 74 20 6C 69 6E 65 20 6C 65 6E 67 74 68 | tput line length | X| 20 70 72 61 67 6D 61 2E 0A 0A 31 2E 20 54 65 73 | pragma...1. Tes | X| 74 20 6E 6F 74 20 74 68 72 65 65 20 61 72 67 75 | t not three argu | X| 6D 65 6E 74 73 2E 0A 40 70 20 6D 61 78 69 6D 75 | ments..@p maximu | X| 6D 5F 6F 75 74 70 75 74 5F 6C 69 6E 65 5F 6C 65 | m_output_line_le | X| 6E 67 74 68 0A 40 70 20 6D 61 78 69 6D 75 6D 5F | ngth.@p maximum_ | X| 6F 75 74 70 75 74 5F 6C 69 6E 65 5F 6C 65 6E 67 | output_line_leng | X| 74 68 20 3D 0A 40 70 20 6D 61 78 69 6D 75 6D 5F | th =.@p maximum_ | X| 6F 75 74 70 75 74 5F 6C 69 6E 65 5F 6C 65 6E 67 | output_line_leng | X| 74 68 20 3D 20 78 78 78 20 79 79 79 0A 0A 32 2E | th = xxx yyy..2. | X| 20 54 65 73 74 20 73 65 63 6F 6E 64 20 61 72 67 | Test second arg | X| 75 6D 65 6E 74 20 6E 6F 74 20 22 3D 22 2E 0A 40 | ument not "="..@ | X| 70 20 6D 61 78 69 6D 75 6D 5F 6F 75 74 70 75 74 | p maximum_output | X| 5F 6C 69 6E 65 5F 6C 65 6E 67 74 68 20 78 20 73 | _line_length x s | X| 6C 6F 74 68 0A 0A 33 2E 20 54 65 73 74 20 76 61 | loth..3. Test va | X| 6C 75 65 20 6F 66 20 69 6E 66 69 6E 69 74 79 2E | lue of infinity. | X| 0A 40 70 20 6D 61 78 69 6D 75 6D 5F 6F 75 74 70 | .@p maximum_outp | X| 75 74 5F 6C 69 6E 65 5F 6C 65 6E 67 74 68 20 3D | ut_line_length = | X| 20 69 6E 66 69 6E 69 74 79 0A 0A 34 2E 20 54 65 | infinity..4. Te | X| 73 74 20 6E 6F 6E 2D 64 65 63 69 6D 61 6C 20 64 | st non-decimal d | X| 69 67 69 74 20 69 6E 20 6E 75 6D 62 65 72 2E 0A | igit in number.. | X| 40 70 20 6D 61 78 69 6D 75 6D 5F 6F 75 74 70 75 | @p maximum_outpu | X| 74 5F 6C 69 6E 65 5F 6C 65 6E 67 74 68 20 3D 20 | t_line_length = | X| 32 65 66 0A 0A 35 2E 20 54 65 73 74 20 6E 75 6D | 2ef..5. Test num | X| 62 65 72 20 69 73 20 6D 6F 72 65 20 74 68 61 6E | ber is more than | X| 20 65 69 67 68 74 20 64 69 67 69 74 73 20 6C 6F | eight digits lo | X| 6E 67 2E 0A 40 70 20 6D 61 78 69 6D 75 6D 5F 6F | ng..@p maximum_o | X| 75 74 70 75 74 5F 6C 69 6E 65 5F 6C 65 6E 67 74 | utput_line_lengt | X| 68 20 3D 20 31 32 33 34 35 36 37 38 39 0A 0A 36 | h = 123456789..6 | X| 2E 20 54 65 73 74 20 6E 75 6D 62 65 72 20 69 73 | . Test number is | X| 20 65 78 61 63 74 6C 79 20 65 69 67 68 74 20 64 | exactly eight d | X| 69 67 69 74 73 20 6C 6F 6E 67 2E 0A 37 2E 20 54 | igits long..7. T | X| 65 73 74 20 70 72 61 67 6D 61 20 6F 70 70 6F 73 | est pragma oppos | X| 69 6E 67 20 65 61 72 6C 69 65 72 20 70 72 61 67 | ing earlier prag | X| 6D 61 2E 0A 40 70 20 6D 61 78 69 6D 75 6D 5F 6F | ma..@p maximum_o | X| 75 74 70 75 74 5F 6C 69 6E 65 5F 6C 65 6E 67 74 | utput_line_lengt | X| 68 20 3D 20 31 32 33 34 35 36 37 38 0A 0A 38 2E | h = 12345678..8. | X| 20 54 65 73 74 20 70 72 61 67 6D 61 20 6E 6F 74 | Test pragma not | X| 20 6F 70 70 6F 73 69 6E 67 20 65 61 72 6C 69 65 | opposing earlie | X| 72 20 70 72 61 67 6D 61 2E 0A 40 70 20 6D 61 78 | r pragma..@p max | X| 69 6D 75 6D 5F 6F 75 74 70 75 74 5F 6C 69 6E 65 | imum_output_line | X| 5F 6C 65 6E 67 74 68 20 3D 20 69 6E 66 69 6E 69 | _length = infini | X| 74 79 0A 0A | ty.. | X+-------------------------------------------------+------------------+ X X X=========================== Start of LINE LIST DUMP ============================ X Globl Local| Text X-----------+-------------------------------------------------------------------- X00001 00001| SC23: Test syntax checking of output line length pragma.<010> X00002 00002| <010> X00003 00003| 1. Test not three arguments.<010> X00004 00004| @p maximum_output_line_length<010> X00005 00005| @p maximum_output_line_length =<010> X00006 00006| @p maximum_output_line_length = xxx yyy<010> X00007 00007| <010> X00008 00008| 2. Test second argument not "=".<010> X00009 00009| @p maximum_output_line_length x sloth<010> X00010 00010| <010> X00011 00011| 3. Test value of infinity.<010> X00012 00012| @p maximum_output_line_length = infinity<010> X00013 00013| <010> X00014 00014| 4. Test non-decimal digit in number.<010> X00015 00015| @p maximum_output_line_length = 2ef<010> X00016 00016| <010> X00017 00017| 5. Test number is more than eight digits long.<010> X00018 00018| @p maximum_output_line_length = 123456789<010> X00019 00019| <010> X00020 00020| 6. Test number is exactly eight digits long.<010> X00021 00021| 7. Test pragma opposing earlier pragma.<010> X00022 00022| @p maximum_output_line_length = 12345678<010> X00023 00023| <010> X00024 00024| 8. Test pragma not opposing earlier pragma.<010> X00025 00025| @p maximum_output_line_length = infinity<010> X00026 00026| <010> X00027 00027| <End-Of-File><010> X-----------+-------------------------------------------------------------------- Globl Local| Text X X============================ End of LINE LIST DUMP ============================= X X X=========================== Start of TOKEN LIST DUMP =========================== X Summary: There are 9 tokens in the token list. X Line[Column]: Token Description X------------------------------- X X0001[01]: Text. Text scrap[Grey]="SC23: Test syntax checking of output line length pragma.<010> X<010> X1. Test not three arguments.<010> X" X0007[01]: Text. Text scrap[Grey]="<010> X2. Test second argument not "=".<010> X" X0010[01]: Text. Text scrap[Grey]="<010> X3. Test value of infinity.<010> X" X0013[01]: Text. Text scrap[Grey]="<010> X4. Test non-decimal digit in number.<010> X" X0016[01]: Text. Text scrap[Grey]="<010> X5. Test number is more than eight digits long.<010> X" X0019[01]: Text. Text scrap[Grey]="<010> X6. Test number is exactly eight digits long.<010> X7. Test pragma opposing earlier pragma.<010> X" X0023[01]: Text. Text scrap[Grey]="<010> X8. Test pragma not opposing earlier pragma.<010> X" X0026[01]: Text. Text scrap[White]="<010> X" X0027[01]: End Of File. X============================ End of TOKEN LIST DUMP ============================ X Macro table dump skipped (Parser was not invoked). Document list dump skipped (Parser was not invoked). X Global Local| Input File X------------+------------------------------------------------------------------- X 1 1| SC23: Test syntax checking of output line length pragma. X 2 2| X 3 3| 1. Test not three arguments. X 4 4| @p maximum_output_line_length X Error|.^This pragma has the wrong number of arguments. X |.^The correct format is: "@p maximum_output_line_length = <num>|infinity". X |.^Pragma ignored. X 5 5| @p maximum_output_line_length = X Error|.^This pragma has the wrong number of arguments. X |.^The correct format is: "@p maximum_output_line_length = <num>|infinity". X |.^Pragma ignored. X 6 6| @p maximum_output_line_length = xxx yyy X Error|.^This pragma has the wrong number of arguments. X |.^The correct format is: "@p maximum_output_line_length = <num>|infinity". X |.^Pragma ignored. X 7 7| X 8 8| 2. Test second argument not "=". X 9 9| @p maximum_output_line_length x sloth X |.^The correct format is: "@p maximum_output_line_length = <num>|infinity". X |.^Pragma ignored. X Error|...............................^Expecting "=". X 10 10| X 11 11| 3. Test value of infinity. X 12 12| @p maximum_output_line_length = infinity X |.^This pragma is opposed by the pragma at line 22. X 13 13| X 14 14| 4. Test non-decimal digit in number. X 15 15| @p maximum_output_line_length = 2ef X Error|..................................^Illegal digit. Value must consist entirely of decimal digits. X |..................................^You can also use the value "infinity". X |..................................^Pragma ignored. X 16 16| X 17 17| 5. Test number is more than eight digits long. X 18 18| @p maximum_output_line_length = 123456789 X Error|.................................^Too many digits. The maximum is eight. X |.................................^Pragma ignored. X 19 19| X 20 20| 6. Test number is exactly eight digits long. X 21 21| 7. Test pragma opposing earlier pragma. X 22 22| @p maximum_output_line_length = 12345678 X Error|.^This pragma opposes the pragma at line 12. X |.^You can have as many output line length pragmas X |.^as you like, but they all have to be the same! X |.^Pragma ignored. X 23 23| X 24 24| 8. Test pragma not opposing earlier pragma. X 25 25| @p maximum_output_line_length = infinity X 26 26| X | <End-Of-File> X------------+------------------------------------------------------------------- X There were 7 Errors. END_OF_FILE if test 9060 -ne `wc -c <'answers/sc23.lis'`; then echo shar: \"'answers/sc23.lis'\" unpacked with wrong size! fi # end of 'answers/sc23.lis' fi if test -f 'hackman/h_manual.idx' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'hackman/h_manual.idx'\" else echo shar: Extracting \"'hackman/h_manual.idx'\" \(10625 characters\) sed "s/^X//" >'hackman/h_manual.idx' <<'END_OF_FILE' X\indexentry{Ross Williams}{1} X\indexentry{Williams Ross}{1} X\indexentry{copyright notice}{1} X\indexentry{notice copyright}{1} X\indexentry{preface}{5} X\indexentry{acknowledgements}{7} X\indexentry{David Hulse}{7} X\indexentry{Hulse David}{7} X\indexentry{Ada}{7} X\indexentry{Simon Hackett}{7} X\indexentry{Hackett Simon}{7} X\indexentry{Jeremy Begg}{7} X\indexentry{Begg Jeremy}{7} X\indexentry{Barry Dwyer}{7} X\indexentry{Dwyer Barry}{7} X\indexentry{Roger Brissenden}{7} X\indexentry{Brissenden Roger}{7} X\indexentry{Donald Knuth}{7} X\indexentry{Knuth Donald}{7} X\indexentry{presentation notes}{9} X\indexentry{typesetting}{9} X\indexentry{Andrew Trevorrow}{9} X\indexentry{Trevorrow Andrew}{9} X\indexentry{OzTeX}{9} X\indexentry{Knuth84}{9} X\indexentry{Lamport86}{9} X\indexentry{TeX}{9} X\indexentry{LaTeX}{9} X\indexentry{Macintosh}{9} X\indexentry{LaTeX}{9} X\indexentry{FunnelWeb design}{11} X\indexentry{design FunnelWeb}{11} X\indexentry{FunnelWeb V1}{11} X\indexentry{backwards compatibility}{11} X\indexentry{compatibility backwards}{11} X\indexentry{FunnelWeb motivation}{11} X\indexentry{motivation FunnelWeb}{11} X\indexentry{Donald Knuth}{11} X\indexentry{Knuth Donald}{11} X\indexentry{Jon Bentley}{11} X\indexentry{Bentley Jon}{11} X\indexentry{programming pearls}{11} X\indexentry{Communications of the ACM}{11} X\indexentry{Bentley86}{11} X\indexentry{Knuth83}{11} X\indexentry{Pascal}{12} X\indexentry{number output files}{12} X\indexentry{output files number}{12} X\indexentry{indentation}{12} X\indexentry{Occam's razor}{12} X\indexentry{indentation}{12} X\indexentry{indentation no}{12} X\indexentry{no indentation}{12} X\indexentry{indentation blank}{12} X\indexentry{blank indentation}{12} X\indexentry{indentation text}{12} X\indexentry{text indentation}{12} X\indexentry{indented macro call}{12} X\indexentry{no indentation}{12} X\indexentry{blank indentation}{12} X\indexentry{text indentation}{12} X\indexentry{DCL}{13} X\indexentry{indentation dangers}{13} X\indexentry{dangers indentation}{13} X\indexentry{FunnelWeb syntax}{14} X\indexentry{syntax FunnelWeb}{14} X\indexentry{==}{14} X\indexentry{macro definition syntax}{14} X\indexentry{syntax macro definition}{14} X\indexentry{parameterized macro definitions syntax}{15} X\indexentry{syntax parameterized macro definitions}{15} X\indexentry{macro call syntax}{16} X\indexentry{syntax macro call}{16} X\indexentry{parameterized macro call syntax}{16} X\indexentry{syntax parameterized macro call}{16} X\indexentry{document structure}{16} X\indexentry{structure document}{16} X\indexentry{headings}{16} X\indexentry{sections}{16} X\indexentry{miscellaneous issues}{18} X\indexentry{issues miscellaneous}{18} X\indexentry{comment duplication}{18} X\indexentry{duplication comment}{18} X\indexentry{out of date documentation}{18} X\indexentry{documentation out of date}{18} X\indexentry{regression testing}{18} X\indexentry{testing regression}{18} X\indexentry{command line interface}{18} X\indexentry{interface command line}{18} X\indexentry{Ada}{18} X\indexentry{vms vax}{18} X\indexentry{vax vms}{18} X\indexentry{.cld file}{18} X\indexentry{file .cld}{18} X\indexentry{design goals command line interface}{19} X\indexentry{command line interface design goals}{19} X\indexentry{file names}{19} X\indexentry{names file}{19} X\indexentry{filename extensions}{20} X\indexentry{extensions filename}{20} X\indexentry{filename inheritance}{20} X\indexentry{inheritance filename}{20} X\indexentry{file names}{21} X\indexentry{names file}{21} X\indexentry{portable filenames}{21} X\indexentry{filenames portable}{21} X\indexentry{invocations number}{22} X\indexentry{number invocations}{22} X\indexentry{@Z}{23} X\indexentry{@M}{23} X\indexentry{document structure macro structure}{23} X\indexentry{macro structure document structure}{23} X\indexentry{document structure}{23} X\indexentry{structure document}{23} X\indexentry{macro structure}{23} X\indexentry{structure macro}{23} X\indexentry{hierarchical structure}{23} X\indexentry{structure hierarchical}{23} X\indexentry{TeX}{23} X\indexentry{section numbering}{23} X\indexentry{numbering section}{23} X\indexentry{diagnostic messages}{25} X\indexentry{messages diagnostic}{25} X\indexentry{FunnelWeb implementation}{27} X\indexentry{implementation FunnelWeb}{27} X\indexentry{FunnelWeb history}{27} X\indexentry{history FunnelWeb}{27} X\indexentry{FunnelWeb version 1}{27} X\indexentry{FunnelWeb version 2}{27} X\indexentry{FunnelWeb version 3}{27} X\indexentry{Ada}{27} X\indexentry{USDOD83}{27} X\indexentry{Ph.D.}{27} X\indexentry{FunnelWeb past use}{27} X\indexentry{past use FunnelWeb}{27} X\indexentry{David Hulse}{27} X\indexentry{Hulse David}{27} X\indexentry{University Adelaide}{27} X\indexentry{Adelaide University}{27} X\indexentry{FunnelWeb writing itself}{28} X\indexentry{writing itself FunnelWeb}{28} X\indexentry{trouble asking for}{28} X\indexentry{asking for trouble}{28} X\indexentry{coding style}{28} X\indexentry{style coding}{28} X\indexentry{South Australian Government Department of Lands}{28} X\indexentry{portability}{28} X\indexentry{Rabinowitz90}{28} X\indexentry{Horton90}{28} X\indexentry{Kernighan88}{28} X\indexentry{ANSI}{28} X\indexentry{Rabinowitz90}{28} X\indexentry{identifier}{28} X\indexentry{identifier abbreviations}{28} X\indexentry{abbreviations identifier}{28} X\indexentry{pointers naming}{29} X\indexentry{naming pointers}{29} X\indexentry{types naming}{29} X\indexentry{naming types}{29} X\indexentry{filenames length}{29} X\indexentry{length filenames}{29} X\indexentry{MSDOS}{29} X\indexentry{use of memory}{29} X\indexentry{memory use of}{29} X\indexentry{heap memory}{29} X\indexentry{memory heap}{29} X\indexentry{Macintosh}{29} X\indexentry{malloc}{29} X\indexentry{memory package}{29} X\indexentry{package memory}{29} X\indexentry{memory leakage}{30} X\indexentry{leakage memory}{30} X\indexentry{stack memory}{30} X\indexentry{memory stack}{30} X\indexentry{stack size}{30} X\indexentry{size stack}{30} X\indexentry{memory static}{30} X\indexentry{static memory}{30} X\indexentry{static variables}{30} X\indexentry{variables static}{30} X\indexentry{Macintosh}{30} X\indexentry{ThinkC compiler}{30} X\indexentry{compiler ThinkC}{30} X\indexentry{text indentation}{30} X\indexentry{indentation text}{30} X\indexentry{FunnelWeb modification}{35} X\indexentry{modification FunnelWeb}{35} X\indexentry{GNU license}{35} X\indexentry{license GNU}{35} X\indexentry{changes dangers}{35} X\indexentry{dangers changes}{35} X\indexentry{languages dangers}{35} X\indexentry{dangers languages}{35} X\indexentry{video game}{35} X\indexentry{compiler}{35} X\indexentry{removing features}{35} X\indexentry{features removing}{35} X\indexentry{features modification}{35} X\indexentry{modification features}{35} X\indexentry{features adding}{36} X\indexentry{adding features}{36} X\indexentry{Hoare80}{36} X\indexentry{genealogy program}{36} X\indexentry{program genealogy}{36} X\indexentry{design authority}{36} X\indexentry{authority design}{36} X\indexentry{Unix}{36} X\indexentry{security authority}{36} X\indexentry{authority security}{36} X\indexentry{trademark}{36} X\indexentry{program availability}{37} X\indexentry{availability program}{37} X\indexentry{protection FunnelWeb}{37} X\indexentry{FunnelWeb protection}{37} X\indexentry{protection file extension}{37} X\indexentry{file extension protection}{37} X\indexentry{modifying manuals}{38} X\indexentry{manuals modifying}{38} X\indexentry{copyright law}{38} X\indexentry{law copyright}{38} X\indexentry{work}{38} X\indexentry{copyright}{38} X\indexentry{license}{38} X\indexentry{derived work}{38} X\indexentry{GNU license}{39} X\indexentry{license GNU}{39} X\indexentry{FunnelWeb management}{39} X\indexentry{management FunnelWeb}{39} X\indexentry{FunnelWeb official}{39} X\indexentry{official FunnelWeb}{39} X\indexentry{GNU version}{41} X\indexentry{version GNU}{41} X\indexentry{GNU breakout}{41} X\indexentry{breakout, GNU}{41} X\indexentry{FunnelWeb future}{43} X\indexentry{future FunnelWeb}{43} X\indexentry{documentation}{43} X\indexentry{official example}{43} X\indexentry{example official}{43} X\indexentry{index program}{43} X\indexentry{program index}{43} X\indexentry{command interface}{43} X\indexentry{interface command}{43} X\indexentry{antiquated features}{43} X\indexentry{features antiquated}{43} X\indexentry{shell interpreter}{43} X\indexentry{interpreter shell}{43} X\indexentry{command interpreter}{43} X\indexentry{interpreter command}{43} X\indexentry{options}{43} X\indexentry{setall command}{43} X\indexentry{command setall}{43} X\indexentry{recursion test}{43} X\indexentry{test recursion}{43} X\indexentry{diagnostic counting}{43} X\indexentry{counting diagnostic}{43} X\indexentry{make}{44} X\indexentry{signature file}{44} X\indexentry{file signature}{44} X\indexentry{language design}{44} X\indexentry{design language}{44} X\indexentry{section syntax}{44} X\indexentry{syntax section}{44} X\indexentry{pragma syntax}{44} X\indexentry{syntax pragma}{44} X\indexentry{conditionals}{44} X\indexentry{file markers}{44} X\indexentry{markers file}{44} X\indexentry{parameter list formal}{44} X\indexentry{formal parameter list}{44} X\indexentry{scanner}{44} X\indexentry{mapper}{44} X\indexentry{contiguous memory}{45} X\indexentry{memory contiguous}{45} X\indexentry{representation EOL}{45} X\indexentry{EOL representation}{45} X\indexentry{ASCII mnemonics}{45} X\indexentry{mnemonics ASCII}{45} X\indexentry{version pragma}{45} X\indexentry{pragma version}{45} X\indexentry{parser}{45} X\indexentry{analyser}{45} X\indexentry{Tarjan72}{45} X\indexentry{Robert Endre Tarjan}{45} X\indexentry{Tarjan Robert Endre}{45} X\indexentry{recursion detection}{45} X\indexentry{detection recursion}{45} X\indexentry{tangle}{45} X\indexentry{text indentation}{45} X\indexentry{indentation text}{45} X\indexentry{weave}{45} X\indexentry{table of contents}{45} X\indexentry{strength typesetting}{46} X\indexentry{typesetting strength}{46} X\indexentry{typesetter generic}{46} X\indexentry{generic typesetter}{46} X\indexentry{include file suppression}{46} X\indexentry{suppression include file}{46} X\indexentry{cross references}{46} X\indexentry{references cross}{46} X\indexentry{Ramsey89}{46} X\indexentry{spider}{46} X\indexentry{lister}{46} X\indexentry{glue factor}{46} X\indexentry{factor glue}{46} X\indexentry{diagnostics}{47} X\indexentry{speed}{47} X\indexentry{efficiency}{47} X\indexentry{correctness}{47} X\indexentry{test suite}{47} X\indexentry{suite test}{47} X\indexentry{GNU License}{49} X\indexentry{License GNU}{49} X\indexentry{references}{57} X\indexentry{ANSI}{57} X\indexentry{Bentley86}{57} X\indexentry{Hoare80}{57} X\indexentry{Horton90}{57} X\indexentry{Kernighan88}{57} X\indexentry{Knuth83}{57} X\indexentry{Knuth84}{57} X\indexentry{Lamport86}{57} X\indexentry{Rabinowitz90}{57} X\indexentry{Ramsey89}{57} X\indexentry{Tarjan72}{57} X\indexentry{USDOD83}{57} END_OF_FILE if test 10625 -ne `wc -c <'hackman/h_manual.idx'`; then echo shar: \"'hackman/h_manual.idx'\" unpacked with wrong size! fi # end of 'hackman/h_manual.idx' fi if test -f 'hackman/h_manual.sin' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'hackman/h_manual.sin'\" else echo shar: Extracting \"'hackman/h_manual.sin'\" \(10625 characters\) sed "s/^X//" >'hackman/h_manual.sin' <<'END_OF_FILE' X\indexentry{.cld file}{18} X\indexentry{==}{14} X\indexentry{@M}{23} X\indexentry{@Z}{23} X\indexentry{abbreviations identifier}{28} X\indexentry{acknowledgements}{7} X\indexentry{Ada}{18} X\indexentry{Ada}{27} X\indexentry{Ada}{7} X\indexentry{adding features}{36} X\indexentry{Adelaide University}{27} X\indexentry{analyser}{45} X\indexentry{Andrew Trevorrow}{9} X\indexentry{ANSI}{28} X\indexentry{ANSI}{57} X\indexentry{antiquated features}{43} X\indexentry{ASCII mnemonics}{45} X\indexentry{asking for trouble}{28} X\indexentry{authority design}{36} X\indexentry{authority security}{36} X\indexentry{availability program}{37} X\indexentry{backwards compatibility}{11} X\indexentry{Barry Dwyer}{7} X\indexentry{Begg Jeremy}{7} X\indexentry{Bentley Jon}{11} X\indexentry{Bentley86}{11} X\indexentry{Bentley86}{57} X\indexentry{blank indentation}{12} X\indexentry{blank indentation}{12} X\indexentry{breakout, GNU}{41} X\indexentry{Brissenden Roger}{7} X\indexentry{changes dangers}{35} X\indexentry{coding style}{28} X\indexentry{command interface}{43} X\indexentry{command interpreter}{43} X\indexentry{command line interface design goals}{19} X\indexentry{command line interface}{18} X\indexentry{command setall}{43} X\indexentry{comment duplication}{18} X\indexentry{Communications of the ACM}{11} X\indexentry{compatibility backwards}{11} X\indexentry{compiler ThinkC}{30} X\indexentry{compiler}{35} X\indexentry{conditionals}{44} X\indexentry{contiguous memory}{45} X\indexentry{copyright law}{38} X\indexentry{copyright notice}{1} X\indexentry{copyright}{38} X\indexentry{correctness}{47} X\indexentry{counting diagnostic}{43} X\indexentry{cross references}{46} X\indexentry{dangers changes}{35} X\indexentry{dangers indentation}{13} X\indexentry{dangers languages}{35} X\indexentry{David Hulse}{27} X\indexentry{David Hulse}{7} X\indexentry{DCL}{13} X\indexentry{derived work}{38} X\indexentry{design authority}{36} X\indexentry{design FunnelWeb}{11} X\indexentry{design goals command line interface}{19} X\indexentry{design language}{44} X\indexentry{detection recursion}{45} X\indexentry{diagnostic counting}{43} X\indexentry{diagnostic messages}{25} X\indexentry{diagnostics}{47} X\indexentry{document structure macro structure}{23} X\indexentry{document structure}{16} X\indexentry{document structure}{23} X\indexentry{documentation out of date}{18} X\indexentry{documentation}{43} X\indexentry{Donald Knuth}{11} X\indexentry{Donald Knuth}{7} X\indexentry{duplication comment}{18} X\indexentry{Dwyer Barry}{7} X\indexentry{efficiency}{47} X\indexentry{EOL representation}{45} X\indexentry{example official}{43} X\indexentry{extensions filename}{20} X\indexentry{factor glue}{46} X\indexentry{features adding}{36} X\indexentry{features antiquated}{43} X\indexentry{features modification}{35} X\indexentry{features removing}{35} X\indexentry{file .cld}{18} X\indexentry{file extension protection}{37} X\indexentry{file markers}{44} X\indexentry{file names}{19} X\indexentry{file names}{21} X\indexentry{file signature}{44} X\indexentry{filename extensions}{20} X\indexentry{filename inheritance}{20} X\indexentry{filenames length}{29} X\indexentry{filenames portable}{21} X\indexentry{formal parameter list}{44} X\indexentry{FunnelWeb design}{11} X\indexentry{FunnelWeb future}{43} X\indexentry{FunnelWeb history}{27} X\indexentry{FunnelWeb implementation}{27} X\indexentry{FunnelWeb management}{39} X\indexentry{FunnelWeb modification}{35} X\indexentry{FunnelWeb motivation}{11} X\indexentry{FunnelWeb official}{39} X\indexentry{FunnelWeb past use}{27} X\indexentry{FunnelWeb protection}{37} X\indexentry{FunnelWeb syntax}{14} X\indexentry{FunnelWeb V1}{11} X\indexentry{FunnelWeb version 1}{27} X\indexentry{FunnelWeb version 2}{27} X\indexentry{FunnelWeb version 3}{27} X\indexentry{FunnelWeb writing itself}{28} X\indexentry{future FunnelWeb}{43} X\indexentry{genealogy program}{36} X\indexentry{generic typesetter}{46} X\indexentry{glue factor}{46} X\indexentry{GNU breakout}{41} X\indexentry{GNU license}{35} X\indexentry{GNU license}{39} X\indexentry{GNU License}{49} X\indexentry{GNU version}{41} X\indexentry{Hackett Simon}{7} X\indexentry{headings}{16} X\indexentry{heap memory}{29} X\indexentry{hierarchical structure}{23} X\indexentry{history FunnelWeb}{27} X\indexentry{Hoare80}{36} X\indexentry{Hoare80}{57} X\indexentry{Horton90}{28} X\indexentry{Horton90}{57} X\indexentry{Hulse David}{27} X\indexentry{Hulse David}{7} X\indexentry{identifier abbreviations}{28} X\indexentry{identifier}{28} X\indexentry{implementation FunnelWeb}{27} X\indexentry{include file suppression}{46} X\indexentry{indentation blank}{12} X\indexentry{indentation dangers}{13} X\indexentry{indentation no}{12} X\indexentry{indentation text}{12} X\indexentry{indentation text}{30} X\indexentry{indentation text}{45} X\indexentry{indentation}{12} X\indexentry{indentation}{12} X\indexentry{indented macro call}{12} X\indexentry{index program}{43} X\indexentry{inheritance filename}{20} X\indexentry{interface command line}{18} X\indexentry{interface command}{43} X\indexentry{interpreter command}{43} X\indexentry{interpreter shell}{43} X\indexentry{invocations number}{22} X\indexentry{issues miscellaneous}{18} X\indexentry{Jeremy Begg}{7} X\indexentry{Jon Bentley}{11} X\indexentry{Kernighan88}{28} X\indexentry{Kernighan88}{57} X\indexentry{Knuth Donald}{11} X\indexentry{Knuth Donald}{7} X\indexentry{Knuth83}{11} X\indexentry{Knuth83}{57} X\indexentry{Knuth84}{57} X\indexentry{Knuth84}{9} X\indexentry{Lamport86}{57} X\indexentry{Lamport86}{9} X\indexentry{language design}{44} X\indexentry{languages dangers}{35} X\indexentry{LaTeX}{9} X\indexentry{LaTeX}{9} X\indexentry{law copyright}{38} X\indexentry{leakage memory}{30} X\indexentry{length filenames}{29} X\indexentry{license GNU}{35} X\indexentry{license GNU}{39} X\indexentry{License GNU}{49} X\indexentry{license}{38} X\indexentry{lister}{46} X\indexentry{Macintosh}{29} X\indexentry{Macintosh}{30} X\indexentry{Macintosh}{9} X\indexentry{macro call syntax}{16} X\indexentry{macro definition syntax}{14} X\indexentry{macro structure document structure}{23} X\indexentry{macro structure}{23} X\indexentry{make}{44} X\indexentry{malloc}{29} X\indexentry{management FunnelWeb}{39} X\indexentry{manuals modifying}{38} X\indexentry{mapper}{44} X\indexentry{markers file}{44} X\indexentry{memory contiguous}{45} X\indexentry{memory heap}{29} X\indexentry{memory leakage}{30} X\indexentry{memory package}{29} X\indexentry{memory stack}{30} X\indexentry{memory static}{30} X\indexentry{memory use of}{29} X\indexentry{messages diagnostic}{25} X\indexentry{miscellaneous issues}{18} X\indexentry{mnemonics ASCII}{45} X\indexentry{modification features}{35} X\indexentry{modification FunnelWeb}{35} X\indexentry{modifying manuals}{38} X\indexentry{motivation FunnelWeb}{11} X\indexentry{MSDOS}{29} X\indexentry{names file}{19} X\indexentry{names file}{21} X\indexentry{naming pointers}{29} X\indexentry{naming types}{29} X\indexentry{no indentation}{12} X\indexentry{no indentation}{12} X\indexentry{notice copyright}{1} X\indexentry{number invocations}{22} X\indexentry{number output files}{12} X\indexentry{numbering section}{23} X\indexentry{Occam's razor}{12} X\indexentry{official example}{43} X\indexentry{official FunnelWeb}{39} X\indexentry{options}{43} X\indexentry{out of date documentation}{18} X\indexentry{output files number}{12} X\indexentry{OzTeX}{9} X\indexentry{package memory}{29} X\indexentry{parameter list formal}{44} X\indexentry{parameterized macro call syntax}{16} X\indexentry{parameterized macro definitions syntax}{15} X\indexentry{parser}{45} X\indexentry{Pascal}{12} X\indexentry{past use FunnelWeb}{27} X\indexentry{Ph.D.}{27} X\indexentry{pointers naming}{29} X\indexentry{portability}{28} X\indexentry{portable filenames}{21} X\indexentry{pragma syntax}{44} X\indexentry{pragma version}{45} X\indexentry{preface}{5} X\indexentry{presentation notes}{9} X\indexentry{program availability}{37} X\indexentry{program genealogy}{36} X\indexentry{program index}{43} X\indexentry{programming pearls}{11} X\indexentry{protection file extension}{37} X\indexentry{protection FunnelWeb}{37} X\indexentry{Rabinowitz90}{28} X\indexentry{Rabinowitz90}{28} X\indexentry{Rabinowitz90}{57} X\indexentry{Ramsey89}{46} X\indexentry{Ramsey89}{57} X\indexentry{recursion detection}{45} X\indexentry{recursion test}{43} X\indexentry{references cross}{46} X\indexentry{references}{57} X\indexentry{regression testing}{18} X\indexentry{removing features}{35} X\indexentry{representation EOL}{45} X\indexentry{Robert Endre Tarjan}{45} X\indexentry{Roger Brissenden}{7} X\indexentry{Ross Williams}{1} X\indexentry{scanner}{44} X\indexentry{section numbering}{23} X\indexentry{section syntax}{44} X\indexentry{sections}{16} X\indexentry{security authority}{36} X\indexentry{setall command}{43} X\indexentry{shell interpreter}{43} X\indexentry{signature file}{44} X\indexentry{Simon Hackett}{7} X\indexentry{size stack}{30} X\indexentry{South Australian Government Department of Lands}{28} X\indexentry{speed}{47} X\indexentry{spider}{46} X\indexentry{stack memory}{30} X\indexentry{stack size}{30} X\indexentry{static memory}{30} X\indexentry{static variables}{30} X\indexentry{strength typesetting}{46} X\indexentry{structure document}{16} X\indexentry{structure document}{23} X\indexentry{structure hierarchical}{23} X\indexentry{structure macro}{23} X\indexentry{style coding}{28} X\indexentry{suite test}{47} X\indexentry{suppression include file}{46} X\indexentry{syntax FunnelWeb}{14} X\indexentry{syntax macro call}{16} X\indexentry{syntax macro definition}{14} X\indexentry{syntax parameterized macro call}{16} X\indexentry{syntax parameterized macro definitions}{15} X\indexentry{syntax pragma}{44} X\indexentry{syntax section}{44} X\indexentry{table of contents}{45} X\indexentry{tangle}{45} X\indexentry{Tarjan Robert Endre}{45} X\indexentry{Tarjan72}{45} X\indexentry{Tarjan72}{57} X\indexentry{test recursion}{43} X\indexentry{test suite}{47} X\indexentry{testing regression}{18} X\indexentry{text indentation}{12} X\indexentry{text indentation}{12} X\indexentry{text indentation}{30} X\indexentry{text indentation}{45} X\indexentry{TeX}{23} X\indexentry{TeX}{9} X\indexentry{ThinkC compiler}{30} X\indexentry{trademark}{36} X\indexentry{Trevorrow Andrew}{9} X\indexentry{trouble asking for}{28} X\indexentry{types naming}{29} X\indexentry{typesetter generic}{46} X\indexentry{typesetting strength}{46} X\indexentry{typesetting}{9} X\indexentry{University Adelaide}{27} X\indexentry{Unix}{36} X\indexentry{USDOD83}{27} X\indexentry{USDOD83}{57} X\indexentry{use of memory}{29} X\indexentry{variables static}{30} X\indexentry{vax vms}{18} X\indexentry{version GNU}{41} X\indexentry{version pragma}{45} X\indexentry{video game}{35} X\indexentry{vms vax}{18} X\indexentry{weave}{45} X\indexentry{Williams Ross}{1} X\indexentry{work}{38} X\indexentry{writing itself FunnelWeb}{28} END_OF_FILE if test 10625 -ne `wc -c <'hackman/h_manual.sin'`; then echo shar: \"'hackman/h_manual.sin'\" unpacked with wrong size! fi # end of 'hackman/h_manual.sin' fi if test -f 'hackman/h_manual.tex' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'hackman/h_manual.tex'\" else echo shar: Extracting \"'hackman/h_manual.tex'\" \(9447 characters\) sed "s/^X//" >'hackman/h_manual.tex' <<'END_OF_FILE' X%==============================================================================% X% FUNNELWEB USER'S MANUAL % X%==============================================================================% X% X% Summary X% ------- X% This is the main .tex file of the FunnelWeb Hacker's Manual. X% X% For a list of the other files that contribute to this document, X% see the list of files given in \input lines at the end of this file. X% X% See the TeX comments below to find out how to typeset this document. X% X% X% Copyright X% --------- X% Copyright (C) 1992 Ross N. Williams. X% X% Permission is granted to make and distribute verbatim copies of this manual X% provided that the copyright notice and this permission notice are preserved X% on all copies. X% X% X% Version X% ------- X% Date : May 1992. X% Version : 1.0. X% X% X% Author X% ------ X% Name : Ross Williams. X% Email : ross@spam.adelaide.edu.au X% Snail : 16 Lerwick Avenue, Hazelwood Park 5066, Australia. X% X% X% How to Typeset This Document X% ---------------------------- X% This document is written in a format suitable for processing by the LaTeX X% typesetting system which can be found on many machines around the world. X% The document is an entirely self contained LaTeX document. To assist in X% the electronic distribution of this document, all diagrams have been X% constructing using ASCII text from within LaTeX. This means that all you X% need to print this document is a LaTeX typesetting system. X% X% To print this document using LaTeX, give a command sequence that looks X% something like this: X% X% latex manual X% latex manual X% sort -f <manual.idx >manual.sin X% % Start here if manual.aux, manual.toc, and manual.sin already exist. X% latex manual X% print manual X% X% The commands must be given three times so as to allow the cross X% referencing information to be correctly assembled. X% The "sort" command should perform a case insensitive sort of the lines of X% its input, but should not alter the lines it is sorting. In the example X% about, the "-f" option specifies that the sort should be case insensitive. X% The "print" command should print the .dvi file generated by LaTeX. X% The details of the typesetting sequence above may vary on your computer X% system. X% X%=============================================================================% X X X% Basic Document Style X% -------------------- X% The default font size is 10pt which is what I want. X% titlepage - Instructs LaTeX to produce a title page at the front. X% book - Use the "book" built in format. X\documentstyle[titlepage]{book} X X% The following pagestyle command instructs LaTeX to set each page with just X% a page number at the middle of the bottom of each page. X\pagestyle{plain} X X% By default, the "book" style sets even and odd pages differently on the X% assumption that the result is to be used in a two-sided printing process. X% However, most people printing this will print it single sided. X% To suppress double sided mode, we need to give the \onecolumn command. X\onecolumn X X X% Page Size and Position X% ---------------------- X% The following sets the size of the text box and its position on the page. X% It works OK on A4 paper. I suppose I should test it on American paper too. X\textwidth 15cm X\textheight 24cm X\topmargin 0cm X\oddsidemargin 1.5cm X\evensidemargin 1.5cm X\headheight 0cm X\headsep 0cm X X X% Table of Contents X% ----------------- X% Specify that all headings be numbered and appear in the Table of Contents. X\setcounter{secnumdepth}{100} X\setcounter{tocdepth}{100} X X% LaTeX lets you create an unnumbered chapter, but it doesn't put it in X% the table of contents. So we have to do it manually. X\def\pseudochapter#1{% X\chapter*{#1} X\addcontentsline{toc}{chapter}{#1} X} X X% Paragraph Separation and Indentation X% ------------------------------------ X% The default LaTeX format is to have paragraphs jammed up against each other X% with indentation of text on the first line of each paragraph used to X% highlight the start of each paragraph. I prefer to identify paragraphs X% by separating them with space and eliminating the indentation. X\parskip \medskipamount X\parindent 0pt X X X% Quick Style Macros X% ------------------ X% Use of the following macros is much neater and safer than opening a group X% and setting a mode (e.g. {\bf sloth}) as these macros will cause TeX to X% scream if they span more than one paragraph whereas the group method X% can cause half the document to be set in a funny mode. X% Other little macros here serve the same neatening normalizing purposes. X\def\i#1{{\it #1}} % Italics. X\def\b#1{{\bf #1}} % Bold. X\def\p#1{{\tt #1}} % Program text. X\def\sq#1{`#1'} % Single quotes. X\def\dq#1{``#1''} % Double quotes. X\def\dqp#1{\dq{\p{#1}}} % Double quoted program text. X\def\fix#1{\footnote{$\bullet$ #1}} % Fix it up footnote. X\def\softfix#1{} % Marks opportunity for improvement. X\def\eg{e.g.~} % Spacing regulated "e.g.". X\def\ie{i.e.~} % Spacing regulated "i.e.". X\def\til{\char`\~} % For tilde ("~") character. X\def\circumflex{\char`\^} % Circumflex. X\def\bs{{\tt\char`\\}} % Backslash. X X% Point Making X% ------------ X% LaTeX provides some useful environment for listing points. However, it does X% not seem to provide what I want which is a paragraph of text led in by X% a label set in bold. X\def\thing#1{{\bf #1}} X\def\firstthing#1{\thing{#1}} X\def\narrowthing#1#2{{%From defintion of \narrower X\advance\leftskip1cm% X\advance\rightskip1cm% X{\bf #1} #2\vskip0pt}} X\def\narrowtext#1{{%From defintion of \narrower X\advance\leftskip1cm% X\advance\rightskip1cm% X#1\vskip0pt}} X\def\summary{\b{Summary:}\ } X X% Invisible Annotations X% --------------------- X% Sometimes it is convenient to be able to annotate the LaTeX code without X% causing text to appear in the document. X% Here, the \checked{} macro can be placed next to any quotation or X% fact, or other externally dependent material that has to be checked X% before publication. The \note{} macro can be used to add a note. X% Both macros are safer than "%" in a paragraph where the text may be X% continually being rearranged across lines. X\def\checked#1{} X\def\note#1{} X X X% Wide Verbatim Text X% ------------------ X% This document was originally set in 12pt and the result was that many of X% the verbatim examples wouldn't fit. To solve this, I created two macros X% to reduce and increase the size of the text, and wrapped the longer X% verbatim texts in calls to the macros. Later, the document was reset in X% 10pt eliminating the original problem, so I redefined the macros to empty. X%\def\beginsmall{\scriptsize} X%\def\endsmall{\normalsize} X\def\beginsmall{} X\def\endsmall{} X X X% The Index X% --------- X% LaTeX provides a single command (\index) for adding index entries to the X% index. We shorten it and refine it a little with a few definitions. X\def\newterm#1{{\bf #1}\x{#1}} % Special terminology. X\def\x#1{\index{#1}} % Normal index entry. X\def\xx#1#2{\index{#1 #2}\index{#2 #1}} % Symmetric index entry. X\def\xn#1#2{\xx{#1}{#2}} % For a person's name. X\def\xs#1#2{\index{#1, #2}} % For an entry with a subclause. X X X% References X% ---------- X\def\paper#1{{\bf [#1]}\x{#1}\linebreak[1]{}} X X X% Figures and Tables X% ------------------ X% LaTeX numbers figures by chapter and doesn't position captions where I X% want them and so I have decided to do it all manually. I haven't got X% time for fancy stuff so I am using manual macros. X\def\mylabel#1#2{% X\begin{quotation} X\footnotesize\baselineskip=12pt #2 X\end{quotation} X\centerline{#1} X\smallskip} X X\def\figfor#1{{\bf Figure~#1}} X\def\tabfor#1{{\bf Table~#1}} X X\def\figlicense{\figfor{1}} X%\def\figtwo{\figfor{2}} X X%\def\tabone{\tabfor{1}} X%\def\tabtwo{\tabfor{2}} X X X% Glossary X% -------- X\def\gloss#1{\thing{#1:}\x{#1}} X X X% Random Leftover Stuff X% --------------------- X\def\topicbreak{\bigskip\centerline{--- $\S$ ---}\bigskip} X X X X%------------------------------------------------------------------------------ X X% Title Page X% ---------- X% Although the title should really be in the ch0.tex file, LaTeX forces us to X% put it here. X\begin{titlepage} X\vspace*{3cm} X\begin{center} X\Huge X\vspace{2cm} XFunnelWeb Hacker's Manual\\ X\vspace{2cm} X\LARGE Ross~N.~Williams\\ X\vspace{1cm} X\Large V1.0 for FunnelWeb V3.0\\ X\vspace{1cm} May 1992\\ X\normalsize X\end{center} X\end{titlepage} X X% Note: LaTeX sometimes puts a blank page before chapters so as to X% start each chapter on an odd-numbered page. There is nothing that I X% can do about this. This is part of the cost of using LaTeX instead X% of TeX. X X\makeindex X X%------------------------------------------------------------------------------- X X\begin{document} X\sloppy X\nonstopmode X X\input h_ch0 % Table of contents etc. X\input h_ch1 % FunnelWeb Design X\input h_ch2 % FunnelWeb Implementation X\input h_ch3 % FunnelWeb Modification X\input h_ch4 % FunnelWeb Future X\input h_cha % Appendices X X\end{document} X X%==============================================================================% X% End of Main .TeX File of FunnelWeb Hacker's Manual % X%==============================================================================% END_OF_FILE if test 9447 -ne `wc -c <'hackman/h_manual.tex'`; then echo shar: \"'hackman/h_manual.tex'\" unpacked with wrong size! fi # end of 'hackman/h_manual.tex' fi if test -f 'scripts/master.fws' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'scripts/master.fws'\" else echo shar: Extracting \"'scripts/master.fws'\" \(7864 characters\) sed "s/^X//" >'scripts/master.fws' <<'END_OF_FILE' X!============================<Start of Master Script>=========================== X! X! FUNNELWEB MASTER TEST SCRIPT X! ============================ X! This is the master FunnelWeb test script. X! To test FunnelWeb: X! 1. Create the following directory tree: X! <anyname> X! scripts - A directory containing .fws scripts. X! tests - A directory containing .fw test files. X! results - An empty directory to receive results of testing. X! answers - A directory containing the correct answers. X! 2. Modify the "root test directory" section of this script as described. X! 3. Ensure that all of the directories and files are on Read/Write access. X! 4. Set default to the "scripts" directory. X! 5. Invoke FunnelWeb with the "+k" option. X! 6. Give the command "execute master.fws". X! 7. The test should last for a few minutes. X! 8. Read the test summary on the console at the end of the test. X! X! Notes on Script Mechanics X! ------------------------- X! * FunnelWeb predefines "$/" to be the character that separates X! directory specifications from file names on whatever machine it is X! running on. (e.g. Mac=":", Sun="/", Vax="]", PC="\"). X write "" write "FUNNELWEB TEST SCRIPT" write "=====================" write "This FunnelWeb shellscript applies FunnelWeb to a suite of test files." write "The result is a differences report comparing the result files of this" write "run with a predefined set of correct "answer" files." write "" write "Do not be alarmed by errors occurring during the testing as these" write "are a consequence of tests of FunnelWeb's detection of various errors." write "" write "This script cleans up files lying around before testing, so if" write "it fails for some reason, you can run it again without having." write "to worry about cleaning up after the results of the previous run." write "" write "This script takes about 10 minutes to run on a 1 MIP machine." write "Here we go!" write "" X! X! Define Symbol For The Root Test Directory X! ----------------------------------------- X! IMPORTANT: THIS DEFINITION IS ALL YOU HAVE TO CHANGE TO GET THIS X! SCRIPT WORKING ON YOUR MACHINE. X! The script substitution variable <dollar>R must point to the root X! directory <anyname> (see above). Here are some examples of definitions X! of <dollar>R on various machines onto which FunnelWeb has been ported. X X!SUN: define R "/usr2/users/ross/fwdir/" X!VMS: define R "$$USERS:[ROSS.FWDIR." X!PC : define R "\fwdir\" X!Mac: define R "fatdisk:fwdir:" X X! Place your definition here. define R "/usr2/users/ross/fwdir/" X X! Define Symbols for Test Directories X! ----------------------------------- X! S - The directory containing the .fws FunnelWeb test scripts. X! I - The directory containing the .fw input files. X! O - The directory where all the test output goes. X! A - The directory containing all the correct answers. X! D - The differences file. define S "$Rscripts$/" define I "$Rtests$/" define O "$Rresults$/" define A "$Ranswers$/" define D "$Rresults$/0testres.dif" X X! Set FunnelWeb Options Default X! ----------------------------- X! The following options remain as default for all the runs. X! The only two options turned on are +c100 and +b7. X! The sub-scripts turn on the options they need explicitly. X! -f No input file specified. X! -j No journal file. X! =i..Include files come from the input directory. X! -o No product file(s). X! -t No typeset file. X! -l No Listing file. X! -d No deletion of output files. X! +c100 No suppression of listing in listing file. X! -q Messages to screen. X! -x No default script file to execute. X! -w No limit on product file line length imposed by command line. X! -k No interactive mode. X! -b1 No dump of input file map. X! -b2 No dump of line list. X! -b3 No dump of token list. X! -b4 No dump of macro table. X! -b5 No dump of document list. X! -b6 No dump of timing results. X! +b7 DONT write anything non-deterministic. set -f -j =i$I -o -t -l -d +c100 -q -x -w -k -b123456 +b7 X X! Delete any Old Differences File X! ------------------------------- eneo $D X X! Zero the Difference Summary Counters X! ------------------------------------ X! This is necessary in case the user runs this script twice in one session. diffzero X X! Clean Test Scripts X! ------------------ X! When text files are copied from one machine to another, they can sometimes X! end up with end-of-line characters that are incorrect for the target machine. X! The following commands clean up the sub-scripts that we are about to invoke. fixeols $Stest_ld.fws fixeols $Stest_l.fws fixeols $Stest_lo.fws fixeols $Stest_lt.fws fixeols $Stest_lot.fws fixeols $Stest_lo2.fws X X! Generate Tricky Test Files X! -------------------------- X! This process is a bit messy and requires operations similar to those in the X! other sub-scripts (test_ld.fws...), and so I have placed it all in X! test_gen.fws. execute $Stest_gen.fws X X! Clean up the Include Files X! -------------------------- X! The test scripts all "purify" their file arguments by running them through X! the "fixeols" command. However, the include files aren't automated in this X! way, so we have to do them here explicitly. fixeols $Isc13a.fwi fixeols $Isc13b.fwi fixeols $Isc13c.fwi fixeols $Isc13d.fwi fixeols $Isc13e.fwi fixeols $Isc13f.fwi fixeols $Isc15a.fwi fixeols $Itg08a.fwi fixeols $Iex09a.fwi fixeols $Iex10a.fwi X X! Skip Some Tests X! --------------- X! If you are debugging some tests, you may wish to move the "here" command X! further down in the testing so as to skip to the desired tests. X! X must be defined because FunnelWeb expands command lines even while skipping X! and generates a "leading spaces" error if X is not defined to be non-blank. define X "!" skipto here X X! Test Scanner and Parser X! ----------------------- define X "execute $Stest_ld.fws" X! Special cases: X! sc01 does not exist (test of non-existence input file). X! sc09 contains control characters that we don't want FIXEOLS to frob. X$X sc01 ! X$X sc02 X$X sc03 X$X sc04 X$X sc05 X$X sc06 X$X sc07 X$X sc08 X$X sc09 ! X$X sc10 X$X sc11 X$X sc12 X$X sc13 X$X sc14 X$X sc15 X$X sc16 X$X sc17 X$X sc18 X$X sc19 X$X sc20 X$X sc21 X$X sc22 X$X sc23 X$X sc24 X$X sc25 X$X sc26 X$X sc27 X$X sc28 X$X sc29 X X$X pr01 X$X pr02 X$X pr03 X$X pr04 X$X pr05 X$X pr06 X$X pr07 X$X pr08 X$X pr09 X$X pr10 X X! Test Analyser X! ------------- define X "execute $Stest_l.fws" X$X an01 X$X an02 X$X an03 X$X an04 X X! Test Tangle X! ----------- define X "execute $Stest_lo.fws" X$X tg01 X$X tg02 X$X tg03 X$X tg04 X$X tg05 X$X tg06 X$X tg07 X$X tg08 X$X tg09 X X! Test Weave X! ---------- define X "execute $Stest_lt.fws" X$X wv01 X$X wv02 X$X wv03 X$X wv04 X$X wv05 X$X wv06 X X! Examples in User Manual Tutorial X! -------------------------------- define X "execute $Stest_lo.fws" X$X ex01 X$X ex02 define X "execute $Stest_l.fws" X$X ex03 define X "execute $Stest_lo.fws" X$X ex04 X$X ex05 X$X ex06 X$X ex07 X$X ex08 X$X ex09 X$X ex10 X define X "execute $Stest_lt.fws" X$X ex11 X$X ex12 X$X ex13 X$X ex14 X$X ex15 X define X "execute $Stest_lot.fws" X$X ex16 X X! Examples in Hints Chapter X! ------------------------- define X "execute $Stest_lo.fws" X$X hi01 X$X hi02 X$X hi03 X$X hi04 X$X hi05 define X "execute $Stest_lo2.fws" X$X hi06 X$X hi07 define X "execute $Stest_lo.fws" X$X hi08 X$X hi09 X$X hi10 X X! Final Test Summary X! ------------------ write "" write "" write "The FunnelWeb test suite script has successfully completed." write "" diffsummary write "" write "If the differences summary above gives Different=0, then FunnelWeb" write "has passed the test suite and is ready for use." write "" write "If not, you should examine the file" write " "$D"" write "to see what went wrong." write "" write "By the way, there should be 1 Severe, 277 Errors, and 12 Warnings." write "" X!=============================<End of Master Script>============================ X END_OF_FILE if test 7864 -ne `wc -c <'scripts/master.fws'`; then echo shar: \"'scripts/master.fws'\" unpacked with wrong size! fi # end of 'scripts/master.fws' fi if test -f 'sources/help.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sources/help.h'\" else echo shar: Extracting \"'sources/help.h'\" \(7957 characters\) sed "s/^X//" >'sources/help.h' <<'END_OF_FILE' X/*############################################################################## X XFUNNNELWEB COPYRIGHT X==================== XFunnelWeb is a literate-programming macro preprocessor. X Copyright (C) 1992 Ross N. Williams. X X Ross N. Williams X ross@spam.adelaide.edu.au X 16 Lerwick Avenue, Hazelwood Park 5066, Australia. X This program is free software; you can redistribute it and/or modify it under the terms of Version 2 of the GNU General Public License as published by the Free Software Foundation. X This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 of the GNU General Public License for more details. X You should have received a copy of Version 2 of the GNU General Public License along with this program. If not, you can FTP the license from prep.ai.mit.edu/pub/gnu/COPYING-2 or write to the Free Software XFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X Section 2a of the license requires that all changes to this file be recorded prominently in this file. Please record all changes here. X Programmers: X RNW Ross N. Williams ross@spam.adelaide.edu.au X Changes: X 07-May-1992 RNW Program prepared for release under GNU GPL V2. X X##############################################################################*/ X X X/******************************************************************************/ X/* HELP.H */ X/******************************************************************************/ X/* */ X/* HELP PACKAGE */ X/* ============ */ X/* As I came closer and closer to completing the release version of */ X/* FunnelWeb, I noticed that the online help was a bit of a mess. I had */ X/* random commands and command line options here and there to provide bits of */ X/* information. After a close look and some thought, I decided to centralize */ X/* all of FunnelWeb's help messages into one module, and provide a clean and */ X/* consistent interface to the help messages, both in the command line, and */ X/* in interactive mode. */ X/* */ X/* The result is that all of the help messages have been moved to */ X/* this module. Each help message has a name consisting of a string. One */ X/* particular message has the name "MENU" and is the root help message (the */ X/* "menu message"). It contains a list of all the help messages available and */ X/* their names. */ X/* */ X/* The command line connects to help by providing a single command line */ X/* option called +Hx which has the effect of displaying the help message */ X/* called x. The default is -Hmenu. The "-" means that help is not invoked by */ X/* default, but that if the user specifies +H, the menu message will be */ X/* printed. If the user specifies (say) +Hsloth, message SLOTH will be */ X/* displayed. The menu message is printed if the user invokes FunnelWeb with */ X/* no actions. The +H option is classified as an action option. */ X/* */ X/* Interactive mode connects to help through the HELP command. In the spirit */ X/* of the command line interface, if no argument is given, the menu message */ X/* is displayed. If an argument is given, the specified message is written */ X/* out. */ X/* */ X/* This module contributes two things to this process: */ X/* 1) Provides a mapping from message names to messages. */ X/* 2) Acts as a repository for the messages themselves. */ X/* */ X/******************************************************************************/ X X/* Ensure that the body of this header file is included at most once. */ X#ifndef DONE_HELP X#define DONE_HELP X X/******************************************************************************/ X X#include "style.h" X X/******************************************************************************/ X X/* Place a bound on help name length, and define an array type to hold them. */ X#define HL_NMLEN 20 typedef char hn_t[HL_NMLEN+1]; X X/******************************************************************************/ X X/* Each of the messages has a unique symbol and number. The reason for */ X/* defining these symbols instead of just using the message names in the code */ X/* is that doing it this way allows us to change the exact message names */ X/* without having to track down all their occurences in the code, or getting */ X/* nasty surprises later down the track at run time (the compiler will tell */ X/* you in a call containing HL_SLT that the symbol doesn't exist, but it */ X/* won't complain about a string argument that just happens not to be the */ X/* name of a message anymore). */ X X/* HL_ERR is the non-existent message. */ X#define HL_ERR 0 X X/* HL_MEN - Help messages. */ X/* HL_INT - Introduction to FunnelWeb. */ X/* HL_OPT - Command line options. */ X/* HL_DOP - Option defaults. */ X/* HL_COM - Interactive commands. */ X/* HL_DOC - Documentation. */ X/* HL_REG - Registration. */ X/* HL_LIC - The GNU License. */ X/* HL_COP - Copyright notice. */ X/* HL_NOW - No Warranty notice. */ X/* HL_DIS - Distribution notice. */ X/* HL_ACK - Acknowledgements. */ X/* HL_VER - Versions. */ X/* HL_SUP - Support. */ X/* HL_MOD - Modifications. */ X#define HL_MEN 1 X#define HL_INT 2 X#define HL_OPT 3 X#define HL_DOP 4 X#define HL_COM 5 X#define HL_DOC 6 X#define HL_REG 7 X#define HL_GNU 8 X#define HL_COP 9 X#define HL_NOW 10 X#define HL_DIS 11 X#define HL_ACK 12 X#define HL_VER 13 X#define HL_SUP 14 X#define HL_MOD 15 X X/* The following symbol does not represent a message. It is the number of */ X/* messages. This is useful for range checking and possibly in for loops. */ X#define HL_MAX 15 X X/******************************************************************************/ X XEXPORT uword hel_num P_((char *)); X/* Accepts a character string that is supposed to be the name of a message */ X/* and returns the number of the message, or HL_ERR if the string does not */ X/* correspond to any defined message. A match will occur if the argument */ X/* string is the same (with case independent matching) as the prefix (of */ X/* corresponding length) of exactly one message name. */ X XEXPORT void hel_wri P_((void (*)(char *),uword)); X/* Accepts a message number and writes the message using the function */ X/* provided in the first argument. Bombs the program if the message number in */ X/* the second argument is not in the range [1,HL_MAX]. */ X X/******************************************************************************/ X X/* For #ifndef preventing multiple inclusion of the body of this header file. */ X#endif X X/******************************************************************************/ X/* End of HELP.H */ X/******************************************************************************/ END_OF_FILE if test 7957 -ne `wc -c <'sources/help.h'`; then echo shar: \"'sources/help.h'\" unpacked with wrong size! fi # end of 'sources/help.h' fi if test -f 'sources/list.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sources/list.c'\" else echo shar: Extracting \"'sources/list.c'\" \(10513 characters\) sed "s/^X//" >'sources/list.c' <<'END_OF_FILE' X/*############################################################################## X XFUNNNELWEB COPYRIGHT X==================== XFunnelWeb is a literate-programming macro preprocessor. X Copyright (C) 1992 Ross N. Williams. X X Ross N. Williams X ross@spam.adelaide.edu.au X 16 Lerwick Avenue, Hazelwood Park 5066, Australia. X This program is free software; you can redistribute it and/or modify it under the terms of Version 2 of the GNU General Public License as published by the Free Software Foundation. X This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 of the GNU General Public License for more details. X You should have received a copy of Version 2 of the GNU General Public License along with this program. If not, you can FTP the license from prep.ai.mit.edu/pub/gnu/COPYING-2 or write to the Free Software XFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X Section 2a of the license requires that all changes to this file be recorded prominently in this file. Please record all changes here. X Programmers: X RNW Ross N. Williams ross@spam.adelaide.edu.au X Changes: X 07-May-1992 RNW Program prepared for release under GNU GPL V2. X X##############################################################################*/ X X X/******************************************************************************/ X/* LIST.C */ X/******************************************************************************/ X X#include "style.h" X X#include "as.h" X#include "machin.h" X#include "memory.h" X X/******************************************************************************/ X X/* In order to catch uninitialized and corrupted lists, the first and last */ X/* fields of legitimate list objects contain magic numbers. The following */ X/* #defines give the values of these numbers. The first thing that each */ X/* function of this package does is to check the two magic number fields of */ X/* the list it has just been passed, and bomb the package if the fields have */ X/* the wrong values. This technique is likely to pick uninitialized lists, */ X/* as well as lists that have been partially overwritten. */ X#define MAGIC_HEAD_VALUE (97673812L) X#define MAGIC_TAIL_VALUE (49357294L) X X/******************************************************************************/ X typedef struct node_t_ /* Structure used to compose the list proper. */ X { X struct node_t_ *p_prev; /* Points to adjacent node closer to head. */ X struct node_t_ *p_next; /* Points to adjacent node closer to tail. */ X p_void p_data; /* Points to data in heap for this element. */ X } X node_t; X typedef node_t *p_node_t; /* Pointer to node type. */ X typedef struct /* Main list object containing all the goodies. */ X { X ulong magic_head; /* Helpful in catching list object corruptions. */ X p_node_t p_head; /* Points to the head of the list (or NULL). */ X p_node_t p_tail; /* Points to the tail of the list (or NULL). */ X p_node_t p_mark; /* Points to the marked element (or NULL). */ X size_t data_bytes; /* Number of bytes in this list's data elements. */ X ulong length; /* Number of elements in this list. */ X ulong magic_tail; /* Helpful in catching list object corruptions. */ X } X ls_t; X typedef ls_t *p_ls_t; /* Main list view type. */ X typedef p_void p_lsel_t; /* Escalating pointers to data elements! */ typedef p_lsel_t *pp_lsel_t; X X/* We need the function prototypes from list.h. The #define ensures that the */ X/* abstract exported definition of a list is not visible to us here. */ X#define INLISTC X#include "list.h" X X/******************************************************************************/ X LOCAL void ls_check P_((p_ls_t)); LOCAL void ls_check(p_ls) X/* Accepts a pointer to a list and performs a series of checks to make sure */ X/* that the list has not been corrupted in some way. */ X/* This function is the sort of function that is normally turned off in */ X/* production versions. However, we are too scared to in FunnelWeb because */ X/* lists are not typesafe and are used throughout the program. */ p_ls_t p_ls; X{ X as_cold(p_ls!=NULL,"ls_check: List pointer is NULL."); X as_cold(p_ls->magic_head==MAGIC_HEAD_VALUE, X "ls_check: Magic number at head of record is incorrect."); X as_cold(p_ls->magic_tail==MAGIC_TAIL_VALUE, X "ls_check: Magic number at tail of record is incorrect."); X} X X/******************************************************************************/ X XEXPORT p_ls_t ls_cre (data_bytes) size_t data_bytes; X{ X p_ls_t p_ls; X X p_ls=(p_ls_t) mm_temp(sizeof(ls_t)); X p_ls->magic_head = MAGIC_HEAD_VALUE; X p_ls->p_head = NULL; X p_ls->p_tail = NULL; X p_ls->p_mark = NULL; X p_ls->data_bytes = data_bytes; X p_ls->length = 0; X p_ls->magic_tail = MAGIC_TAIL_VALUE; X return p_ls; X} X X/******************************************************************************/ X XEXPORT void ls_add(p_ls,p_lsel) p_ls_t p_ls; p_void p_lsel; X{ X p_node_t p_node; X X AS_HCODE(ls_check(p_ls);) X X /* Create the list node and the data node hanging off it. Copy the data in. */ X p_node =(p_node_t) mm_temp(sizeof(node_t)); X p_node->p_data=(p_void) mm_temp(p_ls->data_bytes); X memcpy(p_node->p_data,p_lsel,p_ls->data_bytes); X X /* Attach the new node to the tail of the list. */ X X p_node->p_prev=p_ls->p_tail; /* Pointers in the new node itself. */ X p_node->p_next=NULL; X X if (p_ls->p_head == NULL) /* Headside pointer pointing to new node. */ X p_ls->p_head=p_node; X else X p_ls->p_tail->p_next=p_node; X X p_ls->p_tail=p_node; /* Tailside pointer pointing to new node. */ X X /* Inc the length. */ X p_ls->length++; X} X X/******************************************************************************/ X XEXPORT void ls_lop(p_ls) p_ls_t p_ls; X{ X /* p_node_t p_targ; ONLY NEEDED IF DEALLOCATING */ X X AS_HCODE(ls_check(p_ls);) X X as_cold(p_ls->length>0,"ls_lop: List is empty."); X X /* Make a note of the node being deleted. */ X /* p_targ=p_ls->p_tail; ONLY NEEDED IF DEALLOCATED. */ X X /* If the target node was the only node, stitch up the ends of the list. */ X if (--p_ls->length==0) X { X p_ls->p_head=NULL; X p_ls->p_tail=NULL; X } X else X { /* Unhook node from tail of list. */ X p_ls->p_tail = p_ls->p_tail->p_prev; X p_ls->p_tail->p_next = NULL; X } X X /* The following two commented calls show what we WOULD have to do to */ X /* deallocate the list node. However, in FunnelWeb, all list items are */ X /* allocated under the mm package watermark system using mm_temp calls so */ X /* there is no need to free up the memory here. */ X /* DEALLOCATE(PV p_targ->p_data); */ X /* DEALLOCATE(PV p_targ); */ X} X X/******************************************************************************/ X XEXPORT ulong ls_len(p_ls) p_ls_t p_ls; X{ X AS_HCODE(ls_check(p_ls);) X return p_ls->length; X} X X/******************************************************************************/ X XEXPORT void ls_fir(p_ls) p_ls_t p_ls; X{ X ls_check(p_ls); X p_ls->p_mark=p_ls->p_head; X} X X/******************************************************************************/ X XEXPORT void ls_nxt(p_ls,pp_lsel) p_ls_t p_ls; pp_lsel_t pp_lsel; X{ X AS_HCODE(ls_check(p_ls);) X X if (p_ls->p_mark==NULL) X {*pp_lsel=NULL; return;} X *pp_lsel=p_ls->p_mark->p_data; X p_ls->p_mark=p_ls->p_mark->p_next; X} X X/******************************************************************************/ X XEXPORT void ls_loo(p_ls,index,pp_lsel) p_ls_t p_ls; ulong index; pp_lsel_t pp_lsel; X{ X p_node_t p; X ulong i; X X AS_HCODE(ls_check(p_ls);) X X p=p_ls->p_head; X as_cold(p!=NULL,"is_loo: List is empty."); X for(i=1;i<index;i++) X { X p=p->p_next; X as_cold(p!=NULL,"is_loo: Index is too high for this list."); X } X *pp_lsel=p->p_data; X} X X/******************************************************************************/ X XEXPORT void ls_tai(p_ls,pp_lsel) p_ls_t p_ls; pp_lsel_t pp_lsel; X{ X AS_HCODE(ls_check(p_ls);) X X as_cold(p_ls->p_tail!=NULL,"ls_tai: List is empty."); X *pp_lsel=p_ls->p_tail->p_data; X} X X/******************************************************************************/ X XEXPORT void ls_emp(p_ls) p_ls_t p_ls; X{ X AS_HCODE(ls_check(p_ls);) X X /* The following loop WOULD be required if we had to deallocate the list */ X /* elements explicitly. However, as all list elements are allocated using */ X /* mm_temp, it is possible to claim them later as a block. So here, we just */ X /* let the list items drift off into the sunset. */ X /* p_node_t p_curr; */ X /* p_curr=p_ls->p_head; */ X /* while (p_curr != NULL) */ X /* { */ X /* p_node_t p_targ=p_curr; */ X /* p_curr=p_curr->p_next; */ X /* my_free(PV p_targ->p_data); */ X /* my_free(PV p_targ); */ X /* } */ X X p_ls->p_head=NULL; X p_ls->p_tail=NULL; X p_ls->p_mark=NULL; X p_ls->length=0; X} X X/******************************************************************************/ X XEXPORT void ls_des(p_ls) p_ls_t p_ls; X{ X ls_check(p_ls); X X ls_emp(p_ls); X p_ls->magic_head=0; /* Zap the magic numbers in case memory is reused. */ X p_ls->magic_tail=0; X X /* The following call WOULD be required if it wasn't for the MM watermark */ X /* system of memory allocation. */ X /* my_free(PV p_ls); */ X} X X/******************************************************************************/ X XEXPORT p_void ls_mar (p_ls) p_ls_t p_ls; X{ X AS_HCODE(ls_check(p_ls);) X return PV p_ls->p_mark; X} X X/******************************************************************************/ X XEXPORT void ls_set(p_ls,p_m) p_ls_t p_ls; p_void p_m; X{ X AS_HCODE(ls_check(p_ls);) X p_ls->p_mark=(p_node_t) p_m; X} X X/******************************************************************************/ X/* End of LIST.C */ X/******************************************************************************/ END_OF_FILE if test 10513 -ne `wc -c <'sources/list.c'`; then echo shar: \"'sources/list.c'\" unpacked with wrong size! fi # end of 'sources/list.c' fi if test -f 'sources/table.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sources/table.h'\" else echo shar: Extracting \"'sources/table.h'\" \(10727 characters\) sed "s/^X//" >'sources/table.h' <<'END_OF_FILE' X/*############################################################################## X XFUNNNELWEB COPYRIGHT X==================== XFunnelWeb is a literate-programming macro preprocessor. X Copyright (C) 1992 Ross N. Williams. X X Ross N. Williams X ross@spam.adelaide.edu.au X 16 Lerwick Avenue, Hazelwood Park 5066, Australia. X This program is free software; you can redistribute it and/or modify it under the terms of Version 2 of the GNU General Public License as published by the Free Software Foundation. X This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 of the GNU General Public License for more details. X You should have received a copy of Version 2 of the GNU General Public License along with this program. If not, you can FTP the license from prep.ai.mit.edu/pub/gnu/COPYING-2 or write to the Free Software XFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X Section 2a of the license requires that all changes to this file be recorded prominently in this file. Please record all changes here. X Programmers: X RNW Ross N. Williams ross@spam.adelaide.edu.au X Changes: X 07-May-1992 RNW Program prepared for release under GNU GPL V2. X X##############################################################################*/ X X X/******************************************************************************/ X/* TABLE.H */ X/******************************************************************************/ X/* */ X/* Introduction */ X/* ------------ */ X/* This table package (table.h and table.c) implements a table abstraction. */ X/* */ X/* Facts about Tables */ X/* ------------------ */ X/* - A TABLE stores zero or more (KEY,VALUE) PAIRS. */ X/* - The user decides the types of keys and values and provides a */ X/* COMPARISON FUNCTION providing a complete ordering of the set of keys. */ X/* - The comparison function must be consistent between calls. */ X/* - Tables store pairs in key order. */ X/* - A table cannot store more than one pair with the same key. */ X/* - Pairs can be added, but not deleted. */ X/* - A table can return the value corresponding to a given key. */ X/* - The pairs in a table can be read sequentially in key order. At all */ X/* times, the table has an imaginary MARKER positioned on one of its pairs */ X/* (or after the last pair). You can move the marker to the first pair and */ X/* you can move the marker to the next pair, reading the pair as you go. */ X/* Upon table creation, a table's marker is at the end-of-table position. */ X/* - If you try to perform an illegal operation on a table, the table package */ X/* will call "error" to write out an error message and bomb the program. */ X/* - Tables store copies of (key,value) pairs. They do not hold pointers to */ X/* outside data (unless your keys or values are pointers themselves). */ X/* - If the keys are pointers themselves and point to other data which is */ X/* used by the comparison function, then that data must not be modified */ X/* in a way that will change the order of pairs in the table. */ X/* - A table can hold from zero to about 2^31 pairs. */ X/* - The identifier "tb" is used as an abbreviation for "table". */ X/* - The identifier "ky" is used as an abbreviation for "key". */ X/* - The identifier "vl" is used as an abbreviation for "value". */ X/* - The author would like to use longer names, but has chosen to use the */ X/* abbreviations so as to enhance the portability of the code. */ X/* - IMPORTANT: Tables get all their memory using mm_temp calls. */ X/* */ X/* How To Use This Table Package */ X/* ----------------------------- */ X/* 1. Include this .H file in your program file. */ X/* 2. Identify the key and value types that you are going to use. */ X/* 3. Define a function (having two parameters being pointers to keys) */ X/* that compares two keys and returns [-1,0,1] accordingly. */ X/* 4. Define a variable of type p_tb as a view to a table. */ X/* 5. Use the tb_* functions to perform the desired operations. */ X/* Start with a call to tb_cre and (optionally) end with a call to tb_des. */ X/* */ X/******************************************************************************/ X X/* Ensure that the body of this header file is included at most once. */ X#ifndef DONE_TABLE X#define DONE_TABLE X X/******************************************************************************/ X X#include <stddef.h> X#include "style.h" X X/******************************************************************************/ X X/* Hide the exported abstract definition of a table from the table.c package. */ X/* Table.c defines INTABLEC so as to prevent itself from seeing the following */ X/* definitions. It defines its own more concrete definitions. */ X#ifndef INTABLEC X X/* The functions of the table abstraction pass keys and values exclusively */ X/* using pointers. These two definitions define types for these pointers. */ X/* Although the two types are both 'p_void', the different types are useful */ X/* to indicate what is expected in each position of the parameter lists. */ typedef p_void p_tbky_t; typedef p_void p_tbvl_t; X X/* Define a type for a function to compare two keys. Such functions are */ X/* needed to organize the storage of (key,value) pairs inside the table. */ X/* Given the arguments are (a,b), the function should return: */ X/* -1 if a<b */ X/* 0 if a==b */ X/* 1 if a>b */ X/* The user must create such a function and hand it to the 'tb_create' */ X/* function when creating new a new table. */ typedef sign (*p_kycm_t) P_((p_tbky_t,p_tbky_t)); X X/* Users manipulate tables through pointers to tables. Here the actual table */ X/* internals are hidden from the user. */ typedef struct {word NEVER_USE_THIS_FIELD_UQJTKC;} tb_t; typedef tb_t *p_tb_t; X X#endif X X/******************************************************************************/ X X/* General Notes About These Functions */ X/* ----------------------------------- */ X/* - All tables, keys, and values are passed by pointer. Whether a parameter */ X/* is read or written is determined by it's functions description. */ X/* - Each function (except tb_cre) accepts a single pointer to a table and */ X/* each function's description is assumed to be referring to the table. */ X/* - "Raising an error" means calling the external function "error" to */ X/* write out a message and bomb the program. */ X/* - You must create a table using tb_cre before performing any operations */ X/* upon it. The table operations will usually raise an error if they are */ X/* handed a pointer that does not point to a properly CREated table. */ X X/* The Functions */ X/* ------------- */ XEXPORT p_tb_t tb_cre P_((size_t,size_t,p_kycm_t)); X/* CREate. This function creates a new table and returns a pointer to the */ X/* table. The user must supply 1) the size in bytes of keys, 2) the size in */ X/* bytes of values, 3) a pointer to a function that compares two keys. */ X XEXPORT bool tb_itb P_((p_tb_t,p_tbky_t)); X/* InTaBle. Returns TRUE iff the given key is in the table. */ X XEXPORT void tb_loo P_((p_tb_t,p_tbky_t,p_tbvl_t)); X/* LOOkup. Feed this function a table and a key and it will return (in the */ X/* p_tbvl_t parameter) the value corresponding to the key. The function */ X/* raises an error if the table does not contain the key. */ X XEXPORT void tb_ins P_((p_tb_t,p_tbky_t,p_tbvl_t)); X/* INSert. Inserts the (key,value) pair into the table. Raises an error if */ X/* the key is already in the table. */ X XEXPORT ulong tb_len P_((p_tb_t)); X/* LENgth. Returns the number of pairs in the table. */ X XEXPORT void tb_fir P_((p_tb_t)); X/* FIRst. Set's the table's marker to the first pair in the table (or the end */ X/* of table position if the table is empty. */ X XEXPORT bool tb_rea P_((p_tb_t,p_tbky_t,p_tbvl_t)); X/* REAd. Returns in (p_tbky_t,p_tbvl_t) the (key,value) pair corresponding to */ X/* the marker and them moves the marker onto the next pair. */ X/* Returns TRUE => Returned a pair. */ X/* Returns FALSE => Did not return a pair. No more pairs left. */ X/* of key) to be read from the table. Returns TRUE if it returns a pair */ X/* This function will not raise an error if it is called more than once with */ X/* the marker at the end of the table (it just keeps returning FALSE). */ X X#if FALSE void tb_des P_((p_tb_t)); X/* DEStroy. Destroys a table, deallocating all its memory. */ X#endif X X/******************************************************************************/ X X/* For #ifndef preventing multiple inclusion of the body of this header file. */ X#endif X X/******************************************************************************/ X/* End of TABLE.H */ X/******************************************************************************/ END_OF_FILE if test 10727 -ne `wc -c <'sources/table.h'`; then echo shar: \"'sources/table.h'\" unpacked with wrong size! fi # end of 'sources/table.h' fi if test -f 'sources/writfile.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sources/writfile.c'\" else echo shar: Extracting \"'sources/writfile.c'\" \(10102 characters\) sed "s/^X//" >'sources/writfile.c' <<'END_OF_FILE' X/*############################################################################## X XFUNNNELWEB COPYRIGHT X==================== XFunnelWeb is a literate-programming macro preprocessor. X Copyright (C) 1992 Ross N. Williams. X X Ross N. Williams X ross@spam.adelaide.edu.au X 16 Lerwick Avenue, Hazelwood Park 5066, Australia. X This program is free software; you can redistribute it and/or modify it under the terms of Version 2 of the GNU General Public License as published by the Free Software Foundation. X This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 of the GNU General Public License for more details. X You should have received a copy of Version 2 of the GNU General Public License along with this program. If not, you can FTP the license from prep.ai.mit.edu/pub/gnu/COPYING-2 or write to the Free Software XFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X Section 2a of the license requires that all changes to this file be recorded prominently in this file. Please record all changes here. X Programmers: X RNW Ross N. Williams ross@spam.adelaide.edu.au X Changes: X 07-May-1992 RNW Program prepared for release under GNU GPL V2. X X##############################################################################*/ X X X/******************************************************************************/ X/* WRITFILE.C */ X/******************************************************************************/ X/* */ X/* Implementation Notes */ X/* -------------------- */ X/* The .H file gives most of the details of what this package does. Here we */ X/* just give some notes on how it is implemented. */ X/* */ X/* MAGIC NUMBERS: These are placed at the head and tail of wf_t records so as */ X/* to assist in the detection of uninitialized or corrupted variables. */ X/* */ X/* TEXT VS BINARY: A big problem arises in choosing whether to write binary */ X/* or text files. Binary files are far faster because they allow us to write */ X/* out large slabs of text using fwrite. The only catch is that they do not */ X/* translate EOL characters in the end of line representation of the host */ X/* environment. Text files, on the other hand are slower (because we have */ X/* only fputc and fputs) but do provide the translation. The solution we */ X/* adopt is to use binary if the host environment's representation for end of */ X/* file is EOL (='\n'), but text otherwise. We can determine this by testing */ X/* the symbol UNIX_EOL defined in machin.h. If binary output is chosen, */ X/* only fwrite is called as we don't know if fwrite and fputc calls can be */ X/* mixed (it would seem not). */ X/* Note: We could test the preprocessor symbol in each function. However, */ X/* the wf_att function introduces a problem as we may be attaching to a text */ X/* file in a UNIX_EOL environment (e.g. stdout). So we make the text/binary */ X/* attribute and attribute of each file, rather than the environment which we */ X/* use only to direct us in how to create and tag (as binary or text) a file. */ X/* */ X/******************************************************************************/ X X#include "style.h" X X#include "as.h" X#include "machin.h" X#include "writfile.h" X X/******************************************************************************/ X X#define MGC_HEAD (4837295L) X#define MGC_TAIL (1213839L) X X/* Set the following to TRUE to bomb the package upon the first error. */ X/* This is a good idea during debugging if no output appears. */ X#define BOMB_ON_ERROR FALSE X X/******************************************************************************/ X LOCAL void wf_check P_((p_wf_t)); LOCAL void wf_check(p_wf) p_wf_t p_wf; X{ X as_cold(p_wf!=NULL,"wf_check: p_wf==NULL."); X X as_cold(p_wf->wf_mhead==MGC_HEAD, X "wf_check: Magic header field has non-magic value."); X X as_cold(p_wf->wf_mtail==MGC_TAIL, X "wf_check: Magic trailer field has non-magic value."); X X as_cold(p_wf->wf_isope || p_wf->wf_pfile==NULL, X "wf_check: WF is closed but wf_pfile!=NULL."); X} X X/******************************************************************************/ X LOCAL void wf_errlg P_((p_wf_t, char *)); LOCAL void wf_errlg(p_wf,mess) X/* This function is called whenever an error occurs on a stream. The main */ X/* responsibility of this function is to set the error flag in the stream. */ X/* However, it can do other stuff too such as log the error to the screen. */ p_wf_t p_wf; char *mess; X{ X p_wf->wf_iserr=TRUE; X#if BOMB_ON_ERROR X if (p_wf->wf_pfile == stdout) X fprintf(stderr,"The output file error occurred on STANDARD OUTPUT.\n"); X else X fprintf(stderr,"The output file error occurred on an ordinary file.\n"); X as_bomb(mess); X#endif X} X X/******************************************************************************/ X XEXPORT void wf_ini(p_wf,normal) p_wf_t p_wf; bool normal; X{ X p_wf->wf_mhead = MGC_HEAD; X p_wf->wf_iserr = !normal; X p_wf->wf_isope = FALSE; X p_wf->wf_istxt = FALSE; X p_wf->wf_pfile = NULL; X p_wf->wf_mtail = MGC_TAIL; X} X X/******************************************************************************/ X XEXPORT void wf_att(p_wf,wf_pfile) p_wf_t p_wf; XFILE *wf_pfile; X{ X wf_check(p_wf); X if (p_wf->wf_iserr) return; X as_cold(!p_wf->wf_isope,"wf_att: WF is already open."); X X p_wf->wf_pfile = wf_pfile; X p_wf->wf_isope = TRUE; X p_wf->wf_istxt = TRUE; /* Play it safe with files we didn't open. */ X wf_check(p_wf); X} X X/******************************************************************************/ X XEXPORT void wf_ope(p_wf,p_name) p_wf_t p_wf; char *p_name; X{ X FILE *result; X X wf_check(p_wf); X if (p_wf->wf_iserr) return; X as_cold(!p_wf->wf_isope,"wf_ope: WF is already open."); X X/* Whether we open the file as text or binary depends on whether EOL maps */ X/* to an end of line in the current environment. */ X#if UNIX_EOL X result=fopen(p_name,"wb"); p_wf->wf_istxt=FALSE; X#else X result=fopen(p_name,"w"); p_wf->wf_istxt=TRUE; X#endif X X if (result == FOPEN_F) X { X /* TRACE printf("Output file in error is \"%s\".\n",p_name); */ X wf_errlg(p_wf,"wf_ope: Error opening output file."); X } X else X {p_wf->wf_isope=TRUE; p_wf->wf_pfile=result;} X wf_check(p_wf); X} X X/******************************************************************************/ X XEXPORT void wf_chr(p_wf,ch) p_wf_t p_wf; intchar ch; X{ X wf_check(p_wf); X if ( p_wf->wf_iserr) return; X as_cold(p_wf->wf_isope,"wf_chr: WF is closed."); X X if (p_wf->wf_istxt) X { X if (fputc((int) ch,p_wf->wf_pfile) == FPUTC_F) X wf_errlg(p_wf,"wf_chr: Error fputc()ing to output file."); X } X else X { X if (fwrite(&ch,(size_t) 1,(size_t) 1,p_wf->wf_pfile) != 1) X wf_errlg(p_wf,"wf_chr: Error fwrite()ing to output file."); X } X wf_check(p_wf); X} X X/******************************************************************************/ X XEXPORT void wf_wr(p_wf,p_str) p_wf_t p_wf; char *p_str; X{ X wf_check(p_wf); X if ( p_wf->wf_iserr) return; X as_cold(p_wf->wf_isope,"wf_wr: WF is closed."); X X if (p_wf->wf_istxt) X { X if (fputs(p_str,p_wf->wf_pfile) == FPUTS_F) X wf_errlg(p_wf,"wf_wr: Error fputs()ing to output file."); X } X else X { X size_t len = strlen(p_str); X if (fwrite(p_str,(size_t) 1,(size_t) len,p_wf->wf_pfile) != len) X wf_errlg(p_wf,"wf_wr: Error fwrite()ing to output file."); X } X wf_check(p_wf); X} X X/******************************************************************************/ X XEXPORT void wf_blk(p_wf,p_blk,blk_len) p_wf_t p_wf; char *p_blk; size_t blk_len; X{ X wf_check(p_wf); X if ( p_wf->wf_iserr) return; X as_cold(p_wf->wf_isope,"wf_blk: WF is closed."); X X if (p_wf->wf_istxt) X { X /* Amazingly, fputc seems to be the only way to write out a block of */ X /* bytes with end of line translation. Shocking, but true. */ X /* See Section B1.4 (p.246-247) of Kernighan and Ritchie. */ X /* Note: We can't use fputs because that requires a terminating nul. */ X char *p; X char *p_post = p_blk+blk_len; X for (p=p_blk; p<p_post; p++) X if (fputc(*p,p_wf->wf_pfile) == FPUTC_F) X { X wf_errlg(p_wf,"wf_blk: Error fputc()ing to output file."); X break; X } X } X else X if (fwrite(p_blk,(size_t) 1,(size_t) blk_len,p_wf->wf_pfile) != blk_len) X wf_errlg(p_wf,"wf_blk: Error fwrite()ing to output file."); X wf_check(p_wf); X} X X/******************************************************************************/ X XEXPORT void wf_wl(p_wf,p_str) p_wf_t p_wf; char *p_str; X{ X wf_wr(p_wf,p_str); X wf_chr(p_wf,'\n'); X} X X/******************************************************************************/ X XEXPORT void wf_clo(p_wf) p_wf_t p_wf; X{ X wf_check(p_wf); X if ( p_wf->wf_iserr) return; X as_cold(p_wf->wf_isope,"wf_clo: WF is not open."); X if (fflush(p_wf->wf_pfile) != FFLUSH_S) X wf_errlg(p_wf,"wf_clo: Error fflush()ing output file."); X if (fclose(p_wf->wf_pfile) == FCLOSE_F) X wf_errlg(p_wf,"wf_clo: Error fclose()ing output file."); X p_wf->wf_isope=FALSE; X p_wf->wf_pfile=NULL; X wf_check(p_wf); X} X X/******************************************************************************/ X XEXPORT bool wf_err(p_wf) p_wf_t p_wf; X{ X wf_check(p_wf); X return p_wf->wf_iserr; X} X X/******************************************************************************/ X/* End of WRITFILE.C */ X/******************************************************************************/ END_OF_FILE if test 10102 -ne `wc -c <'sources/writfile.c'`; then echo shar: \"'sources/writfile.c'\" unpacked with wrong size! fi # end of 'sources/writfile.c' fi if test -f 'userman/u_ch0.tex' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'userman/u_ch0.tex'\" else echo shar: Extracting \"'userman/u_ch0.tex'\" \(7907 characters\) sed "s/^X//" >'userman/u_ch0.tex' <<'END_OF_FILE' X%==============================================================================% X% Start of Ch0.tex % X%==============================================================================% X% X% Copyright X% --------- X% Copyright (C) 1992 Ross N. Williams. X% This file contains a chapter of the FunnelWeb User's Manual. X% See the main TeX file for this manual for further information. X% X%==============================================================================% X X\vbox{\relax} X\vfill X X\hrule X X\medskip X Copyright \copyright{} 1992 Ross~N.~Williams. X\xn{Ross}{Williams}\xx{copyright}{notice} X Permission is granted to make and distribute verbatim copies of this manual provided that the copyright notice and this permission notice are preserved on all copies.\note{This paragraph was copied from the GNU Emacs manual to avoid my having to get a legal opinion on something I could cook up.} X X\medskip X X\hrule X X\newpage X X%============================================================================== X X\tableofcontents X X\newpage X X%============================================================================== X X%I am not using LaTeX's figures and tables numbering so these are commented out. X%\pseudochapter{List of Figures} X%\pseudochapter{List of Tables} X X%============================================================================== X X% No forward. X%\pseudochapter{Foreword} X%\x{foreword} X X%============================================================================== X X\pseudochapter{Preface} X\x{preface} X When, in 1986, I first read Donald Knuth's\xn{Donald}{Knuth} technical report on Web\paper{Knuth83},\x{Web} and tried Web out, I was simultaneously excited by Knuth's idea of literate programming, and disappointed by his implementation of it. I was excited because I could sense the potential for the literate style to transform the state of mind of the programmer, but was disappointed by Web's rigidity and lack of practicality, which seemed to betray this potential. The Web I used was Pascal-specific, \TeX{}-specific, and applied too many constraints to the programming process. In particular, it insisted on taking control of the program text, mangling the code in the Pascal output files, and imposing its own rather rigid ideas about indenting in the \TeX{} output. All this, combined with the complexity of the tool, led me to come to perceive Web as problem rather than solution. X Despite all this, I was well and truly hooked on the idea of literate programming. The inevitable result was that I designed and implemented my own version of Web --- FunnelWeb! X XFunnelWeb is not the most sophisticated literate programming tool available, but it is an extremely \i{practical} tool, striving for simplicity and portability in all areas. Not only is FunnelWeb language-independent, and to some extent typesetter independent, but its implementation also stresses portability, being written in~C, and currently operating on four major platforms (Sun, Vax, PC, Mac). FunnelWeb allows the programmer total control over the output file, making it suitable for use with all sorts of format-sensitive languages. It also allows control over its own source code, which has been released under a GNU license.\xx{GNU}{license} XFunnelWeb is quite solid, having to pass a regression testing suite of over 200 tests before being released. Finally, FunnelWeb is well documented by this manual which provides a tutorial, advanced hints, and a language definition. X I would like to dedicate FunnelWeb and this manual to Donald Knuth and his literate programming tool Web. Although this manual is somewhat critical of some aspects of Web, this criticism is really a product of differing design goals. Knuth designed a paradigm (literate programming) and a tool X(Web) aimed at the highest pitch of program presentation and typesetting. XFunnelWeb aims lower, relaxing constraints, and making compromises in order to achieve simplicity, flexibility, and portability. The result is a practical tool which I hope will attract more people to the literate style. X X\bigskip X X\leftline{\b{Ross~N.~Williams}} X\leftline{\b{Adelaide, Australia}} X\leftline{\b{May~1992}} X X%============================================================================== X X\pseudochapter{Acknowledgements} X\x{acknowledgements} X Many thanks to \b{David Hulse}\xn{David}{Hulse} X(\p{dave@cs.adelaide.edu.au}) for translating the original version of FunnelWeb X(FunnelWeb~V1) from Ada\x{Ada} into~C and getting it to work on Unix and a PC. The C code written by David (FunnelWeb~V2) formed the basis of FunnelWeb~V3, but was entirely rewritten during the intensive refinement and feature-injection period leading up to this release (FunnelWeb~V3 is about three times the size of FunnelWeb~V2). Nevertheless, without this important first translation step, I would probably not have found the motivation to develop FunnelWeb to its present state. X Thanks go to \b{Simon Hackett}\xn{Simon}{Hackett} X(\p{simon@internode.com.au}) of Internode Systems Pty Ltd for the use of his Sun, Mac, and PC, for assistance in porting XFunnelWeb to the Sun and PC, and for helpful discussions. X Thanks go to \b{Jeremy Begg}\xn{Jeremy}{Begg} X(\p{jeremy@vsm.com.au}) of VSM Software Services for the use of his VAX, and for assistance with the VMS-specific code. X Thanks to \b{Barry Dwyer}\xn{Barry}{Dwyer} (\p{dwyer@cs.adelaide.edu.au}) and \b{Roger Brissenden}\xn{Roger}{Brissenden} (\p{rjb@koala.harvard.edu}) for trying out FunnelWeb Version~1 in 1987 and providing valuable feedback. X Thanks to Donald Knuth\xn{Donald}{Knuth} for establishing the idea of literate programming in the first place. X X\bigskip X X\leftline{\b{Ross~N.~Williams}} X\leftline{\b{Adelaide, Australia}} X\leftline{\b{May~1992}} X X%============================================================================== X X\pseudochapter{Presentation Notes} X\x{presentation notes} X X\thing{References:} All references are set in bold and are cited in square brackets in the form X\b{[}$<$\i{firstauthor}$><$\i{year}$>$\b{]}. All references cited in the text appear in the reference list and the index. X X\thing{Special terms:} New or important terminology has been set in bold face and appears in the index. A glossary appears as an appendix. X X\thing{Typesetting:} This\x{typesetting} document was prepared by the author using Andrew Trevorrow's\xn{Andrew}{Trevorrow} (\p{akt150@cscgpo.anu.edu.au})\checked{} implementation (OzTeX\x{OzTeX}) of the X\TeX{}/\LaTeX{}\paper{Knuth84}\paper{Lamport86}\x{TeX}\x{LaTeX} typesetting system running on a Macintosh-SE.\x{Macintosh} X X\thing{Graphics:} All diagrams have been constructed out of text using the \LaTeX{} \p{verbatim} environment so as to allow this document to be disseminated electronically and printed using \LaTeX{} without access to the author's drawing tools. X X%%%%Put this paragraph back again if I insert any \fix footnotes again. X%\thing{Correction footnotes:} Footnotes\x{footnotes} X%commencing with dots ($\bullet$) are X%notes to remind the author about something in the document that must be X%attended to.\fix{This is an example of such a footnote.} These footnotes X%will be attended to and eliminated in later versions. X X\thing{Known typesetting problems:} While every attempt has been made to give a good presentation within the time available, some shortcuts have had to be taken. In particular, the author has been unable to work out how to get \LaTeX{} to suppress blank pages at the start of chapters. X X%============================================================================== X X% No abstract. X%\pseudochapter{Abstract} X%\x{abstract} X X%==============================================================================% X% End of Ch0.tex % X%==============================================================================% END_OF_FILE if test 7907 -ne `wc -c <'userman/u_ch0.tex'`; then echo shar: \"'userman/u_ch0.tex'\" unpacked with wrong size! fi # end of 'userman/u_ch0.tex' fi if test -f 'userman/u_cha.tex' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'userman/u_cha.tex'\" else echo shar: Extracting \"'userman/u_cha.tex'\" \(9342 characters\) sed "s/^X//" >'userman/u_cha.tex' <<'END_OF_FILE' X%==============================================================================% X% Start of Cha.tex % X%==============================================================================% X% X% Copyright X% --------- X% Copyright (C) 1992 Ross N. Williams. X% This file contains a chapter of the FunnelWeb User's Manual. X% See the main TeX file for this manual for further information. X% X%==============================================================================% X X\appendix X X%============================================================================== X X\chapter{Glossary} X\x{glossary} X X\gloss{Analyser} A component of the FunnelWeb program that checks the macro table created by the parser for errors. XFor example, the analyser checks to see if any macro without a \p{@Z} has not been called. X X\gloss{Argument} A string delimited by blanks appearing on the FunnelWeb command line. Arguments are used to control options. X X\gloss{Directive} A FunnelWeb special sequence or cooperating group of special sequences that do not form part of a macro definition. A directive can take the form of a pragma. X X\gloss{Documentation} Descriptive text. X X\gloss{Documentation file} An output file, produced by the Weave component of FunnelWeb, that contains typesetter commands. When fed into the appropriate typesetter program, the result is a typeset image of the input file. X X\gloss{Free text} The text in an input file that remains if one were to remove macro definitions and directives. X X\gloss{FunnelWeb} This word has a number of different meanings all pertaining to the FunnelWeb system of programming. 1) The entire system of programming as in \dq{Maybe FunnelWeb can help.} X2) The computer program that implements the system as in \dq{Run it through FunnelWeb and see what comes out.} X3) The language implemented by the FunnelWeb program as in \dq{I wrote the program in FunnelWeb.} or \dq{I wrote the program in Ada using FunnelWeb.}. X X\gloss{FunnelWeb file} A file whose contents are written in the FunnelWeb language. X X\gloss{FunnelWeb language} The language in which FunnelWeb input files are written. X X\gloss{FunnelWeb proper} Usually, when FunnelWeb is invoked, it processes a single input file and then terminates. However, it also has a command language mode in which it is possible to invoke \dq{FunnelWeb} many times. This leads to confusion between \dq{FunnelWeb} the outer program and X\dq{FunnelWeb} the inner program. To avoid this confusion, the inner XFunnelWeb is sometimes referred to as \dq{FunnelWeb proper}. X X\gloss{FW} An abbreviation for \dq{FunnelWeb} that is used wherever appropriate. X X\gloss{Include file} A file read in by FunnelWeb as the result of an include pragma (\p{@i filename}). X X\gloss{Input file} Any file read in by FunnelWeb. The phrase X\dq{the input file} refers to the root input file X(specified using the \p{+F} option). X X\gloss{Journal file} An output file containing a copy of the output sent to the user's console during an invocation of FunnelWeb. In other systems, this file is sometimes called a \dq{log file}. X X\gloss{Listing file} An output file summarizing the result of processing an input file. X X\gloss{Macro} A binding of a name to a string. X X\gloss{Macro definition} A construct appearing in a FunnelWeb file that binds a name to a text string. A FunnelWeb file consists of a series of macro definitions surrounded by documentary text. X X\gloss{Mapper} A component of the FunnelWeb program that reads in the input file and creates a copy of it in memory. X X\gloss{Option} An parameter internal to the FunnelWeb program which can be controlled by command line arguments or pragmas. X X\gloss{Output file} Any file written by FunnelWeb. This includes listing, journal, product, and documentation files. (Warning: During most of FunnelWeb's development the term \dq{output file} was also used to refer to what are now called \dq{product files}. This turned out to be extremely confusing and so the term \dq{product file} was invented to distinguish the generic from the specific. However, as this was a late modification, you may find some occurrences of the old use of \dq{output file}.). X X\gloss{Parser} A component of the FunnelWeb program that processes the token list generated by the scanner and produces a macro table and a document list. The parser mainly analyses the input file at the syntactic level, but also does some lightweight semantic checking too. X X\gloss{Pragma} Single-line directives that appears in XFunnelWeb files. Pragmas control everything from maximum input line length to typesetter dependence. A pragma line starts with \dqp{@p}. X X\gloss{Printed documentation} Sheets of paper resulting from actually typesetting and printing a documentation file. X X\gloss{Product file} An output file, generated by the Tangle component of XFunnelWeb, that contains the expansion of the macros in the input file. Note: Other names considered for this were: generated file, expanded file, result file, program file, and tangle file. X X\gloss{Scanner} A component of the FunnelWeb program that scans a copy of the input file in memory and generates a line list and a token list to be fed to the parser. The scanner processes the input at the lexical level. X X\gloss{Script} A file containing FunnelWeb shell commands. X X\gloss{Shell} A command language interpreter built into the FunnelWeb program. The interpreter allows the user to invoke FunnelWeb proper many times during a single invocation of the FunnelWeb program. X X\gloss{Special character} A distinguished character in a FunnelWeb input file that introduces a special sequence. By default the special character is \dqp{@}. However, it can be changed using the \dqp{@=} special sequence. X X\gloss{Special sequence} A special sequence is a construct introduced by the special character. Special sequences are used to define a structure in a XFunnelWeb input file that exists at a higher level to the surrounding text. A FunnelWeb input file may be considered to be a sequence of text and special sequences. X X\gloss{Tangle} This is the name for the component of FunnelWeb that generates one or more product files containing the expansion of macros in the input file. X X\gloss{Typesetting directive} A FunnelWeb directive whose sole effect is to modify the way in which the input file is represented in the documentation file. X X\gloss{Weave} This is the name for the component of FunnelWeb that generates a documentation file containing typesetting commands representing the input file. X X%============================================================================== X X\chapter{References} X\x{references} X X\paper{ANSI} Australian Standard AS~3955-1991, \dq{Programming Languages --- C}, X(ISBN: 0-7262-6970-0), 12~July~1991. Identical to: International Standard ISO/IEC 9899: X1990 Programming Languages --- C.\checked{} X X\paper{ANZE} \dq{Australia, New Zealand Encyclopedia}, XEntry: \dq{Funnel-web spiders}, Vol~7, pp.~564--565, Bay Books, Sydney, (ISBN: 85835--127--7), 1975.\checked{} X X X\paper{BSI82} British Standards Institute, \dq{Specification for Computer Programming Language Pascal}, Publication BS6192:1982, British Standards Institute, P.O. Box 372, Milton Keynes, MK146LO, X1982.\checked{} X X\paper{Gries81} Gries~D., \dq{The Science of Programming}, Springer-Verlag, (ISBN: 0-387-90641-X), 1981. X X\paper{Humphries91} Humphries~B, \dq{Neglected Poems and Other Creatures}, Angus and Robertson, Sydney, (ISBN: 0-207-17212-9), 1991.\checked{} X X\paper{Kernighan88} Kernighan~B.W., Ritchie~D.M., \dq{The~C Programming Language}, (second edition,\dq{ANSI~C}), Prentice Hall, X(ISBN: 0-13-110362-8), 1988.\checked{} X X\paper{Knuth83} Knuth~D.E., \dq{The WEB System of Structured Documentation}, (Web User Manual, Version~2.5, November, 1983), Stanford University, 1983. X X\paper{Knuth84} Knuth~D.E., \dq{The \TeX{}book}, Addison-Wesley, X(ISBN: 0-201-13448-9), 1984. X X\paper{Knuth84} Knuth~D.E., \dq{Literate Programming}, \i{The Computer Journal}, Vol.~27, No.~2, pp.~97-111, 1984.\checked{Reference copied from SIGPLAN 26(1) p.16} Note: The author of this manual has not yet obtained this paper. X X\paper{Lamport86} Lamport~L., \dq{\LaTeX{}: A Document Preparation System}, Addison-Wesley, (ISBN: 0-201-15790-X), X1986.\checked{} X X\paper{Rosovsky90} Rosovsky~H., \dq{The University: An Owner's Manual}, W.W.Norton \& Company, Inc., (ISBN: 0-393-02782-1), 1990.\checked{} X X\paper{Smith91} Smith~L.M.C., \dq{An Annotated Bibliography of Literate Programming}, ACM SIGPLAN Notices, Vol.~26, No.~1, January 1991.\checked{} X X\paper{Strunk79} Strunk~W., White~E.B., \dq{The Elements of Style}, Third Edition, MacMillan Publishing Company, New York, X(ISBN: 0-02-418200-1), X1979.\checked{} X X\paper{USDOD83} \dq{The Programming Language Ada Reference Manual}, American National Standards Institute Inc, ANSI/MIL-STD-1815A-1983, 1983.\checked{} X X%============================================================================== X X\addcontentsline{toc}{chapter}{Index} X\def\indexentry#1#2{\item #1~#2} X\begin{theindex} X\input u_manual.sin X\end{theindex} X X%==============================================================================% X% End of Cha.tex % X%==============================================================================% END_OF_FILE if test 9342 -ne `wc -c <'userman/u_cha.tex'`; then echo shar: \"'userman/u_cha.tex'\" unpacked with wrong size! fi # end of 'userman/u_cha.tex' fi if test -f 'userman/u_manual.tex' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'userman/u_manual.tex'\" else echo shar: Extracting \"'userman/u_manual.tex'\" \(9553 characters\) sed "s/^X//" >'userman/u_manual.tex' <<'END_OF_FILE' X%==============================================================================% X% FUNNELWEB USER'S MANUAL % X%==============================================================================% X% X% Summary X% ------- X% This is the main .tex file of the FunnelWeb User's Manual. X% X% For a list of the other files that contribute to this document, X% see the list of files given in \input lines at the end of this file. X% X% See the TeX comments below to find out how to typeset this document. X% X% X% Copyright X% --------- X% Copyright (C) 1992 Ross N. Williams. X% X% Permission is granted to make and distribute verbatim copies of this manual X% provided that the copyright notice and this permission notice are preserved X% on all copies. X% X% X% Version X% ------- X% Date : May 1992. X% Version : 1.0. X% X% X% Author X% ------ X% Name : Ross Williams. X% Email : ross@spam.adelaide.edu.au X% Snail : 16 Lerwick Avenue, Hazelwood Park 5066, Australia. X% X% X% How to Typeset This Document X% ---------------------------- X% This document is written in a format suitable for processing by the LaTeX X% typesetting system which can be found on many machines around the world. X% The document is an entirely self contained LaTeX document. To assist in X% the electronic distribution of this document, all diagrams have been X% constructing using ASCII text from within LaTeX. This means that all you X% need to print this document is a LaTeX typesetting system. X% X% To print this document using LaTeX, give a command sequence that looks X% something like this: X% X% latex manual X% latex manual X% sort -f <manual.idx >manual.sin X% % Start here if manual.aux, manual.toc, and manual.sin already exist. X% latex manual X% print manual X% X% The commands must be given three times so as to allow the cross X% referencing information to be correctly assembled. X% The "sort" command should perform a case insensitive sort of the lines of X% its input, but should not alter the lines it is sorting. In the example X% about, the "-f" option specifies that the sort should be case insensitive. X% The "print" command should print the .dvi file generated by LaTeX. X% The details of the typesetting sequence above may vary on your computer X% system. X% X%=============================================================================% X X X% Basic Document Style X% -------------------- X% The default font size is 10pt which is what I want. X% titlepage - Instructs LaTeX to produce a title page at the front. X% book - Use the "book" built in format. X\documentstyle[titlepage]{book} X X% The following pagestyle command instructs LaTeX to set each page with just X% a page number at the middle of the bottom of each page. X\pagestyle{plain} X X% By default, the "book" style sets even and odd pages differently on the X% assumption that the result is to be used in a two-sided printing process. X% However, most people printing this will print it single sided. X% To suppress double sided mode, we need to give the \onecolumn command. X\onecolumn X X X% Page Size and Position X% ---------------------- X% The following sets the size of the text box and its position on the page. X% It works OK on A4 paper. I suppose I should test it on American paper too. X\textwidth 15cm X\textheight 24cm X\topmargin 0cm X\oddsidemargin 1.5cm X\evensidemargin 1.5cm X\headheight 0cm X\headsep 0cm X X X% Table of Contents X% ----------------- X% Specify that all headings be numbered and appear in the Table of Contents. X\setcounter{secnumdepth}{100} X\setcounter{tocdepth}{100} X X% LaTeX lets you create an unnumbered chapter, but it doesn't put it in X% the table of contents. So we have to do it manually. X\def\pseudochapter#1{% X\chapter*{#1} X\addcontentsline{toc}{chapter}{#1} X} X X% Paragraph Separation and Indentation X% ------------------------------------ X% The default LaTeX format is to have paragraphs jammed up against each other X% with indentation of text on the first line of each paragraph used to X% highlight the start of each paragraph. I prefer to identify paragraphs X% by separating them with space and eliminating the indentation. X\parskip \medskipamount X\parindent 0pt X X X% Quick Style Macros X% ------------------ X% Use of the following macros is much neater and safer than opening a group X% and setting a mode (e.g. {\bf sloth}) as these macros will cause TeX to X% scream if they span more than one paragraph whereas the group method X% can cause half the document to be set in a funny mode. X% Other little macros here serve the same neatening normalizing purposes. X\def\i#1{{\it #1}} % Italics. X\def\b#1{{\bf #1}} % Bold. X\def\p#1{{\tt #1}} % Program text. X\def\sq#1{`#1'} % Single quotes. X\def\dq#1{``#1''} % Double quotes. X\def\dqp#1{\dq{\p{#1}}} % Double quoted program text. X\def\fix#1{\footnote{$\bullet$ #1}} % Fix it up footnote. X\def\softfix#1{} % Marks opportunity for improvement. X\def\eg{e.g.~} % Spacing regulated "e.g.". X\def\ie{i.e.~} % Spacing regulated "i.e.". X\def\til{\char`\~} % For tilde ("~") character. X\def\circumflex{\char`\^} % Circumflex. X\def\bs{{\tt\char`\\}} % Backslash. X X% Point Making X% ------------ X% LaTeX provides some useful environment for listing points. However, it does X% not seem to provide what I want which is a paragraph of text led in by X% a label set in bold. X\def\thing#1{{\bf #1}} X\def\firstthing#1{\thing{#1}} X\def\narrowthing#1#2{{%From defintion of \narrower X\advance\leftskip1cm% X\advance\rightskip1cm% X{\bf #1} #2\vskip0pt}} X\def\narrowtext#1{{%From defintion of \narrower X\advance\leftskip1cm% X\advance\rightskip1cm% X#1\vskip0pt}} X\def\summary{\b{Summary:}\ } X X% Invisible Annotations X% --------------------- X% Sometimes it is convenient to be able to annotate the LaTeX code without X% causing text to appear in the document. X% Here, the \checked{} macro can be placed next to any quotation or X% fact, or other externally dependent material that has to be checked X% before publication. The \note{} macro can be used to add a note. X% Both macros are safer than "%" in a paragraph where the text may be X% continually being rearranged across lines. X\def\checked#1{} X\def\note#1{} X X X% Wide Verbatim Text X% ------------------ X% This document was originally set in 12pt and the result was that many of X% the verbatim examples wouldn't fit. To solve this, I created two macros X% to reduce and increase the size of the text, and wrapped the longer X% verbatim texts in calls to the macros. Later, the document was reset in X% 10pt eliminating the original problem, so I redefined the macros to empty. X%\def\beginsmall{\scriptsize} X%\def\endsmall{\normalsize} X\def\beginsmall{} X\def\endsmall{} X X X% The Index X% --------- X% LaTeX provides a single command (\index) for adding index entries to the X% index. We shorten it and refine it a little with a few definitions. X\def\newterm#1{{\bf #1}\x{#1}} % Special terminology. X\def\x#1{\index{#1}} % Normal index entry. X\def\xx#1#2{\index{#1 #2}\index{#2 #1}} % Symmetric index entry. X\def\xn#1#2{\xx{#1}{#2}} % For a person's name. X\def\xs#1#2{\index{#1, #2}} % For an entry with a subclause. X X X% References X% ---------- X\def\paper#1{{\bf [#1]}\x{#1}\linebreak[1]{}} X X X% Figures and Tables X% ------------------ X% LaTeX numbers figures by chapter and doesn't position captions where I X% want them and so I have decided to do it all manually. I haven't got X% time for fancy stuff so I am using manual macros. X\def\mylabel#1#2{% X\begin{quotation} X\footnotesize\baselineskip=12pt #2 X\end{quotation} X\centerline{#1} X\smallskip} X X\def\figfor#1{{\bf Figure~#1}} X\def\tabfor#1{{\bf Table~#1}} X X\def\figarchitecture{\figfor{1}} X\def\figfunarch{\figfor{2}} X\def\figphases{\figfor{3}} X\def\figregform{\figfor{4}} X X%\def\tabone{\tabfor{1}} X%\def\tabtwo{\tabfor{2}} X X X% Glossary X% -------- X\def\gloss#1{\thing{#1:}\x{#1}} X X X% Random Leftover Stuff X% --------------------- X\def\topicbreak{\bigskip\centerline{--- $\S$ ---}\bigskip} X X X X%------------------------------------------------------------------------------ X X% Title Page X% ---------- X% Although the title should really be in the ch0.tex file, LaTeX forces us to X% put it here. X\begin{titlepage} X\vspace*{3cm} X\begin{center} X\Huge X\vspace{2cm} XFunnelWeb User's Manual\\ X\vspace{2cm} X\LARGE Ross~N.~Williams\\ X\vspace{1cm} X\Large V1.0 for FunnelWeb V3.0\\ X\vspace{1cm} May 1992\\ X\normalsize X\end{center} X\end{titlepage} X X% Note: LaTeX sometimes puts a blank page before chapters so as to X% start each chapter on an odd-numbered page. There is nothing that I X% can do about this. This is part of the cost of using LaTeX instead X% of TeX. X X\makeindex X X%------------------------------------------------------------------------------- X X\begin{document} X\sloppy X\nonstopmode X X\input u_ch0 % Table of contents etc. X\input u_ch1 % A Tutorial Introduction X\input u_ch2 % FunnelWeb Hints X\input u_ch3 % FunnelWeb Definition X\input u_ch4 % FunnelWeb Installation. X\input u_ch5 % FunnelWeb Administration. X\input u_cha % Appendices X X\end{document} X X%==============================================================================% X% End of Main .TeX File of FunnelWeb User's Manual % X%==============================================================================% END_OF_FILE if test 9553 -ne `wc -c <'userman/u_manual.tex'`; then echo shar: \"'userman/u_manual.tex'\" unpacked with wrong size! fi # end of 'userman/u_manual.tex' fi echo shar: End of archive 4 \(of 20\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 20 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0