home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 355_01 / slk1.exe / READ.ME next >
Text File  |  1991-06-11  |  24KB  |  627 lines

  1. Sherlock Version 1.7. READ.ME file
  2.  
  3. Use 8 character tabs for best appearance of this file.
  4.  
  5.  
  6. June 15, 1991
  7.  
  8. This is the first public domain version of Sherlock.  Versions 1.5, 1.6 and 1.7 
  9. are identical except for bug fixes.
  10.  
  11. The file sherlock.doc contains the User's Manual for Sherlock.  For a typeset
  12. version of the manual, including an index, please send $15 to Edward K. Ream.
  13.  
  14. For the first time, version 1.7 contains the complete source code for the SPP 
  15. tool.  Enjoy.
  16.  
  17. Although much of the code in this release is old and stable, this particular 
  18. release is relatively new.  Please call if you have any problems with it.
  19.  
  20.  
  21. REWARD
  22.  
  23. Although this is public domain software, a reward of $5.12 will be cheerfully 
  24. paid to the first person who reports any bug in any part of Sherlock.
  25.  
  26. I have no other plans to develop Sherlock further, though I am willing to 
  27. modify and improve Sherlock on a contract programming basis.
  28.  
  29. A preliminary version of Sherlock for the Macintosh is also available from:
  30.  
  31.     The C Users' Group
  32.     2601 Iowa Street
  33.     Lawrence, KS 66046    
  34.  
  35.  
  36. PUBLIC DOMAIN SOFTWARE
  37.  
  38. Sherlock, including all files on this disk, is hereby placed into the public 
  39. domain by its sole author and owner,
  40.  
  41.     Edward K. Ream
  42.     1617 Monroe Street
  43.     Madison, WI 53711
  44.     (608) 257-0802
  45.  
  46. Permission is hereby granted by Edward K. Ream to use and distribute any file
  47. on this disk for any purpose whatever.
  48.  
  49. I welcome any questions or comments you may have about Sherlock.  I am 
  50. available for commercial consulting on Sherlock at reasonable rates.
  51.  
  52.  
  53. SYSTEM REQUIREMENTS
  54.  
  55. o An IBM PC/XT/AT computer or compatible with two floppy disks or a hard 
  56. disk and the MS-DOS operating system.
  57.  
  58. o Either the Microsoft C compiler or the Turbo C compiler.  Minor 
  59. modifications in Sherlock's source code will allow Sherlock to compile using 
  60. other C compilers.
  61.  
  62. The code and make files on this disk were developed and tested using version 
  63. 5.0 of the Microsoft compiler and version 2.0 of the Turbo C compiler.
  64.  
  65.  
  66. FILES ON YOUR DISK
  67.  
  68. File        Description
  69.  
  70. read.me        This file.
  71. *.mak        Make files for the Turbo C compiler version 1.5.
  72. *.mmk        Make files for the Microsoft C compiler version 
  73.         5.00 or later.
  74. *.lnk        Link files for the Turbo C linker.
  75. *.ml        Link files for the Microsoft linker.
  76. dumpregs.c    C Language source code for a program illustrating 
  77.         the use of regs.asm.
  78. prf.asm        Assembly language source code for the interrupt 
  79.         handler.
  80. prfnear.obj    Object code for interrupt handler for memory 
  81.         models with small code spaces.
  82. prffar.obj    Object code for interrupt handler for memory 
  83.         models with large code spaces.
  84. measure.c    Program to compute timing adjustments. (see below)
  85. regs.asm    Assembly language source code for the register 
  86.         dumper.
  87. regsnear.obj    Object code for the register dumper for memory 
  88.         models with small code spaces.  (see below)
  89. regsfar.obj    Object code for the register dumper for memory 
  90.         models with large code spaces.  (see below)
  91. sdel.exe    Utility program which deletes all Sherlock macros 
  92.         from a single source file.
  93. sdel.c        C language source code for SDEL illustrating the 
  94.         use of Sherlock's macros.
  95. sdif.exe    Special purpose file comparison program.
  96. sdif.c        The C language source code for SDIF.
  97. sherlock.c    C language source code for Sherlock support routines.
  98. sherlock.doc    Complete Sherlock Users Manual.
  99. sl.h        Preferred definitions of macros.
  100. sl1.h        Alternate definitions of macros.
  101. spp*.h        Header files for the SPP tool.
  102. spp*.c        Source code for the SPP tool.
  103. spp.exe        Utility program which inserts Sherlock macros 
  104.         into a single source file.
  105. spp.doc        The theory of operation of SPP.
  106. sppnotes.doc    Possible improvements to SPP.
  107.  
  108.  
  109. QUICK START
  110.  
  111. This is the super-condensed version of the installation procedure.  For more 
  112. detailed explanation of how to use sherlock, see the file sherlock.doc.
  113.  
  114. 1. Insert Sherlock macros into all your sources files using the SPP tool. For 
  115. each file, use the -i option of SPP to insert the line #include "sl.h" at the 
  116. beginning of the file.  Alternatively, if you have a single header file which is 
  117. inserted in all your source files, insert the line #include "sl.h" in the header file 
  118. and do *not* use the -i option.  See the SPP section of sherlock.doc for more 
  119. details.
  120.  
  121. 2. Recompile all your source files.  Make sure to #define the compile time 
  122. symbol called SHERLOCK.  The easiest and best way to do this is with a 
  123. command line option to the compiler.
  124.  
  125. 3. Compile the source code for the Sherlock support routines, located in  
  126. sherlock.c.  Make sure the memory model used when compiling the  support 
  127. routines is the same as the memory model used when compiling  the rest of the 
  128. files of your program.  Sample make and link files to  accomplish this step are 
  129. included in the directory called sherlock.
  130.  
  131. 4. Link the following files together to produce an executable version of  your 
  132. program:
  133.  
  134. o All the .obj files produced by compiling the files of your program.
  135. o The .obj file produced by compiling sherlock.c.
  136. o One (and only one) of the following two files:  prffar.obj or prfnear.obj.
  137.  
  138. Note:  Use prffar.obj when using memory models that have a code space  larger 
  139. than 64K.  Use prfnear when using memory models that have a code  space 
  140. limited to 64K or less.
  141.  
  142. 5. Run your program with ++* added to the command line to enable all 
  143. Sherlock traces.  You will get lots of output.  Eliminate unwanted traces by 
  144. rerunning your program with --xxx (in addition to ++*) to disable the tracing 
  145. for  function xxx.  Use --yyy* to disable tracing for all functions whose names 
  146. start with yyy.  Alternatively, do not use ++* and instead enable tracing for 
  147. selected functions using ++xxx or ++yyy*.  See sherlock.doc for a full 
  148. explanation of enabling and disabling tracing.
  149.  
  150. 6. After debugging, it is easy to eliminate *all* the code produced by the 
  151. Sherlock macros *without* removing the macros from your source code.  Just 
  152. #undef SHERLOCK and recompile all your source files and relink without 
  153. prfnear.obj, prffar.obj, or the object file produced from sherlock.c. 
  154.  
  155.  
  156. DISABLING UNNEEDED ROUTINES IN SHERLOCK.C
  157.  
  158. The following two #define statements appear near the beginning of sherlock.c:
  159.  
  160.     #define MARKI 1
  161.     #define MARKII 1
  162.  
  163. You will be able to save quite a bit code space in your programs by commenting 
  164. out the statement which enables the version of the support routines which you 
  165. are NOT using.
  166.  
  167. In particular, comment out the MARKI constant when using either the Turbo C 
  168. or Microsoft C compiler.
  169.  
  170.  
  171. KEEPING TRACK OF MEMORY MODELS
  172.  
  173. Please must make *sure* that the same memory model is used to compile *all* 
  174. the files that are linked together to form a single program.  It is a good idea to 
  175. have the name of .obj files and .lib files reflect the memory model used to create 
  176. those files.
  177.  
  178. For example, all the .mak, .lnk, .mmk and .ml files supplied on this disk 
  179. assume that the following naming convention is used to name the .obj file 
  180. produced when sherlock.c is compiled:
  181.  
  182.     slt.obj        tiny memory model for Turbo C
  183.     sls.obj        small memory model for Turbo C
  184.     slm.obj        medium memory model for Turbo C
  185.     slc.obj        compact memory model for Turbo C
  186.     sll.obj        large memory model for Turbo C
  187.     slh.obj        huge memory model for Turbo C
  188.  
  189.     mslt.obj    tiny memory model for Microsoft C
  190.     msls.obj    small memory model for Microsoft C
  191.     mslm.obj    medium memory model for Microsoft C
  192.     mslc.obj    compact memory model for Microsoft C
  193.     msll.obj    large memory model for Microsoft C
  194.     mslh.obj    huge memory model for Microsoft C
  195.  
  196. When you change memory models, be sure to change *all* the references to 
  197. .obj and .lib files in your .mak, .lnk, .mmk or .ml files to correspond to the 
  198. new memory model.
  199.  
  200.  
  201. .OBJ FILES
  202.  
  203. The Microsoft MASM assembler was used to produce the files prfnear.obj and 
  204. prffar.obj from the file prf.asm.  These .obj files may be used with both the 
  205. Microsoft and the Turbo C linkers.  You will not need MASM unless you want 
  206. to change the interrupt handler.
  207.  
  208. Important:  Use prfnear.obj when using memory models that use only a single 
  209. code segment, i.e., the Microsoft tiny, small and compact models. Use 
  210. prffar.obj when using memory models that use multiple code segments, i.e., the 
  211. Microsoft medium, large and huge memory models.
  212.  
  213.  
  214. MAKE AND LINK FILES
  215.  
  216. Make and link files are provided for the SDIF, SDEL and CPP tools.  Each 
  217. make file refers to a corresponding link file.  The following naming conventions 
  218. are used:
  219.  
  220.     FILE EXTENSION    CORRESPONDING PROGRAM
  221.  
  222.     .mak            Turbo C MAKE
  223.     .mmk            Microsoft C MAKE
  224.     .lnk            Turbo C TLINK
  225.     .ml            Microsoft LINK
  226.  
  227. For each tool, the make and link files assume that directories are arranged as 
  228. follows:
  229.  
  230.     TYPE OF FILE        LOCATION
  231.  
  232.     Source code        root directory, e.g.,\sherlock
  233.                 \sdel or \sdif
  234.     Microsoft .obj        msc subdirectory
  235.     Turbo C .obj        turboc subdirectory
  236.     Microsoft libraries    c:\lib\msc
  237.     Turbo C libraries    c:\lib\turboc
  238.     Microsoft include files    c:\include\msc
  239.     Turbo C include files    c:\include\turboc
  240.  
  241. Change the make and link files as appropriate to reflect how you have arranged 
  242. your directories.  Also, be sure to change the make and link files to reflect 
  243. which memory model you are using.
  244.  
  245.  
  246. USING OTHER DEBUGGERS WITH SHERLOCK
  247.  
  248. A program using Sherlock macros remains an ordinary C program.  In 
  249. particular, you may use other debuggers such as debug or CodeView to debug 
  250. programs containing Sherlock macros.
  251.  
  252.  
  253. USING SHERLOCK IN WINDOWING ENVIRONMENTS
  254.  
  255. Sherlock can be used in some windowing environments.  First, use the -o 
  256. option SPP to write all tracing messages using the sl_cout() and related 
  257. routines.
  258.  
  259. Next,  modify sl_cout(), defined in sherlock.c, to write a character to the 
  260. desired window.  The sl_cout() routine consists solely of a single call to 
  261. putchar(), so modifying it should be easy.
  262.  
  263.  
  264. KNOWN PROBLEMS
  265.  
  266. o The following code will generate a syntax error after being processed by SPP:
  267.  
  268.     if (a) return; else ...
  269.  
  270. SPP will generate:
  271.  
  272.     if (a) RETURN_VOID("function_name"); else ...
  273.  
  274. Alas, the RETURN_VOID macro expands to:
  275.  
  276.     if (a) {sl_xv("function_name"); return}; else ...
  277.  
  278. The problem is that the semicolon after the } terminates the if statement!  The 
  279. compiler will thus complain that the "else" does not match any "if." A good 
  280. workaround is to write:
  281.  
  282.     if (a) { RETURN_VOID("function_name");} else ...
  283.  
  284. o Similarly, in functions returning structs or unions, the following code will 
  285. generate a syntax error after being processed by SPP:
  286.  
  287.     if (a) return val; else ...
  288.  
  289. SPP will generate:
  290.  
  291.     if (a) TICKX("function_name"); return val; else ...
  292.  
  293. Again, the compiler will complain that the "else" is not associated with the "if."  
  294. As before, a good workaround is to enclose the if clause in brackets:
  295.  
  296.     if (a) { TICKX("function_name"); return val;} else ...
  297.  
  298. Note that this problem does not affect functions returning POINTERS to structs 
  299. or unions.
  300.  
  301. o The SPP tool sometimes inserts TICKX macros at the end of functions where 
  302. control can never reach.  The only effect of this problem is to increase the size 
  303. of your program slightly.  The Turbo C compiler will warn of such unreachable 
  304. code.
  305.  
  306. o SPP issues a warning if a cast occurs in an #if preprocessor directive.  The 
  307. ANSI standard explicitly prohibits such casts, but Turbo C uses them in the file 
  308. limits.h.  Also, SPP issues a warning in the Turbo C file graphics.h. These 
  309. warnings may safely be ignored. 
  310.  
  311. o Sherlock macros generate many strings.  When using the Microsoft C 
  312. compiler, it is a good idea to compile all files with the /Gt0 command line option 
  313. (The last character is zero.)  This will place all data in separate segments so that 
  314. the limit of 64K in the stack segment will not be exceeded.
  315.  
  316. o Do not pass the address of a buffer whose contents may change to the SL_ON 
  317. or the SL_PARSE macros.  For example, the following code will not work as 
  318. expected.
  319.  
  320.     char name[100];
  321.  
  322.     for (;;) {
  323.         printf("\nEnter tracepoint to be enabled: ");
  324.         gets(name);
  325.         if (name[0] != '\0') break;
  326.             sl_on(name);
  327.     }
  328.  
  329. The problem is that the SL_ON macro expects that the contents of name[] will 
  330. not change.  Do something this instead:
  331.  
  332.     char *p, name[100];
  333.  
  334.     for (;;) {
  335.         printf("\nEnter tracepoint to be enabled: ");
  336.         gets(name);
  337.         if (name[0] != '\0') break;
  338.             p = malloc(strlen(name) + 1);
  339.         strcpy(p, name);
  340.         sl_on(p);
  341.     }
  342.  
  343.  
  344. POSSIBLE IMPROVEMENTS TO SHERLOCK
  345.  
  346. The following is a list of improvements that could be made to Sherlock. Note 
  347. that I have no plans for actually making these improvements.
  348.  
  349. o When dealing with large projects containing dozens or hundreds of source 
  350. files, SPP should allow the output file produced by SPP to have the same name 
  351. as the input file.  For safety's sake, SPP should create a temporary output file 
  352. and should remove the input file only it has been successfully processed 
  353. without serious errors.  One way to do this would be to allow global  
  354. parameters on the command line, e.g., SPP *.c
  355.  
  356. o Along the same lines, it would be helpful to have a "batch" option to SPP. 
  357. Instead of including all the options to SPP on the command line, the batch 
  358. option would direct SPP to get options from a disk file.
  359.  
  360. o  For statistics gathering, It would be useful to have an SPP option that would 
  361. cause SPP to generate only STATB and STATX macros.
  362.  
  363. o SPP would generate better looking files if it inserted #include <sl.h> before 
  364. the first #if or #include in the file, rather than at the start of the file.
  365.  
  366. o See the file sppnotes.doc for a list of possible design changes to SPP.
  367.  
  368.  
  369. NEW FEATURES IN VERSION 1.5
  370.  
  371. o SPP v1.5 recognizes single-line comments, which start with // and continue to 
  372. the end of the line.  As you would expect, the // sequence is treated as ordinary 
  373. characters in comments and inside strings.  Single-line comments are not part of 
  374. the Draft ANSI C standard, but are offered as language extensions by several C 
  375. compilers, including the Microsoft C compiler.
  376.  
  377. A fine point:  each single-line comment is converted to a single blank in the 
  378. replacement text of a #define preprocessor directive the // characters and any 
  379. following characters do not become part of the replacement text of the macro 
  380. being defined.  This is consistent with how ordinary C comments are handled in 
  381. the Draft ANSI C Standard, and is also consistent with how current C++ 
  382. compilers work.  However, old C++ translators handled // differently.
  383.  
  384. Warning: the description of single-line comments on page 130 of The C++ 
  385. Programming Language, by Bjarne Stroustrup, describes the anachronistic 
  386. operation of the old C++ translators, not current C and C++ compilers.
  387.  
  388. o The -x SPP option causes SPP not to recognize single-line comments.
  389.  
  390. o SPP v1.5 recognizes control-c interrupts in a new way,  allowing you to type 
  391. another DOS command while SPP is running.  Thanks are due to Stefan 
  392. Decuypere of Autographix for suggesting this improvement.
  393.  
  394. o The following paragraphs will be of interest only to advanced users of 
  395. Sherlock who wish to gather the best timing statistics possible.  Thanks go to 
  396. James E.G. Morris of Atari Games Corporation for suggesting improvements 
  397. in the way timing statistics are handled.  
  398.  
  399. Version 1.5 of the support routines provides ways to adjust the timing statistics 
  400. gathered by Sherlock to factor out the overhead caused by calling and returning 
  401. from the Sherlock macros.  The Sherlock support routine sl_dump() now 
  402. subtracts a "fudge factor," called TIME_ADJUST, from the timing statistics as 
  403. the report of the statistics is being generated.  This fudge factor affects only the 
  404. output of the SL_DUMP macro--the actual gathering of timing statistics is not 
  405. affected in any way by TIME_ADJUST.
  406.  
  407. The units of TIME_ADJUST are ticks per 1000 calls to Sherlock macros, and 
  408. TIME_ADJUST is supplied as a compile-time constant on the command line 
  409. when compiling sherlock.c.  If no value for TIME_ADJUST is supplied, it is 
  410. set to zero, which is what you get by default.
  411.  
  412. The proper value of TIME_ADJUST depends on several factors: the speed of 
  413. your machine, its "tick" rate, the "speed up rate,"  i.e., the value of sl_speed 
  414. used in sherlock.c, which version of Sherlock macros is used, preferred or 
  415. alternate, and which memory model is used to compile your program.  A new 
  416. utility program, called measure.c, measures the time overhead involved in 
  417. calling Sherlock macros, and suggests appropriate values for TIME_ADJUST. 
  418.  
  419.  
  420. OTHER NEW FEATURES
  421.  
  422. o SPP generates macros for a function only if the first executable statement of 
  423. that function is not already a Sherlock macro.  SPP will generate the warning, 
  424. "Sherlock macros generated for this function," if a Sherlock macro is 
  425. encountered while generating macros for a function.  That is, the warning will 
  426. be generated if the function contains Sherlock macros but the first executable 
  427. statement is not a Sherlock macro.  This new feature is very handy--you can 
  428. now run your source files through SPP any time you add any function and SPP 
  429. will leave the functions already containing Sherlock macros alone.
  430.  
  431. o SPP supports the INCLUDE environment variable, which is set with the DOS 
  432. set command.  For example, the DOS command:
  433.  
  434.     set INCLUDE=c:\include;d:\sherlock
  435.  
  436. will cause SPP to search the c:\include and d:\sherlock directories for #include 
  437. files.  The directories specified by the INCLUDE environment variable are 
  438. searched after any directories specified by the -s SPP option. 
  439.  
  440. o Two new macros, SL_ENABLE() and SL_DISABLE(), allow function-by-
  441. function control over SPP.  Both macros always expand to empty code. Insert 
  442. SL_DISABLE() as the first executable statement of a function in which you 
  443. want no more Sherlock macros to be inserted.  For example: 
  444.  
  445.     int f(void)
  446.     {
  447.         declarations;
  448.         SL_DISABLE();
  449.         No Sherlock macros will be generated in this function.
  450.     }
  451.  
  452. The SL_ENABLE() macro forces SPP to insert macros into a function.  Use 
  453. this macro when a function starts with a Sherlock macro that you inserted 
  454. yourself. For example:
  455.  
  456.     int do_command_line(int argc, char **argv)
  457.     {
  458.         declarations;
  459.         SL_ENABLE();
  460.         TRACEP("do_command_line",
  461.                 for (i = 1; i < argc; i++) {
  462.                     printf("argv[%d]: %s\n", argc, argv);
  463.                 }
  464.         );
  465.         Sherlock macros will be generated as usual.
  466.     }
  467.  
  468. Be sure to delete the SL_ENABLE() macro after SPP processes the function.
  469.  
  470. o The SDEL -d option causes SDEL not to delete SL_DISABLE() macros.
  471.  
  472. o The SDIF -b option causes SDIF to display inserted or deleted lines 
  473. consisting only on blanks or tabs.  By default SDIF does not display such lines 
  474. unless the -v option is in effect.
  475.  
  476. o SPP generates more compact code when using the -o option by generating 
  477. calls to three support routines: sl_lpout(void), sl_rpout(void) and 
  478. sl_csout(void). These new routines are equivalent to sl_cout("("), sl_sout(")"), 
  479. and sl_sout(", ") respectively.
  480.  
  481. o SPP generates printf statements that print Boolean arguments as either 
  482. "TRUE" or "FALSE" instead of 1 or 0.  This is done using calls to a support 
  483. routine called sl_sbout().  The RETURN_BOOL macro is not affected by this 
  484. feature. For example, SPP will insert the following macros:
  485.  
  486.     bool f(bool b)
  487.     {
  488.         TRACEPB("f", printf("(%s)\n", sl_sbout(b)));
  489.         ...
  490.         RETURN_BOOL("f", 1);
  491.     }
  492.  
  493. o Tracepoint names may now contain up to 31 characters.  Limiting tracepoint 
  494. names to 25 characters meant that not all proper function names were valid 
  495. tracepoint names.  
  496.  
  497.  
  498. BUGS FIXED in VERSION 1.7
  499.  
  500. o  SPP now handles multiple #elif statements properly. (I think). This is the 
  501. least tested part of SPP.  Please call if there is a problem.
  502.  
  503. o  Several bug fixes were made to sem.c to handle types properly.  Special 
  504. thanks to Roberto Artigas, Jr. for his help in this area.
  505.  
  506.  
  507. BUGS FIXED BY VERSION 1.6
  508.  
  509. o The sl_level variable was made a global variable, as described in the manual. 
  510.  
  511. o A bug was fixed that caused SPP to crash on some non-DOS systems.  See 
  512. the file called st.c.
  513.  
  514.  
  515. BUGS FIXED BY VERSION 1.5
  516.  
  517. o SPP generated a spurious error message if a function prototype contained the 
  518. [ ] operator.  For example, the correct function prototype
  519.  
  520.     void f(int[]);
  521.  
  522. generated the error message, 
  523.  
  524.     "unexpected '[' seen in a formal parameter list."
  525.  
  526. o SPP generated a spurious error message if the initializer of a structure 
  527. contained more than one open curly brace.  For example, the following correct 
  528. code,
  529.  
  530.     struct s {int i; int v[3];};
  531.     struct s s1 = {1,{0, 0, 0}};
  532.  
  533. generated the error message, "unexpected '{' in expression."
  534.  
  535. o SPP would incorrectly state that the file ended in a comment if the following 
  536. conditions held:
  537.  
  538. 1.  Nesting of comments was not allowed (the default condition).
  539. 2.  A single comment contained /* within it.
  540. 3.  The opening /* of the comment and the interior /* were on different lines.
  541.  
  542. For example:
  543.  
  544.     /* ---------------
  545.     /* This is a comment */
  546.  
  547. o Macros which expanded into more than 600 characters caused SPP to crash.  
  548. SPP now issues a warning if a macro expands into more than 1000 characters 
  549. and truncates the expansion.  SPP will still generate correct Sherlock macros 
  550. except in the unlikely event that truncating the macro expansion affects the type 
  551. of an object being traced.
  552.  
  553. o SPP used to generate a RETURN_PTR() macros for functions returning 
  554. structs or unions, as opposed to pointers to structs or unions.   Such code 
  555. would not even compile correctly.  SPP now generates a TICKX macro.  For 
  556. example, given the following function:
  557.  
  558.     struct s {a; int b};
  559.     struct s t;
  560.  
  561.     struct s get_t()
  562.     {
  563.         ...executable code...
  564.         return t;
  565.     }
  566.  
  567. SPP will generate the following macros:
  568.  
  569.     struct s get_t()
  570.     {
  571.         TICKB("get_t");
  572.         .executable code.
  573.         TICKX("get_t");
  574.         return t;
  575.     }
  576.  
  577. There is no direct way for SPP to trace the valued returned from such functions.  
  578. The TICKX macro may be modified by hand to provide a more detailed trace.
  579.  
  580.  
  581. BUGS FIXED BY VERSION 1.4
  582.  
  583. o SDIF improperly resynchronized in some cases, causing it to report changed 
  584. lines when in fact a back insertion had taken place.
  585.  
  586.  
  587. BUGS FIXED BY VERSION 1.3
  588.  
  589. o SPP handled the SL_DISABLE() macro improperly:  macro generation was 
  590. enabled if a Sherlock macro was encountered inside the function containing the 
  591. SL_DISABLE() macro.
  592.  
  593.  
  594. BUGS FIXED BY VERSION 1.2
  595.  
  596. o Both SPP and SDEL inserted extra carriage returns before newlines.  For 
  597. some compilers, debuggers and editors this was a really nasty bug--symptoms 
  598. included aborted compiles and meaningless line numbers in error messages.
  599.  
  600. o SPP did not allow constructions such as  #if 0.
  601.  
  602. o SPP did not allow white space in the formal parameter list of a macro. For 
  603. instance, 
  604.  
  605.     #define max( a , b ) replacement text
  606.  
  607. caused the erroneous error message,
  608.  
  609.     "#define ignored--formal arg must be an identifier."
  610.  
  611. o Preprocessor directives were not recognized in either of two circumstances,
  612.  
  613. 1) The directive occurred in the very first line of an included file or,
  614. 2) The directive followed an #include directive in which the file was not found.
  615.  
  616. In either case, SPP gave an erroneous "unexpected # ignored" error message.
  617.  
  618. o SPP ignored the unsigned modifier, generating %d or %ld printf 
  619. specifications instead of %u or %lu specifications.  Also, SPP generated calls to 
  620. a nonexistent routine named sl_uiout() for unsigned ints when the -o SPP 
  621. command line option was used.
  622.  
  623. o SPP only handled the special case of a pointer to char properly in a few 
  624. limited instances, i.e., only for formal parameters of a function where a typedef 
  625. was not used.
  626.  
  627.