home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / perl / patch22 < prev    next >
Text File  |  1992-06-11  |  50KB  |  1,914 lines

  1. Newsgroups: comp.sources.misc
  2. From: lwall@netlabs.com (Larry Wall)
  3. Subject:  v30i033:  perl - The perl programming language, Patch22
  4. Message-ID: <1992Jun11.180156.29879@sparky.imd.sterling.com>
  5. X-Md4-Signature: a4f9af2c555f881298a086024a338c39
  6. Date: Thu, 11 Jun 1992 18:01:56 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: lwall@netlabs.com (Larry Wall)
  10. Posting-number: Volume 30, Issue 33
  11. Archive-name: perl/patch22
  12. Environment: UNIX, MS-DOS, OS2
  13. Patch-To: perl: Volume 18, Issue 19-54
  14.  
  15. System: perl version 4.0
  16. Patch #: 22
  17. Priority: highish
  18. Subject: patch #20, continued
  19.  
  20. Description:
  21.     See patch #20.
  22.  
  23. Fix:    From rn, say "| patch -p -N -d DIR", where DIR is your perl source
  24.     directory.  Outside of rn, say "cd DIR; patch -p -N <thisarticle".
  25.     If you don't have the patch program, apply the following by hand,
  26.     or get patch (version 2.0, latest patchlevel).
  27.  
  28.     After patching:
  29.         *** DO NOTHING--INSTALL ALL PATCHES UP THROUGH #33 FIRST ***
  30.  
  31.     If patch indicates that patchlevel is the wrong version, you may need
  32.     to apply one or more previous patches, or the patch may already
  33.     have been applied.  See the patchlevel.h file to find out what has or
  34.     has not been applied.  In any event, don't continue with the patch.
  35.  
  36.     If you are missing previous patches they can be obtained from me:
  37.  
  38.     Larry Wall
  39.     lwall@netlabs.com
  40.  
  41.     If you send a mail message of the following form it will greatly speed
  42.     processing:
  43.  
  44.     Subject: Command
  45.     @SH mailpatch PATH perl 4.0 LIST
  46.            ^ note the c
  47.  
  48.     where PATH is a return path FROM ME TO YOU either in Internet notation,
  49.     or in bang notation from some well-known host, and LIST is the number
  50.     of one or more patches you need, separated by spaces, commas, and/or
  51.     hyphens.  Saying 35- says everything from 35 to the end.
  52.  
  53.  
  54. Index: patchlevel.h
  55. Prereq: 21
  56. 1c1
  57. < #define PATCHLEVEL 21
  58. ---
  59. > #define PATCHLEVEL 22
  60.  
  61. Index: atarist/atarist.c
  62. *** atarist/atarist.c.old    Mon Jun  8 17:35:03 1992
  63. --- atarist/atarist.c    Mon Jun  8 17:35:05 1992
  64. ***************
  65. *** 0 ****
  66. --- 1,282 ----
  67. + /*
  68. +  * random stuff for atariST
  69. +  */
  70. + #include "EXTERN.h"
  71. + #include "perl.h"
  72. + /* call back stuff, atari specific stuff below */
  73. + /* Be sure to refetch the stack pointer after calling these routines. */
  74. + int
  75. + callback(subname, sp, gimme, hasargs, numargs)
  76. + char *subname;
  77. + int sp;            /* stack pointer after args are pushed */
  78. + int gimme;        /* called in array or scalar context */
  79. + int hasargs;        /* whether to create a @_ array for routine */
  80. + int numargs;        /* how many args are pushed on the stack */
  81. + {
  82. +     static ARG myarg[3];    /* fake syntax tree node */
  83. +     int arglast[3];
  84. +     
  85. +     arglast[2] = sp;
  86. +     sp -= numargs;
  87. +     arglast[1] = sp--;
  88. +     arglast[0] = sp;
  89. +     if (!myarg[0].arg_ptr.arg_str)
  90. +     myarg[0].arg_ptr.arg_str = str_make("",0);
  91. +     myarg[1].arg_type = A_WORD;
  92. +     myarg[1].arg_ptr.arg_stab = stabent(subname, FALSE);
  93. +     myarg[2].arg_type = hasargs ? A_EXPR : A_NULL;
  94. +     return do_subr(myarg, gimme, arglast);
  95. + }
  96. + int
  97. + callv(subname, sp, gimme, argv)
  98. + char *subname;
  99. + register int sp;    /* current stack pointer */
  100. + int gimme;        /* called in array or scalar context */
  101. + register char **argv;    /* null terminated arg list, NULL for no arglist */
  102. + {
  103. +     register int items = 0;
  104. +     int hasargs = (argv != 0);
  105. +     astore(stack, ++sp, Nullstr);    /* reserve spot for 1st return arg */
  106. +     if (hasargs) {
  107. +     while (*argv) {
  108. +         astore(stack, ++sp, str_2mortal(str_make(*argv,0)));
  109. +         items++;
  110. +         argv++;
  111. +     }
  112. +     }
  113. +     return callback(subname, sp, gimme, hasargs, items);
  114. + }
  115. + #include <process.h>
  116. + #include <stdio.h>
  117. + long _stksize = 64*1024L;
  118. + unsigned long __DEFAULT_BUFSIZ__ = 4 * 1024L;
  119. + /*
  120. +  * The following code is based on the do_exec and do_aexec functions
  121. +  * in file doio.c
  122. +  */
  123. + int
  124. + do_aspawn(really,arglast)
  125. + STR *really;
  126. + int *arglast;
  127. + {
  128. +     register STR **st = stack->ary_array;
  129. +     register int sp = arglast[1];
  130. +     register int items = arglast[2] - sp;
  131. +     register char **a;
  132. +     char **argv;
  133. +     char *tmps;
  134. +     int status;
  135. +     if (items) {
  136. +     New(1101,argv, items+1, char*);
  137. +     a = argv;
  138. +     for (st += ++sp; items > 0; items--,st++) {
  139. +         if (*st)
  140. +         *a++ = str_get(*st);
  141. +         else
  142. +         *a++ = "";
  143. +     }
  144. +     *a = Nullch;
  145. +     if (really && *(tmps = str_get(really)))
  146. +         status = spawnvp(-P_WAIT,tmps,argv); /* -P_WAIT is a hack, see spawnvp.c in the lib */
  147. +     else
  148. +         status = spawnvp(-P_WAIT,argv[0],argv);
  149. +     Safefree(argv);
  150. +     }
  151. +     return status;
  152. + }
  153. + int
  154. + do_spawn(cmd)
  155. + char *cmd;
  156. + {
  157. +     return system(cmd);
  158. + }
  159. + #if 0 /* patchlevel 79 onwards we can */
  160. + /*
  161. +  * we unfortunately cannot use the super efficient fread/write from the lib
  162. +  */
  163. + size_t fread(void *data, size_t size, size_t count, FILE *fp)
  164. + {
  165. +     size_t i, j;
  166. +     unsigned char *buf = (unsigned char *)data;
  167. +     int c;
  168. +     for(i = 0; i < count; i++)
  169. +     {
  170. +     for(j = 0; j < size; j++)
  171. +     {
  172. +         if((c = getc(fp)) == EOF)
  173. +            return 0;
  174. +         *buf++ = c;
  175. +         }
  176. +     }
  177. +     return i;
  178. + }
  179. + size_t fwrite(const void *data, size_t size, size_t count, FILE *fp)
  180. + {
  181. +     size_t i, j;
  182. +     const unsigned char *buf = (const unsigned char *)data;
  183. +     for(i = 0; i < count; i++)
  184. +     {
  185. +     for(j = 0; j < size; j++)
  186. +     {
  187. +         if(fputc(*buf++, fp) == EOF)
  188. +            return 0;
  189. +         }
  190. +     }
  191. +     return i;
  192. + }
  193. + #endif
  194. + #ifdef HAS_SYSCALL
  195. + #define __NO_INLINE__
  196. + #include <osbind.h> /* must include this for proper protos */
  197. + /* these must match osbind.pl */
  198. + #define TRAP_1_W        1
  199. + #define TRAP_1_WW        2
  200. + #define TRAP_1_WL        3
  201. + #define TRAP_1_WLW        4
  202. + #define TRAP_1_WWW        5
  203. + #define TRAP_1_WLL        6
  204. + #define TRAP_1_WWLL        7
  205. + #define TRAP_1_WLWW        8
  206. + #define TRAP_1_WWLLL        9
  207. + #define TRAP_13_W        10
  208. + #define TRAP_13_WW        11
  209. + #define TRAP_13_WL        12
  210. + #define TRAP_13_WWW        13
  211. + #define TRAP_13_WWL        14
  212. + #define TRAP_13_WWLWWW        15
  213. + #define TRAP_14_W        16
  214. + #define TRAP_14_WW        17
  215. + #define TRAP_14_WL        18
  216. + #define TRAP_14_WWW        19
  217. + #define TRAP_14_WWL        20
  218. + #define TRAP_14_WWLL        21
  219. + #define TRAP_14_WLLW        22
  220. + #define TRAP_14_WLLL        23
  221. + #define TRAP_14_WWWL        24
  222. + #define TRAP_14_WWWWL        25
  223. + #define TRAP_14_WLLWW        26
  224. + #define TRAP_14_WWWWWWW        27
  225. + #define TRAP_14_WLLWWWWW    28
  226. + #define TRAP_14_WLLWWWWLW    29
  227. + #define TRAP_14_WLLWWWWWLW    30
  228. + int syscall(trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )
  229. + unsigned long trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
  230. + {
  231. +   /* for now */
  232. +   switch(trap)
  233. +   {
  234. +     case TRAP_1_W:
  235. +       return trap_1_w(fn);
  236. +       
  237. +     case TRAP_1_WW:
  238. +       return trap_1_ww(fn, a1);
  239. +       
  240. +     case TRAP_1_WL:
  241. +       return trap_1_wl(fn, a1);
  242. +       
  243. +     case TRAP_1_WLW:
  244. +       return trap_1_wlw(fn, a1, a2);
  245. +       
  246. +     case TRAP_1_WWW:
  247. +       return trap_1_www(fn, a1, a2);
  248. +       
  249. +     case TRAP_1_WLL:
  250. +       return trap_1_wll(fn, a1, a2);
  251. +       
  252. +     case TRAP_1_WWLL:
  253. +       return trap_1_wwll(fn, a1, a2, a3);
  254. +       
  255. +     case TRAP_1_WLWW:
  256. +       return trap_1_wlww(fn, a1, a2, a3);
  257. +       
  258. +     case TRAP_1_WWLLL:
  259. +       return trap_1_wwlll(fn, a1, a2, a3, a4);
  260. +       
  261. +     case TRAP_13_W:
  262. +       return trap_13_w(fn);
  263. +       
  264. +     case TRAP_13_WW:
  265. +       return trap_13_ww(fn, a1);
  266. +       
  267. +     case TRAP_13_WL:
  268. +       return trap_13_wl(fn, a1);
  269. +       
  270. +     case TRAP_13_WWW:
  271. +       return trap_13_www(fn, a1, a2);
  272. +       
  273. +     case TRAP_13_WWL:
  274. +       return trap_13_wwl(fn, a1, a2);
  275. +       
  276. +     case TRAP_13_WWLWWW:
  277. +       return trap_13_wwlwww(fn, a1, a2, a3, a4, a5);
  278. +       
  279. +     case TRAP_14_W:
  280. +       return trap_14_w(fn);
  281. +       
  282. +     case TRAP_14_WW:
  283. +       return trap_14_ww(fn, a1);
  284. +       
  285. +     case TRAP_14_WL:
  286. +       return trap_14_wl(fn, a1);
  287. +       
  288. +     case TRAP_14_WWW:
  289. +       return trap_14_www(fn, a1, a2);
  290. +       
  291. +     case TRAP_14_WWL:
  292. +       return trap_14_wwl(fn, a1, a2);
  293. +       
  294. +     case TRAP_14_WWLL:
  295. +       return trap_14_wwll(fn, a1, a2, a3);
  296. +       
  297. +     case TRAP_14_WLLW:
  298. +       return trap_14_wllw(fn, a1, a2, a3);
  299. +       
  300. +     case TRAP_14_WLLL:
  301. +       return trap_14_wlll(fn, a1, a2, a3);
  302. +       
  303. +     case TRAP_14_WWWL:
  304. +       return trap_14_wwwl(fn, a1, a2, a3);
  305. +       
  306. +     case TRAP_14_WWWWL:
  307. +       return trap_14_wwwwl(fn, a1, a2, a3, a4);
  308. +       
  309. +     case TRAP_14_WLLWW:
  310. +       return trap_14_wllww(fn, a1, a2, a3, a4);
  311. +       
  312. +     case TRAP_14_WWWWWWW:
  313. +       return trap_14_wwwwwww(fn, a1, a2, a3, a4, a5, a6);
  314. +       
  315. +     case TRAP_14_WLLWWWWW:
  316. +       return trap_14_wllwwwww(fn, a1, a2, a3, a4, a5, a6, a7);
  317. +       
  318. +     case TRAP_14_WLLWWWWLW:
  319. +       return trap_14_wllwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8);
  320. +       
  321. +     case TRAP_14_WLLWWWWWLW:
  322. +       return trap_14_wllwwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9);
  323. +   }      
  324. + }
  325. + #endif
  326.  
  327. Index: lib/bigfloat.pl
  328. *** lib/bigfloat.pl.old    Mon Jun  8 17:48:39 1992
  329. --- lib/bigfloat.pl    Mon Jun  8 17:48:39 1992
  330. ***************
  331. *** 1,8 ****
  332.   package bigfloat;
  333.   require "bigint.pl";
  334.   # Arbitrary length float math package
  335.   #
  336.   # number format
  337.   #   canonical strings have the form /[+-]\d+E[+-]\d+/
  338.   #   Input values can have inbedded whitespace
  339. --- 1,9 ----
  340.   package bigfloat;
  341.   require "bigint.pl";
  342.   # Arbitrary length float math package
  343.   #
  344. + # by Mark Biggar
  345. + #
  346.   # number format
  347.   #   canonical strings have the form /[+-]\d+E[+-]\d+/
  348.   #   Input values can have inbedded whitespace
  349. ***************
  350. *** 66,72 ****
  351.   # negation
  352.   sub main'fneg { #(fnum_str) return fnum_str
  353.       local($_) = &'fnorm($_[0]);
  354. !     substr($_,0,1) =~ tr/+-/-+/ if ($_ ne '+0E+0'); # flip sign
  355.       $_;
  356.   }
  357.   
  358. --- 67,74 ----
  359.   # negation
  360.   sub main'fneg { #(fnum_str) return fnum_str
  361.       local($_) = &'fnorm($_[0]);
  362. !     vec($_,0,8) =^ ord('+') ^ ord('-') unless $_ eq '+0E+0'; # flip sign
  363. !     s/^H/N/;
  364.       $_;
  365.   }
  366.   
  367. ***************
  368. *** 73,79 ****
  369.   # absolute value
  370.   sub main'fabs { #(fnum_str) return fnum_str
  371.       local($_) = &'fnorm($_[0]);
  372. !     substr($_,0,1) = '+' unless $_ eq 'NaN';                       # mash sign
  373.       $_;
  374.   }
  375.   
  376. --- 75,81 ----
  377.   # absolute value
  378.   sub main'fabs { #(fnum_str) return fnum_str
  379.       local($_) = &'fnorm($_[0]);
  380. !     s/^-/+/;                               # mash sign
  381.       $_;
  382.   }
  383.   
  384. ***************
  385. *** 198,215 ****
  386.       local($x, $y) = (&'fnorm($_[0]),&'fnorm($_[1]));
  387.       if ($x eq "NaN" || $y eq "NaN") {
  388.       undef;
  389. -     } elsif ($x eq $y) {
  390. -     0;
  391. -     } elsif (ord($x) != ord($y)) {
  392. -     (ord($y) - ord($x));                # based on signs
  393.       } else {
  394. !     local($xm,$xe) = split('E',$x);
  395. !     local($ym,$ye) = split('E',$y);
  396. !     if ($xe ne $ye) {
  397. !         ($xe - $ye) * (substr($x,0,1).'1');
  398. !     } else {
  399. !         &bigint'cmp($xm,$ym);           # based on value
  400. !     }
  401.       }
  402.   }
  403.   
  404. --- 200,212 ----
  405.       local($x, $y) = (&'fnorm($_[0]),&'fnorm($_[1]));
  406.       if ($x eq "NaN" || $y eq "NaN") {
  407.       undef;
  408.       } else {
  409. !     ord($y) <=> ord($x)
  410. !     ||
  411. !     (  local($xm,$xe,$ym,$ye) = split('E', $x."E$y"),
  412. !          (($xe <=> $ye) * (substr($x,0,1).'1')
  413. !              || &bigint'cmp($xm,$ym))
  414. !     );
  415.       }
  416.   }
  417.   
  418.  
  419. Index: lib/bigint.pl
  420. *** lib/bigint.pl.old    Mon Jun  8 17:48:42 1992
  421. --- lib/bigint.pl    Mon Jun  8 17:48:42 1992
  422. ***************
  423. *** 138,156 ****
  424.   # GCD -- Euclids algorithm Knuth Vol 2 pg 296
  425.   sub main'bgcd { #(num_str, num_str) return num_str
  426.       local($x,$y) = (&'bnorm($_[0]),&'bnorm($_[1]));
  427. !     if ($x eq 'NaN') {
  428.       'NaN';
  429. !     }
  430. !     elsif ($y eq 'NaN') {
  431. !     'NaN';
  432. !     }
  433. !     else {
  434.       ($x, $y) = ($y,&'bmod($x,$y)) while $y ne '+0';
  435.       $x;
  436.       }
  437.   }
  438.   
  439. ! # routine to add two base 100000 numbers
  440.   #   stolen from Knuth Vol 2 Algorithm A pg 231
  441.   #   there are separate routines to add and sub as per Kunth pg 233
  442.   sub add { #(int_num_array, int_num_array) return int_num_array
  443. --- 138,152 ----
  444.   # GCD -- Euclids algorithm Knuth Vol 2 pg 296
  445.   sub main'bgcd { #(num_str, num_str) return num_str
  446.       local($x,$y) = (&'bnorm($_[0]),&'bnorm($_[1]));
  447. !     if ($x eq 'NaN' || $y eq 'NaN') {
  448.       'NaN';
  449. !     } else {
  450.       ($x, $y) = ($y,&'bmod($x,$y)) while $y ne '+0';
  451.       $x;
  452.       }
  453.   }
  454.   
  455. ! # routine to add two base 1e5 numbers
  456.   #   stolen from Knuth Vol 2 Algorithm A pg 231
  457.   #   there are separate routines to add and sub as per Kunth pg 233
  458.   sub add { #(int_num_array, int_num_array) return int_num_array
  459. ***************
  460. *** 158,179 ****
  461.       $car = 0;
  462.       for $x (@x) {
  463.       last unless @y || $car;
  464. !     $x -= 100000 if $car = (($x += shift @y + $car) >= 100000);
  465.       }
  466.       for $y (@y) {
  467.       last unless $car;
  468. !     $y -= 100000 if $car = (($y += $car) >= 100000);
  469.       }
  470.       (@x, @y, $car);
  471.   }
  472.   
  473. ! # subtract base 100000 numbers -- stolen from Knuth Vol 2 pg 232, $x > $y
  474.   sub sub { #(int_num_array, int_num_array) return int_num_array
  475.       local(*sx, *sy) = @_;
  476.       $bar = 0;
  477.       for $sx (@sx) {
  478.       last unless @y || $bar;
  479. !     $sx += 100000 if $bar = (($sx -= shift @sy + $bar) < 0);
  480.       }
  481.       @sx;
  482.   }
  483. --- 154,175 ----
  484.       $car = 0;
  485.       for $x (@x) {
  486.       last unless @y || $car;
  487. !     $x -= 1e5 if $car = (($x += shift @y + $car) >= 1e5);
  488.       }
  489.       for $y (@y) {
  490.       last unless $car;
  491. !     $y -= 1e5 if $car = (($y += $car) >= 1e5);
  492.       }
  493.       (@x, @y, $car);
  494.   }
  495.   
  496. ! # subtract base 1e5 numbers -- stolen from Knuth Vol 2 pg 232, $x > $y
  497.   sub sub { #(int_num_array, int_num_array) return int_num_array
  498.       local(*sx, *sy) = @_;
  499.       $bar = 0;
  500.       for $sx (@sx) {
  501.       last unless @y || $bar;
  502. !     $sx += 1e5 if $bar = (($sx -= shift @sy + $bar) < 0);
  503.       }
  504.       @sx;
  505.   }
  506. ***************
  507. *** 195,201 ****
  508.           for $y (@y) {
  509.           $prod = $x * $y + $prod[$cty] + $car;
  510.           $prod[$cty++] =
  511. !             $prod - ($car = int($prod * (1/100000))) * 100000;
  512.           }
  513.           $prod[$cty] += $car if $car;
  514.           $x = shift @prod;
  515. --- 191,197 ----
  516.           for $y (@y) {
  517.           $prod = $x * $y + $prod[$cty] + $car;
  518.           $prod[$cty++] =
  519. !             $prod - ($car = int($prod * 1e-5)) * 1e5;
  520.           }
  521.           $prod[$cty] += $car if $car;
  522.           $x = shift @prod;
  523. ***************
  524. *** 218,232 ****
  525.       $srem = $y[0];
  526.       $sr = (shift @x ne shift @y) ? '-' : '+';
  527.       $car = $bar = $prd = 0;
  528. !     if (($dd = int(100000/($y[$#y]+1))) != 1) {
  529.       for $x (@x) {
  530.           $x = $x * $dd + $car;
  531. !         $x -= ($car = int($x * (1/100000))) * 100000;
  532.       }
  533.       push(@x, $car); $car = 0;
  534.       for $y (@y) {
  535.           $y = $y * $dd + $car;
  536. !         $y -= ($car = int($y * (1/100000))) * 100000;
  537.       }
  538.       }
  539.       else {
  540. --- 214,228 ----
  541.       $srem = $y[0];
  542.       $sr = (shift @x ne shift @y) ? '-' : '+';
  543.       $car = $bar = $prd = 0;
  544. !     if (($dd = int(1e5/($y[$#y]+1))) != 1) {
  545.       for $x (@x) {
  546.           $x = $x * $dd + $car;
  547. !         $x -= ($car = int($x * 1e-5)) * 1e5;
  548.       }
  549.       push(@x, $car); $car = 0;
  550.       for $y (@y) {
  551.           $y = $y * $dd + $car;
  552. !         $y -= ($car = int($y * 1e-5)) * 1e5;
  553.       }
  554.       }
  555.       else {
  556. ***************
  557. *** 235,254 ****
  558.       @q = (); ($v2,$v1) = @y[$#y-1,$#y];
  559.       while ($#x > $#y) {
  560.       ($u2,$u1,$u0) = @x[($#x-2)..$#x];
  561. !     $q = (($u0 == $v1) ? 99999 : int(($u0*100000+$u1)/$v1));
  562. !     --$q while ($v2*$q > ($u0*100000+$u1-$q*$v1)*100000+$u2);
  563.       if ($q) {
  564.           ($car, $bar) = (0,0);
  565.           for ($y = 0, $x = $#x-$#y-1; $y <= $#y; ++$y,++$x) {
  566.           $prd = $q * $y[$y] + $car;
  567. !         $prd -= ($car = int($prd * (1/100000))) * 100000;
  568. !         $x[$x] += 100000 if ($bar = (($x[$x] -= $prd + $bar) < 0));
  569.           }
  570.           if ($x[$#x] < $car + $bar) {
  571.           $car = 0; --$q;
  572.           for ($y = 0, $x = $#x-$#y-1; $y <= $#y; ++$y,++$x) {
  573. !             $x[$x] -= 100000
  574. !             if ($car = (($x[$x] += $y[$y] + $car) > 100000));
  575.           }
  576.           }   
  577.       }
  578. --- 231,250 ----
  579.       @q = (); ($v2,$v1) = @y[$#y-1,$#y];
  580.       while ($#x > $#y) {
  581.       ($u2,$u1,$u0) = @x[($#x-2)..$#x];
  582. !     $q = (($u0 == $v1) ? 99999 : int(($u0*1e5+$u1)/$v1));
  583. !     --$q while ($v2*$q > ($u0*1e5+$u1-$q*$v1)*1e5+$u2);
  584.       if ($q) {
  585.           ($car, $bar) = (0,0);
  586.           for ($y = 0, $x = $#x-$#y-1; $y <= $#y; ++$y,++$x) {
  587.           $prd = $q * $y[$y] + $car;
  588. !         $prd -= ($car = int($prd * 1e-5)) * 1e5;
  589. !         $x[$x] += 1e5 if ($bar = (($x[$x] -= $prd + $bar) < 0));
  590.           }
  591.           if ($x[$#x] < $car + $bar) {
  592.           $car = 0; --$q;
  593.           for ($y = 0, $x = $#x-$#y-1; $y <= $#y; ++$y,++$x) {
  594. !             $x[$x] -= 1e5
  595. !             if ($car = (($x[$x] += $y[$y] + $car) > 1e5));
  596.           }
  597.           }   
  598.       }
  599. ***************
  600. *** 259,265 ****
  601.       if ($dd != 1) {
  602.           $car = 0;
  603.           for $x (reverse @x) {
  604. !         $prd = $car * 100000 + $x;
  605.           $car = $prd - ($tmp = int($prd / $dd)) * $dd;
  606.           unshift(@d, $tmp);
  607.           }
  608. --- 255,261 ----
  609.       if ($dd != 1) {
  610.           $car = 0;
  611.           for $x (reverse @x) {
  612. !         $prd = $car * 1e5 + $x;
  613.           $car = $prd - ($tmp = int($prd / $dd)) * $dd;
  614.           unshift(@d, $tmp);
  615.           }
  616.  
  617. Index: usub/bsdcurses.mus
  618. *** usub/bsdcurses.mus.old    Mon Jun  8 17:52:25 1992
  619. --- usub/bsdcurses.mus    Mon Jun  8 17:52:26 1992
  620. ***************
  621. *** 1,6 ****
  622. ! /* $RCSfile: bsdcurses.mus,v $$Revision: 4.0.1.1 $$Date: 91/11/05 19:04:53 $
  623.    *
  624.    * $Log:    bsdcurses.mus,v $
  625.    * Revision 4.0.1.1  91/11/05  19:04:53  lwall
  626.    * initial checkin
  627.    * 
  628. --- 1,9 ----
  629. ! /* $RCSfile: bsdcurses.mus,v $$Revision: 4.0.1.2 $$Date: 92/06/08 16:05:28 $
  630.    *
  631.    * $Log:    bsdcurses.mus,v $
  632. +  * Revision 4.0.1.2  92/06/08  16:05:28  lwall
  633. +  * patch20: &getcap eventually dumped core in bsdcurses
  634. +  * 
  635.    * Revision 4.0.1.1  91/11/05  19:04:53  lwall
  636.    * initial checkin
  637.    * 
  638. ***************
  639. *** 476,484 ****
  640.   CASE int erasechar
  641.   END
  642.   
  643. ! CASE char* getcap
  644. ! I    char*        str
  645. ! END
  646.   
  647.       case US_getyx:
  648.       if (items != 3)
  649. --- 479,496 ----
  650.   CASE int erasechar
  651.   END
  652.   
  653. !     case US_getcap:
  654. !     if (items != 1)
  655. !         fatal("Usage: &getcap($str)");
  656. !     else {
  657. !         char* retval;
  658. !         char*    str =        (char*)        str_get(st[1]);
  659. !         char output[50], *outputp = output;
  660. !         retval = tgetstr(str, &outputp);
  661. !         str_set(st[0], (char*) retval);
  662. !     }
  663. !     return sp;
  664.   
  665.       case US_getyx:
  666.       if (items != 3)
  667.  
  668. Index: c2ph.SH
  669. *** c2ph.SH.old    Mon Jun  8 17:45:44 1992
  670. --- c2ph.SH    Mon Jun  8 17:45:45 1992
  671. ***************
  672. *** 19,24 ****
  673. --- 19,25 ----
  674.   : Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
  675.   : Protect any dollar signs and backticks that you do not want interpreted
  676.   : by putting a backslash in front.  You may delete these comments.
  677. + rm -f c2ph
  678.   $spitshell >c2ph <<!GROK!THIS!
  679.   #!$bin/perl
  680.   #
  681. ***************
  682. *** 36,42 ****
  683.   #   See the usage message for more.  If this isn't enough, read the code.
  684.   #
  685.   
  686. ! $RCSID = '$RCSfile: c2ph.SH,v $$Revision: 4.0.1.1 $$Date: 91/11/05 16:02:29 $';
  687.   
  688.   
  689.   ######################################################################
  690. --- 37,43 ----
  691.   #   See the usage message for more.  If this isn't enough, read the code.
  692.   #
  693.   
  694. ! $RCSID = '$RCSfile: c2ph.SH,v $$Revision: 4.0.1.2 $$Date: 92/06/08 11:56:08 $';
  695.   
  696.   
  697.   ######################################################################
  698.  
  699. Index: atarist/test/ccon
  700. *** atarist/test/ccon.old    Mon Jun  8 17:44:56 1992
  701. --- atarist/test/ccon    Mon Jun  8 17:44:56 1992
  702. ***************
  703. *** 0 ****
  704. --- 1,5 ----
  705. + require 'osbind.pl';
  706. +  &Cconws("Hello World\r\n");
  707. +  $str = "This is a string being printed by Fwrite Gemdos trap\r\n";
  708. +  &Fwrite(1, length($str), $str);
  709.  
  710. Index: cflags.SH
  711. *** cflags.SH.old    Mon Jun  8 17:45:49 1992
  712. --- cflags.SH    Mon Jun  8 17:45:50 1992
  713. ***************
  714. *** 19,24 ****
  715. --- 19,25 ----
  716.   : Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
  717.   : Protect any dollar signs and backticks that you do not want interpreted
  718.   : by putting a backslash in front.  You may delete these comments.
  719. + rm -f cflags
  720.   $spitshell >cflags <<!GROK!THIS!
  721.   !GROK!THIS!
  722.   
  723.  
  724. Index: x2p/cflags.SH
  725. *** x2p/cflags.SH.old    Mon Jun  8 17:52:53 1992
  726. --- x2p/cflags.SH    Mon Jun  8 17:52:53 1992
  727. ***************
  728. *** 19,24 ****
  729. --- 19,25 ----
  730.   : Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
  731.   : Protect any dollar signs and backticks that you do not want interpreted
  732.   : by putting a backslash in front.  You may delete these comments.
  733. + rm -f cflags
  734.   $spitshell >cflags <<!GROK!THIS!
  735.   !GROK!THIS!
  736.   
  737.  
  738. Index: lib/chat2.pl
  739. *** lib/chat2.pl.old    Mon Jun  8 17:48:49 1992
  740. --- lib/chat2.pl    Mon Jun  8 17:48:49 1992
  741. ***************
  742. *** 108,113 ****
  743. --- 108,114 ----
  744.           die "Cannot exec @cmd: $!";
  745.       }
  746.       close(TTY);
  747. +     $PID{$next} = $pid;
  748.       $next; # return symbol for switcharound
  749.   }
  750.   
  751. ***************
  752. *** 258,267 ****
  753. --- 259,273 ----
  754.   ## like close $handle
  755.   
  756.   sub close { ## public
  757. +     local($pid);
  758.       if ($_[0] =~ /$nextpat/) {
  759. +         $pid = $PID{$_[0]};
  760.            *S = shift;
  761. +     } else {
  762. +         $pid = $PID{$next};
  763.       }
  764.       close(S);
  765. +     waitpid($pid,0);
  766.       if (defined $S{"needs_close"}) { # is it a listen socket?
  767.           local(*NS) = $S{"needs_close"};
  768.           delete $S{"needs_close"};
  769.  
  770. Index: cmd.c
  771. *** cmd.c.old    Mon Jun  8 17:45:54 1992
  772. --- cmd.c    Mon Jun  8 17:45:55 1992
  773. ***************
  774. *** 1,4 ****
  775. ! /* $RCSfile: cmd.c,v $$Revision: 4.0.1.4 $$Date: 91/11/11 16:29:33 $
  776.    *
  777.    *    Copyright (c) 1991, Larry Wall
  778.    *
  779. --- 1,4 ----
  780. ! /* $RCSfile: cmd.c,v $$Revision: 4.0.1.5 $$Date: 92/06/08 12:00:39 $
  781.    *
  782.    *    Copyright (c) 1991, Larry Wall
  783.    *
  784. ***************
  785. *** 6,11 ****
  786. --- 6,15 ----
  787.    *    License or the Artistic License, as specified in the README file.
  788.    *
  789.    * $Log:    cmd.c,v $
  790. +  * Revision 4.0.1.5  92/06/08  12:00:39  lwall
  791. +  * patch20: the switch optimizer didn't do anything in subroutines
  792. +  * patch20: removed implicit int declarations on funcions
  793. +  * 
  794.    * Revision 4.0.1.4  91/11/11  16:29:33  lwall
  795.    * patch19: do {$foo ne "bar";} returned wrong value
  796.    * patch19: some earlier patches weren't propagated to alternate 286 code
  797. ***************
  798. *** 34,40 ****
  799.   #  include <varargs.h>
  800.   #endif
  801.   
  802. ! static STR str_chop;
  803.   
  804.   void grow_dlevel();
  805.   
  806. --- 38,44 ----
  807.   #  include <varargs.h>
  808.   #endif
  809.   
  810. ! static STR strchop;
  811.   
  812.   void grow_dlevel();
  813.   
  814. ***************
  815. *** 81,86 ****
  816. --- 85,94 ----
  817.   tail_recursion_entry:
  818.   #ifdef DEBUGGING
  819.       dlevel = entdlevel;
  820. +     if (debug & 4)
  821. +     deb("mortals = (%d/%d) stack, = (%d/%d)\n",
  822. +         tmps_max, tmps_base,
  823. +         savestack->ary_fill, firstsave);
  824.   #endif
  825.   #ifdef TAINT
  826.       tainted = 0;    /* Each statement is presumed innocent */
  827. ***************
  828. *** 575,586 ****
  829.           match = (retstr->str_cur != 0);
  830.           tmps = str_get(retstr);
  831.           tmps += retstr->str_cur - match;
  832. !         str_nset(&str_chop,tmps,match);
  833.           *tmps = '\0';
  834.           retstr->str_nok = 0;
  835.           retstr->str_cur = tmps - retstr->str_ptr;
  836.           STABSET(retstr);
  837. !         retstr = &str_chop;
  838.           goto flipmaybe;
  839.       case CFT_ARRAY:
  840.           match = cmd->c_short->str_u.str_useful; /* just to get register */
  841. --- 583,594 ----
  842.           match = (retstr->str_cur != 0);
  843.           tmps = str_get(retstr);
  844.           tmps += retstr->str_cur - match;
  845. !         str_nset(&strchop,tmps,match);
  846.           *tmps = '\0';
  847.           retstr->str_nok = 0;
  848.           retstr->str_cur = tmps - retstr->str_ptr;
  849.           STABSET(retstr);
  850. !         retstr = &strchop;
  851.           goto flipmaybe;
  852.       case CFT_ARRAY:
  853.           match = cmd->c_short->str_u.str_useful; /* just to get register */
  854. ***************
  855. *** 728,733 ****
  856. --- 736,745 ----
  857.       }
  858.       goto doswitch;
  859.       case C_CSWITCH:
  860. +     if (multiline) {
  861. +         cmd = cmd->c_next;            /* can't assume anything */
  862. +         goto tail_recursion_entry;
  863. +     }
  864.       match = *(str_get(STAB_STR(cmd->c_stab))) & 255;
  865.         doswitch:
  866.       match -= cmd->ucmd.scmd.sc_offset;
  867. ***************
  868. *** 942,948 ****
  869.   #ifdef DEBUGGING
  870.   #  ifndef I_VARARGS
  871.   /*VARARGS1*/
  872. ! deb(pat,a1,a2,a3,a4,a5,a6,a7,a8)
  873.   char *pat;
  874.   {
  875.       register int i;
  876. --- 954,960 ----
  877.   #ifdef DEBUGGING
  878.   #  ifndef I_VARARGS
  879.   /*VARARGS1*/
  880. ! void deb(pat,a1,a2,a3,a4,a5,a6,a7,a8)
  881.   char *pat;
  882.   {
  883.       register int i;
  884. ***************
  885. *** 954,960 ****
  886.   }
  887.   #  else
  888.   /*VARARGS1*/
  889. ! deb(va_alist)
  890.   va_dcl
  891.   {
  892.       va_list args;
  893. --- 966,972 ----
  894.   }
  895.   #  else
  896.   /*VARARGS1*/
  897. ! void deb(va_alist)
  898.   va_dcl
  899.   {
  900.       va_list args;
  901. ***************
  902. *** 973,978 ****
  903. --- 985,991 ----
  904.   #  endif
  905.   #endif
  906.   
  907. + int
  908.   copyopt(cmd,which)
  909.   register CMD *cmd;
  910.   register CMD *which;
  911.  
  912. Index: cmd.h
  913. *** cmd.h.old    Mon Jun  8 17:46:02 1992
  914. --- cmd.h    Mon Jun  8 17:46:02 1992
  915. ***************
  916. *** 1,4 ****
  917. ! /* $RCSfile: cmd.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 10:28:50 $
  918.    *
  919.    *    Copyright (c) 1991, Larry Wall
  920.    *
  921. --- 1,4 ----
  922. ! /* $RCSfile: cmd.h,v $$Revision: 4.0.1.2 $$Date: 92/06/08 12:01:02 $
  923.    *
  924.    *    Copyright (c) 1991, Larry Wall
  925.    *
  926. ***************
  927. *** 6,11 ****
  928. --- 6,14 ----
  929.    *    License or the Artistic License, as specified in the README file.
  930.    *
  931.    * $Log:    cmd.h,v $
  932. +  * Revision 4.0.1.2  92/06/08  12:01:02  lwall
  933. +  * patch20: removed implicit int declarations on funcions
  934. +  * 
  935.    * Revision 4.0.1.1  91/06/07  10:28:50  lwall
  936.    * patch4: new copyright notice
  937.    * patch4: length($`), length($&), length($') now optimized to avoid string copy
  938. ***************
  939. *** 167,169 ****
  940. --- 170,176 ----
  941.   void opt_arg();
  942.   ARG* evalstatic();
  943.   int cmd_exec();
  944. + #ifdef DEBUGGING
  945. + void deb();
  946. + #endif
  947. + int copyopt();
  948.  
  949. Index: config.H
  950. *** config.H.old    Mon Jun  8 17:46:07 1992
  951. --- config.H    Mon Jun  8 17:46:07 1992
  952. ***************
  953. *** 9,14 ****
  954. --- 9,15 ----
  955.    * that running config.h.SH again will wipe out any changes you've made.
  956.    * For a more permanent change edit config.sh and rerun config.h.SH.
  957.    */
  958. +  /*SUPPRESS 460*/
  959.   
  960.   
  961.   /* EUNICE
  962. ***************
  963. *** 25,35 ****
  964.   /*#undef    EUNICE        /**/
  965.   /*#undef    VMS        /**/
  966.   
  967.   /* ALIGNBYTES
  968.    *    This symbol contains the number of bytes required to align a double.
  969.    *    Usual values are 2, 4, and 8.
  970.    */
  971. ! #define ALIGNBYTES 2        /**/
  972.   
  973.   /* BIN
  974.    *    This symbol holds the name of the directory in which the user wants
  975. --- 26,41 ----
  976.   /*#undef    EUNICE        /**/
  977.   /*#undef    VMS        /**/
  978.   
  979. + /* LOC_SED
  980. +  *     This symbol holds the complete pathname to the sed program.
  981. +  */
  982. + #define LOC_SED "/bin/sed"             /**/
  983.   /* ALIGNBYTES
  984.    *    This symbol contains the number of bytes required to align a double.
  985.    *    Usual values are 2, 4, and 8.
  986.    */
  987. ! #define ALIGNBYTES 8        /**/
  988.   
  989.   /* BIN
  990.    *    This symbol holds the name of the directory in which the user wants
  991. ***************
  992. *** 40,46 ****
  993.   
  994.   /* BYTEORDER
  995.    *    This symbol contains an encoding of the order of bytes in a long.
  996. !  *    Usual values (in octal) are 01234, 04321, 02143, 03412...
  997.    */
  998.   #define BYTEORDER 0x4321        /**/
  999.   
  1000. --- 46,52 ----
  1001.   
  1002.   /* BYTEORDER
  1003.    *    This symbol contains an encoding of the order of bytes in a long.
  1004. !  *    Usual values (in hex) are 0x1234, 0x4321, 0x2143, 0x3412...
  1005.    */
  1006.   #define BYTEORDER 0x4321        /**/
  1007.   
  1008. ***************
  1009. *** 68,75 ****
  1010. --- 74,89 ----
  1011.   /* HAS_BCOPY
  1012.    *    This symbol, if defined, indicates that the bcopy routine is available
  1013.    *    to copy blocks of memory.  Otherwise you should probably use memcpy().
  1014. +  *    If neither is defined, roll your own.
  1015.    */
  1016. + /* SAFE_BCOPY
  1017. +  *    This symbol, if defined, indicates that the bcopy routine is available
  1018. +  *    to copy potentially overlapping copy blocks of bcopy.  Otherwise you
  1019. +  *    should probably use memmove() or memcpy().  If neither is defined,
  1020. +  *    roll your own.
  1021. +  */
  1022.   #define    HAS_BCOPY        /**/
  1023. + #define    SAFE_BCOPY        /**/
  1024.   
  1025.   /* HAS_BZERO
  1026.    *    This symbol, if defined, indicates that the bzero routine is available
  1027. ***************
  1028. *** 89,96 ****
  1029.    *        1 = couldn't cast < 0
  1030.    *        2 = couldn't cast >= 0x80000000
  1031.    */
  1032. ! /*#undef    CASTNEGFLOAT    /**/
  1033. ! #define    CASTFLAGS 1    /**/
  1034.   
  1035.   /* CHARSPRINTF
  1036.    *    This symbol is defined if this system declares "char *sprintf()" in
  1037. --- 103,110 ----
  1038.    *        1 = couldn't cast < 0
  1039.    *        2 = couldn't cast >= 0x80000000
  1040.    */
  1041. ! #define    CASTNEGFLOAT    /**/
  1042. ! #define    CASTFLAGS 0    /**/
  1043.   
  1044.   /* CHARSPRINTF
  1045.    *    This symbol is defined if this system declares "char *sprintf()" in
  1046. ***************
  1047. *** 180,186 ****
  1048.    *    This symbol, if defined, indicates that the gethostent() routine is
  1049.    *    available to lookup host names in some data base or other.
  1050.    */
  1051. ! /*#undef    HAS_GETHOSTENT        /**/
  1052.   
  1053.   /* HAS_GETPGRP
  1054.    *    This symbol, if defined, indicates that the getpgrp() routine is
  1055. --- 194,200 ----
  1056.    *    This symbol, if defined, indicates that the gethostent() routine is
  1057.    *    available to lookup host names in some data base or other.
  1058.    */
  1059. ! #define    HAS_GETHOSTENT        /**/
  1060.   
  1061.   /* HAS_GETPGRP
  1062.    *    This symbol, if defined, indicates that the getpgrp() routine is
  1063. ***************
  1064. *** 232,237 ****
  1065. --- 246,257 ----
  1066.   /*#undef    index strchr    /* cultural */
  1067.   /*#undef    rindex strrchr    /*  differences? */
  1068.   
  1069. + /* HAS_ISASCII
  1070. +  *    This symbol, if defined, indicates that the isascii routine is available
  1071. +  *    to test characters for asciiness.
  1072. +  */
  1073. + #define    HAS_ISASCII        /**/
  1074.   /* HAS_KILLPG
  1075.    *    This symbol, if defined, indicates that the killpg routine is available
  1076.    *    to kill process groups.  If unavailable, you probably should use kill
  1077. ***************
  1078. *** 256,263 ****
  1079. --- 276,303 ----
  1080.    *    to copy blocks of memory.  Otherwise you should probably use bcopy().
  1081.    *    If neither is defined, roll your own.
  1082.    */
  1083. + /* SAFE_MEMCPY
  1084. +  *    This symbol, if defined, indicates that the memcpy routine is available
  1085. +  *    to copy potentially overlapping copy blocks of memory.  Otherwise you
  1086. +  *    should probably use memmove() or bcopy().  If neither is defined,
  1087. +  *    roll your own.
  1088. +  */
  1089.   #define    HAS_MEMCPY        /**/
  1090. + /*#undef    SAFE_MEMCPY        /**/
  1091.   
  1092. + /* HAS_MEMMOVE
  1093. +  *    This symbol, if defined, indicates that the memmove routine is available
  1094. +  *    to move potentially overlapping blocks of memory.  Otherwise you
  1095. +  *    should use bcopy() or roll your own.
  1096. +  */
  1097. + /*#undef    HAS_MEMMOVE        /**/
  1098. + /* HAS_MEMSET
  1099. +  *    This symbol, if defined, indicates that the memset routine is available
  1100. +  *    to set a block of memory to a character.  If undefined, roll your own.
  1101. +  */
  1102. + #define    HAS_MEMSET        /**/
  1103.   /* HAS_MKDIR
  1104.    *    This symbol, if defined, indicates that the mkdir routine is available
  1105.    *    to create directories.  Otherwise you should fork off a new process to
  1106. ***************
  1107. *** 273,297 ****
  1108.   
  1109.   /* HAS_MSGCTL
  1110.    *    This symbol, if defined, indicates that the msgctl() routine is
  1111. !  *    available to stat symbolic links.
  1112.    */
  1113.   #define    HAS_MSGCTL        /**/
  1114.   
  1115.   /* HAS_MSGGET
  1116.    *    This symbol, if defined, indicates that the msgget() routine is
  1117. !  *    available to stat symbolic links.
  1118.    */
  1119.   #define    HAS_MSGGET        /**/
  1120.   
  1121.   /* HAS_MSGRCV
  1122.    *    This symbol, if defined, indicates that the msgrcv() routine is
  1123. !  *    available to stat symbolic links.
  1124.    */
  1125.   #define    HAS_MSGRCV        /**/
  1126.   
  1127.   /* HAS_MSGSND
  1128.    *    This symbol, if defined, indicates that the msgsnd() routine is
  1129. !  *    available to stat symbolic links.
  1130.    */
  1131.   #define    HAS_MSGSND        /**/
  1132.   
  1133. --- 313,337 ----
  1134.   
  1135.   /* HAS_MSGCTL
  1136.    *    This symbol, if defined, indicates that the msgctl() routine is
  1137. !  *    available to control message passing.
  1138.    */
  1139.   #define    HAS_MSGCTL        /**/
  1140.   
  1141.   /* HAS_MSGGET
  1142.    *    This symbol, if defined, indicates that the msgget() routine is
  1143. !  *    available to get messages.
  1144.    */
  1145.   #define    HAS_MSGGET        /**/
  1146.   
  1147.   /* HAS_MSGRCV
  1148.    *    This symbol, if defined, indicates that the msgrcv() routine is
  1149. !  *    available to receive messages.
  1150.    */
  1151.   #define    HAS_MSGRCV        /**/
  1152.   
  1153.   /* HAS_MSGSND
  1154.    *    This symbol, if defined, indicates that the msgsnd() routine is
  1155. !  *    available to send messages.
  1156.    */
  1157.   #define    HAS_MSGSND        /**/
  1158.   
  1159. ***************
  1160. *** 326,331 ****
  1161. --- 366,377 ----
  1162.    */
  1163.   #define    HAS_RENAME        /**/
  1164.   
  1165. + /* HAS_REWINDDIR
  1166. +  *    This symbol, if defined, indicates that the rewindir routine is
  1167. +  *    available to rewind directories.
  1168. +  */
  1169. + #define    HAS_REWINDDIR        /**/
  1170.   /* HAS_RMDIR
  1171.    *    This symbol, if defined, indicates that the rmdir routine is available
  1172.    *    to remove directories.  Otherwise you should fork off a new process to
  1173. ***************
  1174. *** 333,338 ****
  1175. --- 379,390 ----
  1176.    */
  1177.   #define    HAS_RMDIR        /**/
  1178.   
  1179. + /* HAS_SEEKDIR
  1180. +  *    This symbol, if defined, indicates that the seekdir routine is
  1181. +  *    available to seek into directories.
  1182. +  */
  1183. + #define    HAS_SEEKDIR        /**/
  1184.   /* HAS_SELECT
  1185.    *    This symbol, if defined, indicates that the select() subroutine
  1186.    *    exists.
  1187. ***************
  1188. *** 347,365 ****
  1189.   
  1190.   /* HAS_SEMCTL
  1191.    *    This symbol, if defined, indicates that the semctl() routine is
  1192. !  *    available to stat symbolic links.
  1193.    */
  1194.   #define    HAS_SEMCTL        /**/
  1195.   
  1196.   /* HAS_SEMGET
  1197.    *    This symbol, if defined, indicates that the semget() routine is
  1198. !  *    available to stat symbolic links.
  1199.    */
  1200.   #define    HAS_SEMGET        /**/
  1201.   
  1202.   /* HAS_SEMOP
  1203.    *    This symbol, if defined, indicates that the semop() routine is
  1204. !  *    available to stat symbolic links.
  1205.    */
  1206.   #define    HAS_SEMOP        /**/
  1207.   
  1208. --- 399,417 ----
  1209.   
  1210.   /* HAS_SEMCTL
  1211.    *    This symbol, if defined, indicates that the semctl() routine is
  1212. !  *    available to control semaphores.
  1213.    */
  1214.   #define    HAS_SEMCTL        /**/
  1215.   
  1216.   /* HAS_SEMGET
  1217.    *    This symbol, if defined, indicates that the semget() routine is
  1218. !  *    available to get semaphores ids.
  1219.    */
  1220.   #define    HAS_SEMGET        /**/
  1221.   
  1222.   /* HAS_SEMOP
  1223.    *    This symbol, if defined, indicates that the semop() routine is
  1224. !  *    available to perform semaphore operations.
  1225.    */
  1226.   #define    HAS_SEMOP        /**/
  1227.   
  1228. ***************
  1229. *** 437,443 ****
  1230.   
  1231.   /* HAS_SHMAT
  1232.    *    This symbol, if defined, indicates that the shmat() routine is
  1233. !  *    available to stat symbolic links.
  1234.    */
  1235.   /* VOID_SHMAT
  1236.    *    This symbol, if defined, indicates that the shmat() routine
  1237. --- 489,495 ----
  1238.   
  1239.   /* HAS_SHMAT
  1240.    *    This symbol, if defined, indicates that the shmat() routine is
  1241. !  *    available to attach a shared memory segment.
  1242.    */
  1243.   /* VOID_SHMAT
  1244.    *    This symbol, if defined, indicates that the shmat() routine
  1245. ***************
  1246. *** 449,467 ****
  1247.   
  1248.   /* HAS_SHMCTL
  1249.    *    This symbol, if defined, indicates that the shmctl() routine is
  1250. !  *    available to stat symbolic links.
  1251.    */
  1252.   #define    HAS_SHMCTL        /**/
  1253.   
  1254.   /* HAS_SHMDT
  1255.    *    This symbol, if defined, indicates that the shmdt() routine is
  1256. !  *    available to stat symbolic links.
  1257.    */
  1258.   #define    HAS_SHMDT        /**/
  1259.   
  1260.   /* HAS_SHMGET
  1261.    *    This symbol, if defined, indicates that the shmget() routine is
  1262. !  *    available to stat symbolic links.
  1263.    */
  1264.   #define    HAS_SHMGET        /**/
  1265.   
  1266. --- 501,519 ----
  1267.   
  1268.   /* HAS_SHMCTL
  1269.    *    This symbol, if defined, indicates that the shmctl() routine is
  1270. !  *    available to control a shared memory segment.
  1271.    */
  1272.   #define    HAS_SHMCTL        /**/
  1273.   
  1274.   /* HAS_SHMDT
  1275.    *    This symbol, if defined, indicates that the shmdt() routine is
  1276. !  *    available to detach a shared memory segment.
  1277.    */
  1278.   #define    HAS_SHMDT        /**/
  1279.   
  1280.   /* HAS_SHMGET
  1281.    *    This symbol, if defined, indicates that the shmget() routine is
  1282. !  *    available to get a shared memory segment id.
  1283.    */
  1284.   #define    HAS_SHMGET        /**/
  1285.   
  1286. ***************
  1287. *** 520,525 ****
  1288. --- 572,583 ----
  1289.    */
  1290.   #define    HAS_SYSCALL        /**/
  1291.   
  1292. + /* HAS_TELLDIR
  1293. +  *    This symbol, if defined, indicates that the telldir routine is
  1294. +  *    available to tell your location in directories.
  1295. +  */
  1296. + #define    HAS_TELLDIR        /**/
  1297.   /* HAS_TRUNCATE
  1298.    *    This symbol, if defined, indicates that the truncate routine is
  1299.    *    available to truncate files.
  1300. ***************
  1301. *** 737,745 ****
  1302. --- 795,808 ----
  1303.   /*#undef    I_MY_DIR    /**/
  1304.   /*#undef    DIRNAMLEN    /**/
  1305.   
  1306. + /* MYMALLOC
  1307. +  *    This symbol, if defined, indicates that we're using our own malloc.
  1308. +  */
  1309.   /* MALLOCPTRTYPE
  1310.    *    This symbol defines the kind of ptr returned by malloc and realloc.
  1311.    */
  1312. + #define MYMALLOC            /**/
  1313.   #define MALLOCPTRTYPE char         /**/
  1314.   
  1315.   
  1316.  
  1317. Index: msdos/config.h
  1318. *** msdos/config.h.old    Mon Jun  8 17:49:30 1992
  1319. --- msdos/config.h    Mon Jun  8 17:49:31 1992
  1320. ***************
  1321. *** 79,86 ****
  1322. --- 79,94 ----
  1323.   /* HAS_BCOPY
  1324.    *    This symbol, if defined, indicates that the bcopy routine is available
  1325.    *    to copy blocks of memory.  Otherwise you should probably use memcpy().
  1326. +  *    If neither is defined, roll your own.
  1327.    */
  1328. + /* SAFE_BCOPY
  1329. +  *    This symbol, if defined, indicates that the bcopy routine is available
  1330. +  *    to copy potentially overlapping copy blocks of bcopy.  Otherwise you
  1331. +  *    should probably use memmove() or memcpy().  If neither is defined,
  1332. +  *    roll your own.
  1333. +  */
  1334.   /*#undef    HAS_BCOPY        /**/
  1335. + /*#undef    SAFE_BCOPY        /**/
  1336.   
  1337.   /* HAS_BZERO
  1338.    *    This symbol, if defined, indicates that the bzero routine is available
  1339. ***************
  1340. *** 243,248 ****
  1341. --- 251,262 ----
  1342.   #define    index strchr    /* cultural */
  1343.   #define    rindex strrchr    /*  differences? */
  1344.   
  1345. + /* HAS_ISASCII
  1346. +  *    This symbol, if defined, indicates that the isascii routine is available
  1347. +  *    to test characters for asciiness.
  1348. +  */
  1349. + #define    HAS_ISASCII        /**/
  1350.   /* HAS_KILLPG
  1351.    *    This symbol, if defined, indicates that the killpg routine is available
  1352.    *    to kill process groups.  If unavailable, you probably should use kill
  1353. ***************
  1354. *** 267,274 ****
  1355. --- 281,308 ----
  1356.    *    to copy blocks of memory.  Otherwise you should probably use bcopy().
  1357.    *    If neither is defined, roll your own.
  1358.    */
  1359. + /* SAFE_MEMCPY
  1360. +  *    This symbol, if defined, indicates that the memcpy routine is available
  1361. +  *    to copy potentially overlapping copy blocks of memory.  Otherwise you
  1362. +  *    should probably use memmove() or bcopy().  If neither is defined,
  1363. +  *    roll your own.
  1364. +  */
  1365.   #define    HAS_MEMCPY        /**/
  1366. + /*#undef    SAFE_MEMCPY        /**/
  1367.   
  1368. + /* HAS_MEMMOVE
  1369. +  *    This symbol, if defined, indicates that the memmove routine is available
  1370. +  *    to move potentially overlapping blocks of memory.  Otherwise you
  1371. +  *    should use bcopy() or roll your own.
  1372. +  */
  1373. + /*#undef    HAS_MEMMOVE        /**/
  1374. + /* HAS_MEMSET
  1375. +  *    This symbol, if defined, indicates that the memset routine is available
  1376. +  *    to set a block of memory to a character.  If undefined, roll your own.
  1377. +  */
  1378. + #define    HAS_MEMSET        /**/
  1379.   /* HAS_MKDIR
  1380.    *    This symbol, if defined, indicates that the mkdir routine is available
  1381.    *    to create directories.  Otherwise you should fork off a new process to
  1382. ***************
  1383. *** 284,308 ****
  1384.   
  1385.   /* HAS_MSGCTL
  1386.    *    This symbol, if defined, indicates that the msgctl() routine is
  1387. !  *    available to stat symbolic links.
  1388.    */
  1389.   /*#undef    HAS_MSGCTL        /**/
  1390.   
  1391.   /* HAS_MSGGET
  1392.    *    This symbol, if defined, indicates that the msgget() routine is
  1393. !  *    available to stat symbolic links.
  1394.    */
  1395.   /*#undef    HAS_MSGGET        /**/
  1396.   
  1397.   /* HAS_MSGRCV
  1398.    *    This symbol, if defined, indicates that the msgrcv() routine is
  1399. !  *    available to stat symbolic links.
  1400.    */
  1401.   /*#undef    HAS_MSGRCV        /**/
  1402.   
  1403.   /* HAS_MSGSND
  1404.    *    This symbol, if defined, indicates that the msgsnd() routine is
  1405. !  *    available to stat symbolic links.
  1406.    */
  1407.   /*#undef    HAS_MSGSND        /**/
  1408.   
  1409. --- 318,342 ----
  1410.   
  1411.   /* HAS_MSGCTL
  1412.    *    This symbol, if defined, indicates that the msgctl() routine is
  1413. !  *    available to control message passing.
  1414.    */
  1415.   /*#undef    HAS_MSGCTL        /**/
  1416.   
  1417.   /* HAS_MSGGET
  1418.    *    This symbol, if defined, indicates that the msgget() routine is
  1419. !  *    available to get messages.
  1420.    */
  1421.   /*#undef    HAS_MSGGET        /**/
  1422.   
  1423.   /* HAS_MSGRCV
  1424.    *    This symbol, if defined, indicates that the msgrcv() routine is
  1425. !  *    available to receive messages.
  1426.    */
  1427.   /*#undef    HAS_MSGRCV        /**/
  1428.   
  1429.   /* HAS_MSGSND
  1430.    *    This symbol, if defined, indicates that the msgsnd() routine is
  1431. !  *    available to send messages.
  1432.    */
  1433.   /*#undef    HAS_MSGSND        /**/
  1434.   
  1435. ***************
  1436. *** 337,342 ****
  1437. --- 371,382 ----
  1438.    */
  1439.   #define    HAS_RENAME        /**/
  1440.   
  1441. + /* HAS_REWINDDIR
  1442. +  *    This symbol, if defined, indicates that the rewindir routine is
  1443. +  *    available to rewind directories.
  1444. +  */
  1445. + #define    HAS_REWINDDIR        /**/
  1446.   /* HAS_RMDIR
  1447.    *    This symbol, if defined, indicates that the rmdir routine is available
  1448.    *    to remove directories.  Otherwise you should fork off a new process to
  1449. ***************
  1450. *** 344,349 ****
  1451. --- 384,395 ----
  1452.    */
  1453.   #define    HAS_RMDIR        /**/
  1454.   
  1455. + /* HAS_SEEKDIR
  1456. +  *    This symbol, if defined, indicates that the seekdir routine is
  1457. +  *    available to seek into directories.
  1458. +  */
  1459. + #define    HAS_SEEKDIR        /**/
  1460.   /* HAS_SELECT
  1461.    *    This symbol, if defined, indicates that the select() subroutine
  1462.    *    exists.
  1463. ***************
  1464. *** 358,376 ****
  1465.   
  1466.   /* HAS_SEMCTL
  1467.    *    This symbol, if defined, indicates that the semctl() routine is
  1468. !  *    available to stat symbolic links.
  1469.    */
  1470.   /*#undef    HAS_SEMCTL        /**/
  1471.   
  1472.   /* HAS_SEMGET
  1473.    *    This symbol, if defined, indicates that the semget() routine is
  1474. !  *    available to stat symbolic links.
  1475.    */
  1476.   /*#undef    HAS_SEMGET        /**/
  1477.   
  1478.   /* HAS_SEMOP
  1479.    *    This symbol, if defined, indicates that the semop() routine is
  1480. !  *    available to stat symbolic links.
  1481.    */
  1482.   /*#undef    HAS_SEMOP        /**/
  1483.   
  1484. --- 404,422 ----
  1485.   
  1486.   /* HAS_SEMCTL
  1487.    *    This symbol, if defined, indicates that the semctl() routine is
  1488. !  *    available to control semaphores.
  1489.    */
  1490.   /*#undef    HAS_SEMCTL        /**/
  1491.   
  1492.   /* HAS_SEMGET
  1493.    *    This symbol, if defined, indicates that the semget() routine is
  1494. !  *    available to get semaphores ids.
  1495.    */
  1496.   /*#undef    HAS_SEMGET        /**/
  1497.   
  1498.   /* HAS_SEMOP
  1499.    *    This symbol, if defined, indicates that the semop() routine is
  1500. !  *    available to perform semaphore operations.
  1501.    */
  1502.   /*#undef    HAS_SEMOP        /**/
  1503.   
  1504. ***************
  1505. *** 448,472 ****
  1506.   
  1507.   /* HAS_SHMAT
  1508.    *    This symbol, if defined, indicates that the shmat() routine is
  1509. !  *    available to stat symbolic links.
  1510.    */
  1511.   /*#undef    HAS_SHMAT        /**/
  1512.   
  1513.   /* HAS_SHMCTL
  1514.    *    This symbol, if defined, indicates that the shmctl() routine is
  1515. !  *    available to stat symbolic links.
  1516.    */
  1517.   /*#undef    HAS_SHMCTL        /**/
  1518.   
  1519.   /* HAS_SHMDT
  1520.    *    This symbol, if defined, indicates that the shmdt() routine is
  1521. !  *    available to stat symbolic links.
  1522.    */
  1523.   /*#undef    HAS_SHMDT        /**/
  1524.   
  1525.   /* HAS_SHMGET
  1526.    *    This symbol, if defined, indicates that the shmget() routine is
  1527. !  *    available to stat symbolic links.
  1528.    */
  1529.   /*#undef    HAS_SHMGET        /**/
  1530.   
  1531. --- 494,524 ----
  1532.   
  1533.   /* HAS_SHMAT
  1534.    *    This symbol, if defined, indicates that the shmat() routine is
  1535. !  *    available to attach a shared memory segment.
  1536.    */
  1537. + /* VOID_SHMAT
  1538. +  *    This symbol, if defined, indicates that the shmat() routine
  1539. +  *    returns a pointer of type void*.
  1540. +  */
  1541.   /*#undef    HAS_SHMAT        /**/
  1542.   
  1543. + /*#undef    VOIDSHMAT        /**/
  1544.   /* HAS_SHMCTL
  1545.    *    This symbol, if defined, indicates that the shmctl() routine is
  1546. !  *    available to control a shared memory segment.
  1547.    */
  1548.   /*#undef    HAS_SHMCTL        /**/
  1549.   
  1550.   /* HAS_SHMDT
  1551.    *    This symbol, if defined, indicates that the shmdt() routine is
  1552. !  *    available to detach a shared memory segment.
  1553.    */
  1554.   /*#undef    HAS_SHMDT        /**/
  1555.   
  1556.   /* HAS_SHMGET
  1557.    *    This symbol, if defined, indicates that the shmget() routine is
  1558. !  *    available to get a shared memory segment id.
  1559.    */
  1560.   /*#undef    HAS_SHMGET        /**/
  1561.   
  1562. ***************
  1563. *** 528,533 ****
  1564. --- 580,591 ----
  1565.    */
  1566.   /*#undef    HAS_SYSCALL        /**/
  1567.   
  1568. + /* HAS_TELLDIR
  1569. +  *    This symbol, if defined, indicates that the telldir routine is
  1570. +  *    available to tell your location in directories.
  1571. +  */
  1572. + #define    HAS_TELLDIR        /**/
  1573.   /* HAS_TRUNCATE
  1574.    *    This symbol, if defined, indicates that the truncate routine is
  1575.    *    available to truncate files.
  1576. ***************
  1577. *** 745,755 ****
  1578. --- 803,819 ----
  1579.   /*#undef    I_MY_DIR    /**/
  1580.   /*#undef    DIRNAMLEN    /**/
  1581.   
  1582. + /* MYMALLOC
  1583. +  *    This symbol, if defined, indicates that we're using our own malloc.
  1584. +  */
  1585.   /* MALLOCPTRTYPE
  1586.    *    This symbol defines the kind of ptr returned by malloc and realloc.
  1587.    */
  1588. + #define MYMALLOC            /**/
  1589.   #define MALLOCPTRTYPE void         /**/
  1590.   
  1591.   /* RANDBITS
  1592.    *    This symbol contains the number of bits of random number the rand()
  1593.    *    function produces.  Usual values are 15, 16, and 31.
  1594. ***************
  1595. *** 758,764 ****
  1596.   
  1597.   /* SCRIPTDIR
  1598.    *    This symbol holds the name of the directory in which the user wants
  1599. !  *    to put publicly executable scripts for the package in question.  It
  1600.    *    is often a directory that is mounted across diverse architectures.
  1601.    */
  1602.   #define SCRIPTDIR "C:/bin/perl"             /**/
  1603. --- 822,828 ----
  1604.   
  1605.   /* SCRIPTDIR
  1606.    *    This symbol holds the name of the directory in which the user wants
  1607. !  *    to keep publicly executable scripts for the package in question.  It
  1608.    *    is often a directory that is mounted across diverse architectures.
  1609.    */
  1610.   #define SCRIPTDIR "C:/bin/perl"             /**/
  1611.  
  1612. Index: consarg.c
  1613. *** consarg.c.old    Mon Jun  8 17:46:26 1992
  1614. --- consarg.c    Mon Jun  8 17:46:28 1992
  1615. ***************
  1616. *** 1,4 ****
  1617. ! /* $RCSfile: consarg.c,v $$Revision: 4.0.1.3 $$Date: 91/11/05 16:21:16 $
  1618.    *
  1619.    *    Copyright (c) 1991, Larry Wall
  1620.    *
  1621. --- 1,4 ----
  1622. ! /* $RCSfile: consarg.c,v $$Revision: 4.0.1.4 $$Date: 92/06/08 12:26:27 $
  1623.    *
  1624.    *    Copyright (c) 1991, Larry Wall
  1625.    *
  1626. ***************
  1627. *** 6,11 ****
  1628. --- 6,17 ----
  1629.    *    License or the Artistic License, as specified in the README file.
  1630.    *
  1631.    * $Log:    consarg.c,v $
  1632. +  * Revision 4.0.1.4  92/06/08  12:26:27  lwall
  1633. +  * patch20: new warning for use of x with non-numeric right operand
  1634. +  * patch20: modulus with highest bit in left operand set didn't always work
  1635. +  * patch20: illegal lvalue message could be followed by core dump
  1636. +  * patch20: deleted some minor memory leaks
  1637. +  * 
  1638.    * Revision 4.0.1.3  91/11/05  16:21:16  lwall
  1639.    * patch11: random cleanup
  1640.    * patch11: added eval {}
  1641. ***************
  1642. *** 57,62 ****
  1643. --- 63,69 ----
  1644.       }
  1645.       else {
  1646.           arg[3].arg_flags = 0;
  1647. +         arg[3].arg_len = 0;
  1648.           arg[3].arg_type = A_EXPR;
  1649.           arg[3].arg_ptr.arg_arg = limarg;
  1650.       }
  1651. ***************
  1652. *** 63,68 ****
  1653. --- 70,76 ----
  1654.       }
  1655.       else {
  1656.       arg[3].arg_flags = 0;
  1657. +     arg[3].arg_len = 0;
  1658.       arg[3].arg_type = A_NULL;
  1659.       arg[3].arg_ptr.arg_arg = Nullarg;
  1660.       }
  1661. ***************
  1662. *** 344,350 ****
  1663.       str_scat(str,s2);
  1664.       break;
  1665.       case O_REPEAT:
  1666. !     CHECK12;
  1667.       i = (int)str_gnum(s2);
  1668.       tmps = str_get(s1);
  1669.       str_nset(str,"",0);
  1670. --- 352,361 ----
  1671.       str_scat(str,s2);
  1672.       break;
  1673.       case O_REPEAT:
  1674. !     CHECK2;
  1675. !     if (dowarn && !s2->str_nok && !looks_like_number(s2))
  1676. !         warn("Right operand of x is not numeric");
  1677. !     CHECK1;
  1678.       i = (int)str_gnum(s2);
  1679.       tmps = str_get(s1);
  1680.       str_nset(str,"",0);
  1681. ***************
  1682. *** 392,403 ****
  1683.           yyerror("Illegal modulus of constant zero");
  1684.           return arg;
  1685.       }
  1686. !     tmp2 = (long)str_gnum(s1);
  1687.   #ifndef lint
  1688. !     if (tmp2 >= 0)
  1689. !         str_numset(str,(double)(tmp2 % tmplong));
  1690. !     else
  1691.           str_numset(str,(double)((tmplong-((-tmp2 - 1) % tmplong)) - 1));
  1692.   #else
  1693.       tmp2 = tmp2;
  1694.   #endif
  1695. --- 403,416 ----
  1696.           yyerror("Illegal modulus of constant zero");
  1697.           return arg;
  1698.       }
  1699. !     value = str_gnum(s1);
  1700.   #ifndef lint
  1701. !     if (value >= 0.0)
  1702. !         str_numset(str,(double)(((unsigned long)value) % tmplong));
  1703. !     else {
  1704. !         tmp2 = (long)value;
  1705.           str_numset(str,(double)((tmplong-((-tmp2 - 1) % tmplong)) - 1));
  1706. +     }
  1707.   #else
  1708.       tmp2 = tmp2;
  1709.   #endif
  1710. ***************
  1711. *** 847,852 ****
  1712. --- 860,866 ----
  1713.           (void)sprintf(tokenbuf,
  1714.             "Illegal expression (%s) as lvalue",opname[arg1->arg_type]);
  1715.           yyerror(tokenbuf);
  1716. +         return arg;
  1717.       }
  1718.       arg[1].arg_type = A_LEXPR | (arg[1].arg_type & A_DONT);
  1719.       if (arg->arg_type == O_ASSIGN && (arg1[1].arg_flags & AF_ARYOK)) {
  1720. ***************
  1721. *** 871,876 ****
  1722. --- 885,891 ----
  1723.       (void)sprintf(tokenbuf,
  1724.         "Illegal item (%s) as lvalue",argname[arg[1].arg_type&A_MASK]);
  1725.       yyerror(tokenbuf);
  1726. +     return arg;
  1727.       }
  1728.       arg[1].arg_type = A_LVAL | (arg[1].arg_type & A_DONT);
  1729.   #ifdef DEBUGGING
  1730. ***************
  1731. *** 897,902 ****
  1732. --- 912,918 ----
  1733.       return arg;
  1734.   }
  1735.   
  1736. + void
  1737.   dehoist(arg,i)
  1738.   ARG *arg;
  1739.   {
  1740. ***************
  1741. *** 976,1001 ****
  1742.       node = arg;
  1743.       arg = op_new(i);
  1744.       tmpstr = arg->arg_ptr.arg_str;
  1745. ! #ifdef STRUCTCOPY
  1746. !     *arg = *node;        /* copy everything except the STR */
  1747. ! #else
  1748. !     (void)bcopy((char *)node, (char *)arg, sizeof(ARG));
  1749. ! #endif
  1750.       arg->arg_ptr.arg_str = tmpstr;
  1751.       for (j = i; ; ) {
  1752. ! #ifdef STRUCTCOPY
  1753. !         arg[j] = node[2];
  1754. ! #else
  1755. !         (void)bcopy((char *)(node+2), (char *)(arg+j), sizeof(ARG));
  1756. ! #endif
  1757.           arg[j].arg_flags |= AF_ARYOK;
  1758.           --j;        /* Bug in Xenix compiler */
  1759.           if (j < 2) {
  1760. ! #ifdef STRUCTCOPY
  1761. !         arg[1] = node[1];
  1762. ! #else
  1763. !         (void)bcopy((char *)(node+1), (char *)(arg+1), sizeof(ARG));
  1764. ! #endif
  1765.           free_arg(node);
  1766.           break;
  1767.           }
  1768. --- 992,1005 ----
  1769.       node = arg;
  1770.       arg = op_new(i);
  1771.       tmpstr = arg->arg_ptr.arg_str;
  1772. !     StructCopy(node, arg, ARG);    /* copy everything except the STR */
  1773.       arg->arg_ptr.arg_str = tmpstr;
  1774.       for (j = i; ; ) {
  1775. !         StructCopy(node+2, arg+j, ARG);
  1776.           arg[j].arg_flags |= AF_ARYOK;
  1777.           --j;        /* Bug in Xenix compiler */
  1778.           if (j < 2) {
  1779. !         StructCopy(node+1, arg+1, ARG);
  1780.           free_arg(node);
  1781.           break;
  1782.           }
  1783. ***************
  1784. *** 1008,1013 ****
  1785. --- 1012,1019 ----
  1786.       arg[2].arg_flags |= AF_ARYOK;
  1787.       arg->arg_type = O_LIST;
  1788.       arg->arg_len = i;
  1789. +     str_free(arg->arg_ptr.arg_str);
  1790. +     arg->arg_ptr.arg_str = Nullstr;
  1791.       return arg;
  1792.   }
  1793.   
  1794.  
  1795. Index: t/comp/cpp.t
  1796. Prereq: 4.0
  1797. *** t/comp/cpp.t.old    Mon Jun  8 17:52:01 1992
  1798. --- t/comp/cpp.t    Mon Jun  8 17:52:02 1992
  1799. ***************
  1800. *** 1,6 ****
  1801.   #!./perl -P
  1802.   
  1803. ! # $Header: cpp.t,v 4.0 91/03/20 01:50:05 lwall Locked $
  1804.   
  1805.   print "1..3\n";
  1806.   
  1807. --- 1,18 ----
  1808.   #!./perl -P
  1809.   
  1810. ! # $RCSfile: cpp.t,v $$Revision: 4.0.1.1 $$Date: 92/06/08 15:42:08 $
  1811. ! open(CONFIG,"../config.sh") || die;
  1812. ! while (<CONFIG>) {
  1813. !     if (/^cppstdin/) {
  1814. !     if (/^cppstdin='(.*cppstdin)'/ && ! -e $1) {
  1815. !         print "1..0\n";
  1816. !         exit;         # Can't test till after install, alas.
  1817. !     }
  1818. !     last;
  1819. !     }
  1820. ! }
  1821. ! close CONFIG;
  1822.   
  1823.   print "1..3\n";
  1824.   
  1825.  
  1826. Index: hints/cray.sh
  1827. *** hints/cray.sh.old    Mon Jun  8 17:47:47 1992
  1828. --- hints/cray.sh    Mon Jun  8 17:47:48 1992
  1829. ***************
  1830. *** 0 ****
  1831. --- 1,3 ----
  1832. + case `uname -r` in
  1833. + 6.1*) shellflags="-m+65536" ;;
  1834. + esac
  1835.  
  1836. Index: lib/ctime.pl
  1837. Prereq: 4.0
  1838. *** lib/ctime.pl.old    Mon Jun  8 17:48:52 1992
  1839. --- lib/ctime.pl    Mon Jun  8 17:48:52 1992
  1840. ***************
  1841. *** 3,9 ****
  1842.   ;# Waldemar Kebsch, Federal Republic of Germany, November 1988
  1843.   ;# kebsch.pad@nixpbe.UUCP
  1844.   ;# Modified March 1990, Feb 1991 to properly handle timezones
  1845. ! ;#  $Id: ctime.pl,v 1.8 91/02/04 18:28:12 hakanson Exp $
  1846.   ;#   Marion Hakanson (hakanson@cse.ogi.edu)
  1847.   ;#   Oregon Graduate Institute of Science and Technology
  1848.   ;#
  1849. --- 3,9 ----
  1850.   ;# Waldemar Kebsch, Federal Republic of Germany, November 1988
  1851.   ;# kebsch.pad@nixpbe.UUCP
  1852.   ;# Modified March 1990, Feb 1991 to properly handle timezones
  1853. ! ;#  $RCSfile: ctime.pl,v $$Revision: 4.0.1.1 $$Date: 92/06/08 13:38:06 $
  1854.   ;#   Marion Hakanson (hakanson@cse.ogi.edu)
  1855.   ;#   Oregon Graduate Institute of Science and Technology
  1856.   ;#
  1857. ***************
  1858. *** 24,29 ****
  1859. --- 24,30 ----
  1860.       package ctime;
  1861.   
  1862.       local($time) = @_;
  1863. +     local($[) = 0;
  1864.       local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
  1865.   
  1866.       # Determine what time zone is in effect.
  1867.  
  1868. *** End of Patch 22 ***
  1869. exit 0 # Just in case...
  1870.