home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume19 / dmake / part28 < prev    next >
Encoding:
Text File  |  1991-05-12  |  40.2 KB  |  1,043 lines

  1. Newsgroups: comp.sources.misc
  2. From: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  3. Subject:  v19i049:  dmake - dmake version 3.7, Part28/37
  4. Message-ID: <1991May12.221612.16584@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 806b6ea87b5ff9a0d90bf5e6183d1da6
  6. Date: Sun, 12 May 1991 22:16:12 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  10. Posting-number: Volume 19, Issue 49
  11. Archive-name: dmake/part28
  12. Supersedes: dmake-3.6: Volume 15, Issue 52-77
  13.  
  14. ---- Cut Here and feed the following to sh ----
  15. #!/bin/sh
  16. # this is dmake.shar.28 (part 28 of a multipart archive)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file dmake/quit.c continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 28; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test -f _shar_wnt_.tmp; then
  33. sed 's/^X//' << 'SHAR_EOF' >> 'dmake/quit.c' &&
  34. X
  35. X   while( Closefile() != NIL( FILE ) );
  36. X   Clean_up_processes();
  37. X
  38. X   if( Current_target != NIL(CELL) )
  39. X      Unlink_temp_files(Current_target);
  40. X
  41. X   if( _dont_quit == 0 ) _handle_quit( ".ERROR" );
  42. X
  43. X   Set_dir( Makedir );        /* No Error message if we can't do it */
  44. X   Epilog( ERROR_EXIT_VALUE );
  45. }
  46. X
  47. X
  48. static void
  49. _handle_quit( err_target )/*
  50. ============================
  51. X   Called by quit and the others to handle the execution of termination code
  52. X   from within make */
  53. char *err_target;
  54. {
  55. X   HASHPTR hp;
  56. X   CELLPTR cp;
  57. X
  58. X   if( (hp = Get_name(err_target, Defs, FALSE)) != NIL(HASH) ) {
  59. X      cp = hp->CP_OWNR;
  60. X      Glob_attr |= A_IGNORE;
  61. X
  62. X      _dont_quit = 1;
  63. X      cp->ce_flag |= F_TARGET;
  64. X      Make( cp, NIL(LINK), NIL(CELL) );
  65. X   }
  66. }
  67. SHAR_EOF
  68. chmod 0640 dmake/quit.c ||
  69. echo 'restore of dmake/quit.c failed'
  70. Wc_c="`wc -c < 'dmake/quit.c'`"
  71. test 2194 -eq "$Wc_c" ||
  72.     echo 'dmake/quit.c: original size 2194, current size' "$Wc_c"
  73. rm -f _shar_wnt_.tmp
  74. fi
  75. # ============= dmake/readme/atari.tos ==============
  76. if test ! -d 'dmake/readme'; then
  77.     mkdir 'dmake/readme'
  78. fi
  79. if test -f 'dmake/readme/atari.tos' -a X"$1" != X"-c"; then
  80.     echo 'x - skipping dmake/readme/atari.tos (File already exists)'
  81.     rm -f _shar_wnt_.tmp
  82. else
  83. > _shar_wnt_.tmp
  84. sed 's/^X//' << 'SHAR_EOF' > 'dmake/readme/atari.tos' &&
  85. This file describes the Atari-tos distribution of dmake.
  86. X
  87. The code to compile on an Atari-ST using GCC was supplied by Edgar Roeder
  88. (roeder@cs.uni-sb.de).  I do not have an ST on which to verify the
  89. distribution sources but I have no reason to believe them to not work.
  90. If there are any problems please let Edgar or myself know.
  91. X
  92. I know of no bugs or limitation to the the Atari-ST implementation.  Note that
  93. it is similar to the DOS version but it does not swap itself out.  This does
  94. not appear to be as much of a problem on the Atari as it is on MSDOS boxes :-).
  95. See the readme/msdos file for further information.
  96. X
  97. -dennis
  98. SHAR_EOF
  99. chmod 0640 dmake/readme/atari.tos ||
  100. echo 'restore of dmake/readme/atari.tos failed'
  101. Wc_c="`wc -c < 'dmake/readme/atari.tos'`"
  102. test 626 -eq "$Wc_c" ||
  103.     echo 'dmake/readme/atari.tos: original size 626, current size' "$Wc_c"
  104. rm -f _shar_wnt_.tmp
  105. fi
  106. # ============= dmake/readme/cover ==============
  107. if test -f 'dmake/readme/cover' -a X"$1" != X"-c"; then
  108.     echo 'x - skipping dmake/readme/cover (File already exists)'
  109.     rm -f _shar_wnt_.tmp
  110. else
  111. > _shar_wnt_.tmp
  112. sed 's/^X//' << 'SHAR_EOF' > 'dmake/readme/cover' &&
  113. This is the DMAKE version 3.7 distribution.  DMAKE is a Make like tool that
  114. has been written by me and has been used by individuals at the University of
  115. Waterloo.  This release replaces the previous version 3.6 release which is no
  116. longer supported.  Please read the file 'readme/release' which accompanies
  117. this distribution and describes details of this release (This note is found
  118. in readme/cover).
  119. X
  120. dmake is available for anonymous ftp from watmsg.uwaterloo.ca address is
  121. 129.97.129.9.  It is in the pub/dmake directory, set your mode to binary,
  122. and copy either:
  123. X
  124. X    dmake37.tar.Z        - compressed tar archive
  125. X    dmake37.zoo        - zoo archive
  126. X    dmake37-msdos-exe.zoo    - MSDOS executable zoo archive
  127. X    dmake37-msdos-exe.zip    - MSDOS executable zip archive
  128. X    dmake37.shar01        - xx part shar archive, get all parts
  129. X    ...
  130. X    dmake37.sharxx
  131. X
  132. dmake is different from other versions of make in that it supports significant
  133. enhancements (See the man page).  A short summary of the more important
  134. ones follows:
  135. X
  136. X    . support for portable makefiles
  137. X    . runs on many platforms (DOS, generic unix [sysv and bsd4.3],
  138. X      apollo, OS/2, Atari, and many others)
  139. X    . significantly enhanced macro facilities
  140. X    . transitive closure on inference graph
  141. X    . sophisticated inference algorithm
  142. X    . support for traversing the file sytem both during making of targets
  143. X      and during inference
  144. X    . %-meta rules for specifying rules to be used for inferring
  145. X      prerequisites
  146. X    . highly configurable
  147. X    . support for libraries
  148. X    . parallel making of targets on architectures that support it
  149. X    . attributed targets
  150. X    . text diversions
  151. X    . group recipes
  152. X    . swapping itself to DISK under MSDOS
  153. X    . supports MKS extended argument passing convention
  154. X
  155. All code found in this distribution is original and written by me except where
  156. noted in the source and the following:
  157. X
  158. - dbug/dbug package from Fred Fish  (dmake DEBUG=1, to make a debugging version
  159. X  of dmake)
  160. X
  161. - malloc.c package in dbug/malloc from the NET, see the directory for
  162. X  attribution.
  163. X
  164. -dennis
  165. SHAR_EOF
  166. chmod 0640 dmake/readme/cover ||
  167. echo 'restore of dmake/readme/cover failed'
  168. Wc_c="`wc -c < 'dmake/readme/cover'`"
  169. test 1988 -eq "$Wc_c" ||
  170.     echo 'dmake/readme/cover: original size 1988, current size' "$Wc_c"
  171. rm -f _shar_wnt_.tmp
  172. fi
  173. # ============= dmake/readme/msdos ==============
  174. if test -f 'dmake/readme/msdos' -a X"$1" != X"-c"; then
  175.     echo 'x - skipping dmake/readme/msdos (File already exists)'
  176.     rm -f _shar_wnt_.tmp
  177. else
  178. > _shar_wnt_.tmp
  179. sed 's/^X//' << 'SHAR_EOF' > 'dmake/readme/msdos' &&
  180. Notes on the MSDOS implementation of dmake.
  181. X
  182. Bootstrapping the binary:
  183. -------------------------
  184. X   A make.bat file is provided to bootstrap the binary.  The file contains
  185. X   several targets for bootstrapping.  Invoking the batch file with no
  186. X   arguments lists the possibilities shown below.
  187. X
  188. X      INDEX:  You must specify one of:
  189. X     tcc      - Turbo C 2.0 compile.
  190. X     tccswp   - Turbo C 2.0 compile of swapping dmake.
  191. X     bcc      - Borland C++ 2.0 compile.
  192. X     bccswp   - Borland C++ 2.0 compile of swapping dmake.
  193. X     msc40    - Microsoft C 4.0 compile.
  194. X     msc50    - Microsoft C 5.0 compile.
  195. X     msc51    - Microsoft C 5.1 compile.
  196. X     msc60    - Microsoft C 6.0 compile.
  197. X     msc40swp - Microsoft C 4.0, MASM 5.1 compile of swapping dmake.
  198. X     msc50swp - Microsoft C 5.0, MASM 5.1 compile of swapping dmake.
  199. X     msc51swp - Microsoft C 5.1, MASM 5.1 compile of swapping dmake.
  200. X     msc60swp - Microsoft C 6.0, MASM 5.1 compile of swapping dmake.
  201. X
  202. X   Based on the compiler you have installed and whether or not you
  203. X   want the swapping version of dmake, you should select the appropriate
  204. X   target and issue 'make.bat target'.
  205. X
  206. X   The batch file runs a second batch script that comes with the distribution
  207. X   which compiles the sources using the appropriate compiler and flags.  The
  208. X   MSC Versions of the batch files should not require any further user
  209. X   intervention during the compile.  The Turbo-C version, as a final step,
  210. X   invokes tlink with two response files.  The second of these response files,
  211. X   named in msdos/tccdos/mk*.bat, contains absolute path names to Turbo-C
  212. X   libraries.  You may need to edit these before getting a successful binary
  213. X   linked.
  214. X
  215. X   By default the batch files make an executable that will run on an 8088
  216. X   cpu and up.  You can change that by making the initial version and then
  217. X   editing the config.mk files found in either msdos/tccdos or msdos/mscdos
  218. X   (depending on compiler you use), and selecting a diferrent cpu type by
  219. X   supplying the appropriate compiler flags.  You then need to remake dmake
  220. X   again but this time use dmake itself, see below.
  221. X
  222. X   Note that the file msdos/exec.uue is a uuencoded version of a BCC++
  223. X   compiled exec.obj (from exec.asm).  If you do not have an assembler
  224. X   either microsoft MASM or Borland TASM (or some other), you can uudecode
  225. X   this file and put it into the appropriate objects directory.
  226. X
  227. X
  228. Using dmake to Make itself:
  229. ---------------------------
  230. X   If you use dmake to make itself you must first set a number of makefile
  231. X   control variables, either through the environment or on the command line.
  232. X
  233. X   The following variables must be set:
  234. X
  235. X    OS           - defines operating system (must be set)
  236. X    OSRELEASE      - particular version of it.
  237. X    OSENVIRNOMENT  - more customization
  238. X
  239. X   These three variables should be defined in your environment.  Valid values
  240. X   for them are listed in the dmake makefile.mk file.  For example, if you
  241. X   are using MSDOS, with Turbo-C then the valid settings are:
  242. X
  243. X    set OS=msdos
  244. X    set OSRELEASE=tccdos
  245. X    set OSENVIRONMENT=
  246. X
  247. X   dmake searches for an initial startup file, you should set the environment
  248. X   variable MAKESTARTUP to contain the full path to the startup file, eg:
  249. X
  250. X    set MAKESTARTUP=d:\usr\lib\startup.mk
  251. X
  252. X   The dmake makefile has several variables that can be user specified and
  253. X   default to reasonable values if not set.
  254. X
  255. X    MODEL   - defines the model to compile, valid values are
  256. X          {s,c,m, or l}, defaults to 'c' (ie. compact) model
  257. X          if unspecified.
  258. X
  259. X    MSC_VER - defines the version of Microsoft C in use, should be set to
  260. X          one of 4.0, 5.0, 5.1 or 6.0; defaults to 6.0.
  261. X
  262. X    SWAP    - If set to 'y', compile the dmake swapping version of
  263. X          spawnvpe.  This has the effect of turning on swapping of the
  264. X          executable to disk if the MSDOS version is made.
  265. X
  266. X    DEBUG   - If set to '1' then make the debugging version of dmake, this
  267. X          will also set MODEL to 'l'.
  268. X
  269. X   To set the above variables you must specify them on the dmake command line
  270. X   or insert them into the makefile.mk script.
  271. X
  272. X
  273. Memory Requirements and Swapping:
  274. ---------------------------------
  275. X   The swapping code currently only swaps to DISK, I have left hooks
  276. X   in to accomodate XMS and EMS, I have some code that performs the
  277. X   necessary XMS/EMS accesses but have not incorporated it in yet.
  278. X   It appears that a ramdisk seems to work just fine.  If anyone
  279. X   wishes to fill in the hooks please do and I'll be happy to include
  280. X   them in future distributions.
  281. X
  282. X
  283. ^C and stopping a make:
  284. -----------------------
  285. X   Thanks to the efforts of Len Reed, appears to now work.  I have been unable
  286. X   to hang my machine if it's swapped out and I hit ^C a couple thousand times.
  287. X
  288. X
  289. Other notes:
  290. ------------
  291. X   dmake does not care if you are running command.com or some other command
  292. X   interpretter, you must however specify the proper values of the environment
  293. X   variables SHELL, SHELLFLAGS, GROUPSHELL, and GROUPFLAGS in order for things
  294. X   to work correctly.  Read the man page first.
  295. X
  296. X   Group recipes under DOS that use command.com as the command interpretter
  297. X   require you to set the GROUPSUFFIX macro.
  298. X
  299. X   As shipped the startup.mk files for the DOS version try to figure out what
  300. X   command interpretter you are using and set things up appropriately.
  301. X   Two command interpretters are supported in the shipped startup.mk file,
  302. X   command.com, and the MKS Korn shell.
  303. X
  304. X   dmake does not contain any builtin commands.  It gets all commands it
  305. X   executes from an external file system.  It is therefore most useful if it
  306. X   is used in conjunction with an environment similar to that provided by
  307. X   the MKS Tool Kit, or equivalent.
  308. X
  309. X   dmake now supports the MKS argument passing conventions.  The facility is
  310. X   enabled by setting .MKSARGS:=1.  It is set by default in the startup.mk file
  311. X   if an MKS Korn shell is detected as being the active command interpretter.
  312. SHAR_EOF
  313. chmod 0640 dmake/readme/msdos ||
  314. echo 'restore of dmake/readme/msdos failed'
  315. Wc_c="`wc -c < 'dmake/readme/msdos'`"
  316. test 5848 -eq "$Wc_c" ||
  317.     echo 'dmake/readme/msdos: original size 5848, current size' "$Wc_c"
  318. rm -f _shar_wnt_.tmp
  319. fi
  320. # ============= dmake/readme/os2 ==============
  321. if test -f 'dmake/readme/os2' -a X"$1" != X"-c"; then
  322.     echo 'x - skipping dmake/readme/os2 (File already exists)'
  323.     rm -f _shar_wnt_.tmp
  324. else
  325. > _shar_wnt_.tmp
  326. sed 's/^X//' << 'SHAR_EOF' > 'dmake/readme/os2' &&
  327. Notes on the OS/2 implementation of dmake:
  328. ==========================================
  329. X
  330. As shipped the DOS versions of dmake will run under OS/2 protected mode.
  331. However, support for a full OS/2 version is also provided.  The OS/2 version
  332. will run in parallel under OS/2.  The port was made possible by files supplied
  333. by:
  334. X
  335. X   Duncan Booth   -- (duncanb@ibmpcug.co.uk, Bix:jrichards)
  336. X   Kai Uwe Rommel -- (rommel@lan.informatik.tu-muenchen.dbp.de),
  337. X
  338. For which I am grateful.  I have taken the two ports and integrated them 
  339. into a single port using the structure supplied by Duncan Booth, and some
  340. files and OS2'ism supplied by Kai Rommel.
  341. X
  342. If there are any problems with the port then please let myself or one of the
  343. two people above know.  I will then attempt to fix the problem.  I do not
  344. have access to an OS/2 box to verify any problems myself.
  345. X
  346. X
  347. Bootstrapping the binary:
  348. -------------------------
  349. X   A make.cmd file is provided to bootstrap the binary.  The file contains
  350. X   several targets for bootstrapping.  Invoking the batch file with no
  351. X   arguments lists the possibilities shown below.
  352. X
  353. X      INDEX:  You must specify one of:
  354. X     msc40    - Microsoft C 4.0 compile.
  355. X     msc50    - Microsoft C 5.0 compile.
  356. X     msc51    - Microsoft C 5.1 compile.
  357. X     msc60    - Microsoft C 6.0 compile.
  358. X
  359. X   Based on the compiler you have installed and whether or not you
  360. X   want the swapping version of dmake, you should select the appropriate
  361. X   target and issue 'make.cmd target'.
  362. X
  363. X   The command file runs a second command script that comes with the
  364. X   distribution which compiles the sources using the appropriate compiler and
  365. X   flags.  The MSC Versions of the batch files should not require any further
  366. X   user intervention during the compile.
  367. X
  368. X   By default the command files make an executable that will run on an 8088
  369. X   cpu and up.  You can change that by making the initial version and then
  370. X   editing the config.mk file found in os2/mscdos and selecting a diferrent
  371. X   cpu type by supplying the appropriate compiler flags.
  372. X   You then need to remake dmake again but this time use dmake itself,
  373. X   see below.
  374. X
  375. X
  376. Using dmake to Make itself:
  377. ---------------------------
  378. X   If you use dmake to make itself you must first set a number of makefile
  379. X   control variables, either through the environment or on the command line.
  380. X
  381. X   The following variables must be set:
  382. X
  383. X    OS           - defines operating system (must be set)
  384. X    OSRELEASE      - particular version of it.
  385. X    OSENVIRNOMENT  - more customization (not needed for OS/2)
  386. X
  387. X   These three variables should be defined in your environment.  Valid values
  388. X   for them are listed in the dmake makefile.mk file.  For example, if you
  389. X   are using OS/2, with Microsoft-C then the valid settings are:
  390. X
  391. X    set OS=os2
  392. X    set OSRELEASE=mscdos
  393. X
  394. X   dmake searches for an initial startup file, you should set the environment
  395. X   variable MAKESTARTUP to contain the full path to the startup file, eg:
  396. X
  397. X    set MAKESTARTUP=\init\dmake.ini
  398. X
  399. X   The dmake makefile has several variables that can be user specified and
  400. X   default to reasonable values if not set.
  401. X
  402. X    MODEL   - defines the model to compile, valid values are
  403. X          {s,c,m, or l}, defaults to 'c' (ie. compact) model
  404. X          if unspecified.
  405. X
  406. X    MSC_VER - defines the version of Microsoft C in use, should be set to
  407. X          one of 4.0, 5.0, 5.1 or 6.0; defaults to 6.0.
  408. X
  409. X    DEBUG   - If set to '1' then make the debugging version of dmake, this
  410. X          will also set MODEL to 'l'.
  411. X
  412. X   To set the above variables you must specify them on the dmake command line
  413. X   or insert them into the makefile.mk script.
  414. X
  415. X
  416. X
  417. OS/2 Specifics
  418. --------------
  419. X
  420. X   There is a small number of OS/2 specific features that need to be
  421. X   stated.  
  422. X
  423. X   1. The environment variables TMP as well as TMPDIR are checked for the
  424. X      location of the directory where dmake should place any temporary files.
  425. X      TMPDIR is checked before TMP.
  426. X
  427. X   2. Appropriate limits are setup for MAXPROCESSES and buffer sizes etc.
  428. X      See output of 'dmake -V'.
  429. X
  430. X   3. By default dmake will look for the startup.mk file in the path:
  431. X          
  432. X      $(INIT)/dmake.ini
  433. X
  434. X      This is more in keeping with OS/2 philosophy.  You may still rename
  435. X      and put it anywhere else you like by defining the MAKESTARTUP
  436. X      environment variable.
  437. X
  438. X   4. The OS/2 directory contains files required by Kai Rommel's compiler
  439. X      shell.
  440. X
  441. X   5. Swapping the dmake binary to disk is not supported under OS/2.
  442. X
  443. X
  444. Other notes:
  445. ------------
  446. X   dmake does not care if you are running cmd.exe or some other command
  447. X   interpretter, you must however specify the proper values of the environment
  448. X   variables SHELL, SHELLFLAGS, GROUPSHELL, and GROUPFLAGS in order for things
  449. X   to work correctly.  Read the man page first.
  450. X
  451. X   Group recipes under OS/2 that use cmd.exe as the command interpretter
  452. X   require you to set the GROUPSUFFIX macro.
  453. X
  454. X   As shipped the startup.mk files try to figure out what
  455. X   command interpretter you are using and set things up appropriately.
  456. X   Two command interpretters are supported in the shipped startup.mk file,
  457. X   cmd.exe (via COMSPEC), and the MKS Korn shell.
  458. X
  459. X   dmake does not contain any builtin commands.  It gets all commands it
  460. X   executes from an external file system.  It is therefore most useful if it
  461. X   is used in conjunction with an environment similar to that provided by
  462. X   the MKS Tool kit, or equivalent.
  463. X
  464. X   dmake now supports the MKS argument passing conventions.  The facility is
  465. X   enabled by setting .MKSARGS:=1 and is set by default in the startup.mk file
  466. X   if an MKS Korn shell is detected as being the active command interpretter.
  467. SHAR_EOF
  468. chmod 0640 dmake/readme/os2 ||
  469. echo 'restore of dmake/readme/os2 failed'
  470. Wc_c="`wc -c < 'dmake/readme/os2'`"
  471. test 5581 -eq "$Wc_c" ||
  472.     echo 'dmake/readme/os2: original size 5581, current size' "$Wc_c"
  473. rm -f _shar_wnt_.tmp
  474. fi
  475. # ============= dmake/readme/release ==============
  476. if test -f 'dmake/readme/release' -a X"$1" != X"-c"; then
  477.     echo 'x - skipping dmake/readme/release (File already exists)'
  478.     rm -f _shar_wnt_.tmp
  479. else
  480. > _shar_wnt_.tmp
  481. sed 's/^X//' << 'SHAR_EOF' > 'dmake/readme/release' &&
  482. dmake Version 3.7
  483. =================
  484. X
  485. FULL RELEASE OF DMAKE, REPLACES VERSION 3.6
  486. X
  487. Nature:  It is highly recommended that this version replace all versions of 3.6
  488. -------  that are in current use.  Version 3.7 fixes numerous memory bugs that
  489. X     were present in Version 3.6.  These often caused spurious behaviour
  490. X     especially on MSDOS machines when complex makefiles were used.
  491. X
  492. X     This release addresses the following issues:
  493. X
  494. X         1. Modifications to the inference algorithm.
  495. X         2. Memory bug fixes.
  496. X         3. Enhancements to the macro expansion facilities.
  497. X         4. Addition of .KEEP_STATE functionality.
  498. X         5. Many other tweaks and tunes
  499. X
  500. X      This distribution advances dmake to Version 3.7, patch level 0.
  501. X
  502. X
  503. Availability:
  504. -------------
  505. X      dmake is available via anonymous ftp from watmsg.uwaterloo.edu
  506. X      (129.97.129.9) as:
  507. X
  508. X          pub/dmake/dmake37.tar.Z        - compressed tar archive
  509. X          pub/dmake/dmake37.zoo        - zoo archive
  510. X          pub/dmake/dmake37-msdos-exe.zoo    - MSDOS executable zoo archive
  511. X          pub/dmake/dmake37-msdos-exe.zip    - MSDOS executable zip archive
  512. X          pub/dmake/dmake37.shar01        - xx part shar archive
  513. X          ...                  (get all parts)
  514. X          pub/dmake/dmake37.sharxx
  515. X
  516. X      and comes in several archive formats.  Choose the one that best
  517. X      suits your needs.
  518. X
  519. Acknowledgements:
  520. -----------------
  521. X      Thanks to all who submitted code for new features, suggestions for
  522. X      improvements, and bug fixes.  I have tried to make sure no gotchas
  523. X      remain, if you encounter problems installing or running dmake please
  524. X      let me know.  As always, I am always happy to receive e-mail.
  525. X
  526. X
  527. DETAILS OF ENHANCEMENTS/TWEAKS:
  528. ===============================
  529. - Ran the whole thing with a DEBUGING malloc library on.  Found one memory
  530. X  bug in expand.c, one in BSD 4.3's version of getwd.  I am now fairly
  531. X  confident that no more obscure memory allocation bugs remain in dmake.
  532. X
  533. - Addition of the malloc dbug code made me move all debug code into the
  534. X  dbug directory and I changed the config.mk files around to reflect the
  535. X  changes.  Setting DEBUG=1 on the command line gives you DB_ macros, and
  536. X  DEBUG=1 DBMALLOC=1 gives you DB_ macros and debuging malloc library.
  537. X
  538. - Added sysvr4 directory and targets
  539. X
  540. - Disallowed %.o :: %.c rules.  They make no sense and the implementation
  541. X  was completely wrong.  That is, the difference between
  542. X
  543. X    %.o : %.c; ...
  544. X    %.o : %.f; ...
  545. X  and
  546. X    %.o :: %.c; ...
  547. X    %.o :: %.f; ...
  548. X
  549. X  is less than clear, and the efficacy of the latter is even muddier.  From
  550. X  now on :: rules are not allowed in %-meta rules.  This simplifies the
  551. X  description of what is going on and makes the code in infer.c significantly
  552. X  more correct.  When %-meta rules are now replaced by other rules, the
  553. X  .SETDIR attribute (if specified) is taken into consideration and only rules
  554. X  whose target, prerequisite, and .SETDIR value match are considered for
  555. X  replacement, otherwise the new rule is added.
  556. X
  557. - Modified the setting of external file name for targets that have been made
  558. X  and that had a .SETDIR= attribute as follows:
  559. X
  560. X    .SETDIR=fred : test
  561. X
  562. X    target : test ; ...
  563. X
  564. X  then the name of test in any $< expansions is fred/test if the change of
  565. X  directory was successful, if however the rules for making test are:
  566. X
  567. X    test .SETDIR=a :: ...
  568. X    test .SETDIR=b :: ...
  569. X
  570. X  then the external file name for 'test' is simply 'test'.  We don't know
  571. X  which recipes will be used to bring it up to date in which directories
  572. X  hence we will not attempt to modify the name of test.   The same holds for
  573. X  the .SOURCE search rules in this case.
  574. X
  575. X  You are now able to provide different .SETDIR=dir attributes to each
  576. X  new :: rule associated with a target, see above for what name is deduced
  577. X  for such targets after they are made.
  578. X
  579. - Went to a Breadth-first search inference algorithm.  Major change and two
  580. X  days of hacking, but it seems to work.  It is much nicer now and I can
  581. X  describe with definite determinism what the algorithm will not infer.
  582. X  All ambiguities are reported rather than choosing an arbitrary inference
  583. X  chain.  This is considerably less error prone, but may break some existing
  584. X  makefiles.  Modified -v display to show exactly what inference chain is
  585. X  used.
  586. X
  587. - Fixed the recipe handling of +,-,%,@ at the start of a recipe line.  The
  588. X  attributes are now recognized even if they appear in a macro at the start
  589. X  of the recipe line.  ie;
  590. X
  591. X    all:
  592. X        $(SH) do the right thing
  593. X
  594. X  will use the shell if SH=+ is defined somewhere.
  595. X
  596. - Modified string{token_list} expansions to better co-exist with /bin/sh.
  597. X  /bin/sh treats the following as valid syntax:
  598. X
  599. X      { echo hello;}
  600. X
  601. X  under version 3.6 of dmake it would strip the {} characters or worse.
  602. X  This version of dmake has been modified to apply the {} only of the
  603. X  first token in token_list follows the opening { with no intervening
  604. X  white space.  Thus the above line will NOT BE Expanded, while
  605. X
  606. X        {foo fee}.c
  607. X
  608. X  will result in foo.c and fee.c as the result of the expansion.
  609. X
  610. - If using Augmake (-A) flag then directories are always made, even if they
  611. X  are up to date.
  612. X
  613. - Added .PHONY attribute.  Any target with this attribute will have it's
  614. X  recipe made each time it is made even if a file with the name of the target
  615. X  exists and can be found by dmake.  Targets that have as a prerequisite a
  616. X  target with the .PHONY attribute set will also get made since the time stamp
  617. X  of the prerequisite will be made current and it will appear older than the
  618. X  target thereby forcing it to be made as well.
  619. X
  620. - Added .ELIF <condition> construct, and allowed .ENDIF as a synnonym for
  621. X  .END.  Made the parsing of .IF....ELIF....ELSE....END constructs a little
  622. X  more robust.
  623. X
  624. - Changed behaviour of .SETDIR= attribute when used without prerequisites or
  625. X  a target.
  626. X
  627. X    .SETDIR=somedir :
  628. X
  629. X  is no longer supported you should instead use the macro form of the
  630. X  attribute:
  631. X
  632. X    .SETDIR := somedir
  633. X
  634. X  The reasoning behind the switch goes as follows.  If you wrote the line
  635. X
  636. X    .SETDIR=somedir : $(SOURCE_FILES)
  637. X
  638. X  and $(SOURCE_FILES) was null this would cause dmake to CD to somedir prior
  639. X  to making any targets.  This situation is undesirable at best as it caused
  640. X  some weird error messages.  The new modified behaviour is more consistent
  641. X  and allows the attribute to be set on the command line.
  642. X
  643. - Modified inference to assume targets that have no .suffix can be made from
  644. X  files that contain at least one .suffix.  This prevents early termination of
  645. X  the inference algorithm.
  646. X
  647. - Added -v{dfimt} flag so that you can now control
  648. X  how much junk -v actually prints.  This means that
  649. X  -v is now a seperate flag and cannot be catenated
  650. X  with the rest... oh well.
  651. X
  652. - Added DOS tee function to copy the contents of output to stdout and stderr
  653. X  to a file specified using -C option.  patches were supplied by Len Reed.
  654. X
  655. - Added KEEPSTATE functionality based on Dean Hoovers stuff.
  656. X    BEWARE:  If you make a target and the recipe has a default set of rules
  657. X         when things are updated, but a slightly different set when it
  658. X         updates then using KEEPSTATE will fail.  In particular:
  659. X
  660. X         Suppose you infer a recipe % --> %.o --> %.c, and the first time
  661. X         you make a target the .o is in the '.' directory, but by default
  662. X         you tell dmake to look in objects, then when you run dmake the
  663. X         next time the recipe will be different as the .o will now be
  664. X         objects/foo.o and the KEEPSTATE value will be outdated and hence
  665. X         the target will look as if it needs making.
  666. X  .NOSTATE attribute to disable keeping of state for any target with this
  667. X  attribute set.  no state is kept for .PHONY targets either.
  668. X
  669. - Added some more GNU style macro expansions:
  670. X
  671. X    $(null,text true false)
  672. X    $(!null,text true false)
  673. X    $(eq,lhs,rhs true false)
  674. X    $(!eq,lhs,rhs true false)
  675. X
  676. X  The first returns Expand(true) if Expand(text) is null, and Expand(false) if
  677. X  Expand(text) is not null.  The second is the negation of the first.
  678. X
  679. X  The equality macros are similar but test
  680. X     Expand(lhs) == Expand(rhs)
  681. X  rather than against null.
  682. X
  683. - Modified the running of normal recipes to perform the following expansion
  684. X  prior to doing the command:
  685. X
  686. X    set CNMDNAME := name of command to execute (first whitespace ending
  687. X            token in command line)
  688. X    set CMNDARGS := remainder of the line
  689. X
  690. X  Expand $(COMMAND) to form the the command line to pass to be executed.  By
  691. X  default COMMAND is set to:
  692. X
  693. X    COMMAND = $(CMNDNAME) $(CMNDARGS)
  694. X
  695. X  If however you wish to use a different interface (esp under DOS) for passing
  696. X  long command line arguments then you can easily do so, for example:
  697. X
  698. X    COMMAND = $(CMNDNAME) @(mktmp $(CMNDARGS))
  699. X
  700. X  assigns a temporary file that holds the arguments and executest the comand
  701. X
  702. X    $(CMNDNAME) @/tmp/ASAD38479217
  703. X
  704. X  or whatever, the temporary file is removed upon completion of the command
  705. X  unless the -vt flag is given.
  706. X
  707. - Added $(shell command) macro, which passes the commands specified as data to
  708. X  a shell using the usual interface and returns the result of the output from
  709. X  the command catenated together into a single string separated by spaces.
  710. X
  711. X  For example:
  712. X
  713. X      $(shell ls *.c)
  714. X
  715. X  returns the list of *.c files from the current directory.
  716. X
  717. - Added $(sort data) macro which sorts the list of space separated tokens in
  718. X  data.
  719. X
  720. - Added $(strip data) macro which makes sure that data contains a list
  721. X  of tokens separated by a single space.
  722. X
  723. - Added $(subst,pat,replacement data)
  724. X
  725. X
  726. X
  727. DETAILS OF BUG FIXES:
  728. =====================
  729. X
  730. MAN PAGE TWEAKS:
  731. ----------------
  732. - Made all "it's" in the document to "its" -- oops.
  733. X
  734. - Documented '.IMPORT : .EVERYTHING' functionality and ensured that global
  735. X  attributes are not affected by it.
  736. X
  737. - Documented '.NOINFER:' functionality.
  738. X
  739. - Documented new features
  740. X
  741. X
  742. UNIX RELATED BUG FIXES:
  743. -----------------------
  744. - Changed unix/arlib.c to use binary time headers if M_XENIX.  You can fix
  745. X  this by changing the definition of ASCARCH in unix/sysvr3/config.h when
  746. X  M_XENIX is defined.  I don't know which is the true case so if anyone knows
  747. X  can you let me know and I'll make sure it gets set right.
  748. X
  749. - Updated unix/arlib.c to handle RS6000/AIX 3.0 archive headers.  This is
  750. X  a bit of a pain as #ifdef _AIX had to be spattered throughout arlib.c
  751. X  and in a number of other places.  It was the lesser of two evils.  Will
  752. X  IBM ever get stuff like __STDC__ right?
  753. X
  754. X
  755. MSDOS RELATED BUG FIXES:
  756. ------------------------
  757. - Applied fix supplied by few@gupta.com (Frank Whaley) to msdos/spawn.c for
  758. X  building and handling path names during the search for an executable.
  759. X  It could have hung the machine the way it was due to lack of a NULL
  760. X  pointer.
  761. X
  762. - Fixed another bug in msdos/spawn.c.  If you tried to run a program that had
  763. X  a full path including extension then the current spawn.c did not find it
  764. X  in some instances.  Whether it did or not depended on what the contents of
  765. X  the NULL pointer happened to be :-).
  766. X
  767. - Fixed a HUGE bug in msdos/spawn.c.  There was an off by one error in
  768. X  _get_path that caused serious memory stomps, and eventual hangs of the
  769. X  machine.
  770. X
  771. - Fixed bug in msdos/switchar.c, it now correctly selects the code to
  772. X  get the switchar if it's an MSDOS compile.
  773. X
  774. X
  775. OS/2 RELATED FIXES:
  776. -------------------
  777. - Applied patch for OS/2 supplied by "Kai Uwe Rommel".  Details (from Kai) of
  778. X  patch:
  779. X     o in os2/_chdir.c, there was a transmission error or typo, Ox20 instead of
  780. X       0x20
  781. X     o in os2/dmake.cs I corrected the options; my compiler shell maintains a
  782. X       global ("system-wide") set of default options, so there is no need to
  783. X       use -G2 etc. there. Also, -WX seems to be unnessecary.
  784. X     o in os2/dmake.def, I commented out the IMPORT statement (see below).
  785. X     o in os2/ruletab.c, MAXPROCESS *MUST* me removed, otherwise the argument
  786. X       of the -Pn option seems to be ignored.
  787. X     o in os2/runargv.c, I moved the session title code (with a call to an
  788. X       undocumented system call) into "#ifdef SESSTITTLE" because it also
  789. X       prevents BIND to make a family mode application that also runs under DOS
  790. X       or in the DOS box; this may be of interest to people who use both DOS
  791. X       and OS/2 on their machines, to prevent them from having two binaries of
  792. X       dmake on their hard disk. This also requires to remove the import
  793. X       statement  for the undoc. system call from the dmake.def file.
  794. X     o in os2/startup.h I added a / into the MAKESTARTUP definition.
  795. X
  796. X
  797. GENERAL FIXES:
  798. --------------
  799. - Fixed the # comment handling inside recipes to mirror what standard makes
  800. X  do.  This turned out to be trivial to do so I stuck it in.
  801. X
  802. - Fixed bug reported by bill@twwells.com, If dmake was run in a /bin/sh with
  803. X  makefile text comming via a pipe from stdin then when dmake executed the
  804. X  makefile it would see an extra child termination comming from the source
  805. X  of the pipe.  dmake now ignores returned pid's from child processes that it
  806. X  did not spawn.  An example, under /bin/sh, do:
  807. X
  808. X    cat <<\+ | dmake -vf - verify
  809. X    verify : make
  810. X        echo verify
  811. X    make :
  812. X        echo make
  813. X    +
  814. X
  815. X  The cat could finish before the first real dmake child finished and would
  816. X  cause a core dump.
  817. X
  818. - Inserted definitions of FP_OFF and FP_SEG into spawn.c and find.c under
  819. X  msdos directory as Turbo C++ was having troubles finding them.  As reported
  820. X  by Nino Margetic (nino@uk.ac.ucl.sm.mph).
  821. X
  822. - Changed Fatal error message for multiple .SETDIR= attribute specifications
  823. X  into a Warning.
  824. X
  825. - Fixed a nasty bug in Parallel Make.  It would get the names of .SETDIR'ed
  826. X  prerequisites wrong.  Specifically it lost the .SETDIR value when setting
  827. X  the $< etc macro values for the final target.
  828. X
  829. - Fixed bug reported by Len Reed.  When removing prerequisites using .REMOVE
  830. X  I now set their flags as no longer existing.  This way if we happen to
  831. X  walk this part of the graph again from some other place we know enough
  832. X  to remake them.  This is really a simpler case of the general go to the
  833. X  same spot from a different .SETDIR location problem.
  834. X
  835. X  NOTE:  The following makefile is an example of what this fixes, but that
  836. X  it may not work correctly with -Pn where n>1 since .REMOVES are run and
  837. X  they happen in parallel along with the rest of the processing.  There is
  838. X  a race in getting the .REMOVE done and walking the graph from
  839. X  the large.target side.  Don't build graphs like this.  If you want to
  840. X  do it in parallel then put each of large and small in a different
  841. X  directory.
  842. X
  843. X      all .SEQUENTIAL : small.target large.target
  844. X
  845. X      small.target : one.sml two.sml
  846. X          echo Building $@ from $&
  847. X
  848. X      large.target : one.lrg two.lrg; echo Building $@ from $&
  849. X
  850. X      %.sml : %.c; echo $(CC) $(CFLAGS) -c -Fo$<; touch $@
  851. X
  852. X      %.lrg : %.c; echo $(CC) $(CFLAGS) -AL -c -Fo$<; touch $@
  853. X
  854. X      CO = co -u
  855. X      CC = cc
  856. X      V = ,v
  857. X
  858. X     % : $$(@:d)RCS/$$(@:f)$V;- $(CO) $(COFLAGS) $@
  859. X        .NOINFER : %$V $$(@:d)RCS/$$(@:f)$V
  860. X
  861. X      :REMOVE :; /bin/rm -f $&
  862. X
  863. - Fixed core dump on circularity test for targets that contain a .LIBRARY
  864. X  beats me why I put the explicit test in to ignore the libraries if found
  865. X  to be circular.  Someone will complain if this is broken now but I don't
  866. X  think it is.
  867. X
  868. - Cleaned up the .h files, they are much cleaner and more
  869. X  organized now.
  870. X     o Added define of _POSIX_SOURCE for RS/6000
  871. X     o Moved the definition of size_t from all over the place to alloc.h
  872. X     o Cleaned up the definition of POSTAR for XENIX, You shouldn't need it.
  873. X
  874. - Fixed a bug with setting macro variables from the command line.
  875. X  It now recognizes a + only if it preceeds an '='.
  876. X
  877. - WARNING if you use the vfprintf code supplied with dmake then you might get
  878. X  a warning indicating that an illegal pointer assignment is taking place,
  879. X  ignore it.
  880. X
  881. - Fixed handling of attributes for recipes and :: rules.  The following is now
  882. X  true:
  883. X
  884. X    .MKSARGS : list_of_targets
  885. X
  886. X  Will set .MKSARGS for any target appearing in list_of_targets irrespective
  887. X  of whether it appears as a target in :: or : recipe lines.  Conversely
  888. X  the construct:
  889. X
  890. X    target1 :: ; recipe 1
  891. X    target1 .MKSARGS :: ; recipe 2
  892. X
  893. X  will set .MKSARGS when making target1 using recipe 2 only.
  894. X
  895. - Fixed a nasty bug in string.c.  Forgot to check for NIL(char) in second
  896. X  argument to _strspn and _strpbrk, sheesh!.
  897. X
  898. - Propagate parent timestamp for infered prerequisites if it is >= not just >.
  899. X  This fixes a small bug with directories that were prerequisites of a target.
  900. X  If the directory was modified when the target was made it is quite possible
  901. X  they may have the same time-stamp.  This in general is not a good thing to
  902. X  do anyway.
  903. X
  904. - Modified $(mktmp ...) macro so that you can specify a file name.
  905. X
  906. X    $(mktmp[,[FILE][,TEXT]] data);
  907. X
  908. X  will put data into a file called Expand(FILE), if FILE contains
  909. X  $(TMPFILE) then a suitable temporary file name is generated and
  910. X  substituted.  The result value of the macro is the name of the tempfile
  911. X  or if TEXT is defined, is the result of Expand(TEXT).
  912. X
  913. X  Some examples are:
  914. X
  915. X    $(mktmp data)            ==> normal tmpfile
  916. X    $(mktmp,$(TMPFILE) data)    ==> normal tmpfile
  917. X    $(mktmp,, data)            ==> normal tmpfile
  918. X    $(mktmp,turboc.cfg $(CFLAGS))    ==> tmpfile named turboc.cfg
  919. X    $(mktmp,,$(TMPSHELL) data)    ==> normal tmpfile, named Expand(...)
  920. X    $(mktmp,,$(NULL) data)        ==> normal tmpfile, null result
  921. X
  922. - Modified making of .MAKEFILES special targets to make certain that
  923. X  it does not make a prerequisite of that target if the -n flag is specified.
  924. X
  925. - Changed statting of targets to match the functionality of .SETDIR a bit
  926. X  better.  When looking into a library and we have used .SETDIR to change
  927. X  directories, dmake will look into a relative current path, and if it
  928. X  does not find it, it will search a library found by prepending the value
  929. X  of the TMD macro to the path of the library file.
  930. X
  931. - Fixed the handling of :: and %-meta targets by ripping out the HOW internal
  932. X  data-structure, and by doing some interesting things with the cell dag.
  933. X  .UPDATEALL is now more comprehensive in its behaviour (might even be
  934. X  correct).  Sets of :: rules for a target return the timestamp for the target
  935. X  that resulted in it's being made.
  936. SHAR_EOF
  937. chmod 0640 dmake/readme/release ||
  938. echo 'restore of dmake/readme/release failed'
  939. Wc_c="`wc -c < 'dmake/readme/release'`"
  940. test 17984 -eq "$Wc_c" ||
  941.     echo 'dmake/readme/release: original size 17984, current size' "$Wc_c"
  942. rm -f _shar_wnt_.tmp
  943. fi
  944. # ============= dmake/rulparse.c ==============
  945. if test -f 'dmake/rulparse.c' -a X"$1" != X"-c"; then
  946.     echo 'x - skipping dmake/rulparse.c (File already exists)'
  947.     rm -f _shar_wnt_.tmp
  948. else
  949. > _shar_wnt_.tmp
  950. sed 's/^X//' << 'SHAR_EOF' > 'dmake/rulparse.c' &&
  951. /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/RCS/rulparse.c,v 1.1 91/05/06 15:23:26 dvadura Exp $
  952. -- SYNOPSIS -- perform semantic analysis on input
  953. -- 
  954. -- DESCRIPTION
  955. --    This code performs semantic analysis on the input, and builds
  956. --    the complex internal datastructure that is used to represent
  957. --    the user makefile.
  958. -- 
  959. -- AUTHOR
  960. --      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  961. --      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  962. --
  963. -- COPYRIGHT
  964. --      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  965. -- 
  966. --      This program is free software; you can redistribute it and/or
  967. --      modify it under the terms of the GNU General Public License
  968. --      (version 1), as published by the Free Software Foundation, and
  969. --      found in the file 'LICENSE' included with this distribution.
  970. -- 
  971. --      This program is distributed in the hope that it will be useful,
  972. --      but WITHOUT ANY WARRANTY; without even the implied warrant of
  973. --      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  974. --      GNU General Public License for more details.
  975. -- 
  976. --      You should have received a copy of the GNU General Public License
  977. --      along with this program;  if not, write to the Free Software
  978. --      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  979. --
  980. -- LOG
  981. --     $Log:    rulparse.c,v $
  982. X * Revision 1.1  91/05/06  15:23:26  dvadura
  983. X * dmake Release Version 3.7
  984. X * 
  985. */
  986. X
  987. #include "extern.h"
  988. X
  989. /* prototypes for local functions */
  990. static  void    _add_global_prereq ANSI((CELLPTR));
  991. static    void    _build_graph ANSI((int, CELLPTR, CELLPTR));
  992. static    char*    _build_meta ANSI((char*));
  993. static    int    _do_magic ANSI((int, char*, CELLPTR, CELLPTR, t_attr, char*));
  994. static    void    _do_special ANSI((int, int, t_attr,char*,CELLPTR,CELLPTR,int*));
  995. static    int    _do_targets ANSI((int, t_attr, char*, CELLPTR, CELLPTR));
  996. static    t_attr    _is_attribute ANSI((char*));
  997. static    int    _is_special ANSI((char*));
  998. static    char*    _is_magic ANSI((char*));
  999. static    int    _is_percent ANSI((char*));
  1000. static  CELLPTR _make_multi ANSI((CELLPTR));
  1001. static  CELLPTR _replace_cell ANSI((CELLPTR,CELLPTR,CELLPTR));
  1002. static    void    _set_attributes ANSI((t_attr, char*, CELLPTR ));
  1003. static    void    _stick_at_head ANSI((CELLPTR, CELLPTR));
  1004. static    void    _set_global_attr ANSI((t_attr));
  1005. X
  1006. /* static variables that must persist across invocation of Parse_rule_def */
  1007. static CELLPTR    _sv_targets = NIL(CELL);
  1008. static STRINGPTR  _sv_rules   = NIL(STRING);
  1009. static STRINGPTR  _sv_crule   = NIL(STRING);
  1010. static CELLPTR    _sv_edgel   = NIL(CELL);
  1011. static LINKPTR    _sv_glb_prq = NIL(LINK);
  1012. static int      _sp_target  = FALSE;
  1013. static t_attr     _sv_attr;
  1014. static t_attr     _sv_attro;
  1015. static int        _sv_flag;
  1016. static int      _sv_op;
  1017. static char      *_sv_setdir;
  1018. static char      _sv_globprq_only = 0;
  1019. X
  1020. /* Define for global attribute mask */
  1021. #define A_GLOB     (A_PRECIOUS | A_SILENT | A_IGNORE | A_EPILOG | A_SWAP |\
  1022. X          A_SHELL | A_PROLOG | A_NOINFER | A_SEQ | A_MKSARGS )
  1023. X
  1024. X
  1025. PUBLIC int
  1026. Parse_rule_def( state )/*
  1027. =========================
  1028. X   Parse the rule definition contained in Buffer, and modify the state 
  1029. X   if appropriate.  The function returns 0, if the definition is found to
  1030. SHAR_EOF
  1031. true || echo 'restore of dmake/rulparse.c failed'
  1032. fi
  1033. echo 'End of part 28, continue with part 29'
  1034. echo 29 > _shar_seq_.tmp
  1035. exit 0
  1036.  
  1037. exit 0 # Just in case...
  1038. -- 
  1039. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1040. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1041. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1042. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1043.