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

  1. Newsgroups: comp.sources.misc
  2. From: lwall@netlabs.com (Larry Wall)
  3. Subject:  v30i041:  perl - The perl programming language, Patch30
  4. Message-ID: <1992Jun11.180756.1426@sparky.imd.sterling.com>
  5. X-Md4-Signature: 655951ed82458e9acd368f8737df5cbd
  6. Date: Thu, 11 Jun 1992 18:07:56 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: lwall@netlabs.com (Larry Wall)
  10. Posting-number: Volume 30, Issue 41
  11. Archive-name: perl/patch30
  12. Environment: UNIX, MS-DOS, OS2
  13. Patch-To: perl: Volume 18, Issue 19-54
  14.  
  15. System: perl version 4.0
  16. Patch #: 30
  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: 29
  56. 1c1
  57. < #define PATCHLEVEL 29
  58. ---
  59. > #define PATCHLEVEL 30
  60.  
  61. Index: perly.y
  62. *** perly.y.old    Mon Jun  8 17:51:22 1992
  63. --- perly.y    Mon Jun  8 17:51:23 1992
  64. ***************
  65. *** 1,4 ****
  66. ! /* $RCSfile: perly.y,v $$Revision: 4.0.1.2 $$Date: 91/11/05 18:17:38 $
  67.    *
  68.    *    Copyright (c) 1991, Larry Wall
  69.    *
  70. --- 1,4 ----
  71. ! /* $RCSfile: perly.y,v $$Revision: 4.0.1.4 $$Date: 92/06/08 17:33:25 $
  72.    *
  73.    *    Copyright (c) 1991, Larry Wall
  74.    *
  75. ***************
  76. *** 6,11 ****
  77. --- 6,22 ----
  78.    *    License or the Artistic License, as specified in the README file.
  79.    *
  80.    * $Log:    perly.y,v $
  81. +  * Revision 4.0.1.4  92/06/08  17:33:25  lwall
  82. +  * patch20: one of the backdoors to expectterm was on the wrong reduction
  83. +  * 
  84. +  * Revision 4.0.1.3  92/06/08  15:18:16  lwall
  85. +  * patch20: an expression may now start with a bareword
  86. +  * patch20: relaxed requirement for semicolon at the end of a block
  87. +  * patch20: added ... as variant on ..
  88. +  * patch20: fixed double debug break in foreach with implicit array assignment
  89. +  * patch20: if {block} {block} didn't work any more
  90. +  * patch20: deleted some minor memory leaks
  91. +  * 
  92.    * Revision 4.0.1.2  91/11/05  18:17:38  lwall
  93.    * patch11: extra comma at end of list is now allowed in more places (Hi, Felix!)
  94.    * patch11: once-thru blocks didn't display right in the debugger
  95. ***************
  96. *** 47,54 ****
  97.   
  98.   %token <ival> '{' ')'
  99.   
  100. ! %token <cval> WORD
  101. ! %token <ival> APPEND OPEN SSELECT LOOPEX
  102.   %token <ival> USING FORMAT DO SHIFT PUSH POP LVALFUN
  103.   %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE SPLIT FLIST
  104.   %token <ival> FOR FILOP FILOP2 FILOP3 FILOP4 FILOP22 FILOP25
  105. --- 58,65 ----
  106.   
  107.   %token <ival> '{' ')'
  108.   
  109. ! %token <cval> WORD LABEL
  110. ! %token <ival> APPEND OPEN SSELECT LOOPEX DOTDOT
  111.   %token <ival> USING FORMAT DO SHIFT PUSH POP LVALFUN
  112.   %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE SPLIT FLIST
  113.   %token <ival> FOR FILOP FILOP2 FILOP3 FILOP4 FILOP22 FILOP25
  114. ***************
  115. *** 95,100 ****
  116. --- 106,112 ----
  117.           {
  118.   #if defined(YYDEBUG) && defined(DEBUGGING)
  119.               yydebug = (debug & 1);
  120. +             expectterm = 2;
  121.   #endif
  122.           }
  123.       /*CONTINUED*/    lineseq
  124. ***************
  125. *** 116,130 ****
  126.               { $$ = $2; }
  127.       |    ELSIF '(' expr ')' compblock
  128.               { cmdline = $1;
  129. !                 $$ = make_ccmd(C_ELSIF,$3,$5); }
  130.       ;
  131.   
  132.   block    :    '{' remember lineseq '}'
  133.               { $$ = block_head($3);
  134. !               if (cmdline > $1)
  135.                     cmdline = $1;
  136.                 if (savestack->ary_fill > $2)
  137. !                 restorelist($2); }
  138.       ;
  139.   
  140.   remember:    /* NULL */    /* in case they push a package name */
  141. --- 128,143 ----
  142.               { $$ = $2; }
  143.       |    ELSIF '(' expr ')' compblock
  144.               { cmdline = $1;
  145. !                 $$ = make_ccmd(C_ELSIF,1,$3,$5); }
  146.       ;
  147.   
  148.   block    :    '{' remember lineseq '}'
  149.               { $$ = block_head($3);
  150. !               if (cmdline > (line_t)$1)
  151.                     cmdline = $1;
  152.                 if (savestack->ary_fill > $2)
  153. !                 restorelist($2);
  154. !               expectterm = 2; }
  155.       ;
  156.   
  157.   remember:    /* NULL */    /* in case they push a package name */
  158. ***************
  159. *** 150,158 ****
  160.                   else {
  161.                     $$ = Nullcmd;
  162.                     cmdline = NOLINE;
  163. !                 } }
  164.       |    label sideff ';'
  165. !             { $$ = add_label($1,$2); }
  166.       ;
  167.   
  168.   sideff    :    error
  169. --- 163,173 ----
  170.                   else {
  171.                     $$ = Nullcmd;
  172.                     cmdline = NOLINE;
  173. !                 }
  174. !                 expectterm = 2; }
  175.       |    label sideff ';'
  176. !             { $$ = add_label($1,$2);
  177. !               expectterm = 2; }
  178.       ;
  179.   
  180.   sideff    :    error
  181. ***************
  182. *** 181,208 ****
  183.                   $$ = invert(make_icmd(C_IF,$3,$5)); }
  184.       |    IF block compblock
  185.               { cmdline = $1;
  186. !                 $$ = make_ccmd(C_IF,cmd_to_arg($2),$3); }
  187.       |    UNLESS block compblock
  188.               { cmdline = $1;
  189. !                 $$ = invert(make_ccmd(C_IF,cmd_to_arg($2),$3)); }
  190.       ;
  191.   
  192.   loop    :    label WHILE '(' texpr ')' compblock
  193.               { cmdline = $2;
  194.                   $$ = wopt(add_label($1,
  195. !                 make_ccmd(C_WHILE,$4,$6) )); }
  196.       |    label UNTIL '(' expr ')' compblock
  197.               { cmdline = $2;
  198.                   $$ = wopt(add_label($1,
  199. !                 invert(make_ccmd(C_WHILE,$4,$6)) )); }
  200.       |    label WHILE block compblock
  201.               { cmdline = $2;
  202.                   $$ = wopt(add_label($1,
  203. !                 make_ccmd(C_WHILE, cmd_to_arg($3),$4) )); }
  204.       |    label UNTIL block compblock
  205.               { cmdline = $2;
  206.                   $$ = wopt(add_label($1,
  207. !                 invert(make_ccmd(C_WHILE, cmd_to_arg($3),$4)) )); }
  208.       |    label FOR REG '(' expr crp compblock
  209.               { cmdline = $2;
  210.                   /*
  211. --- 196,223 ----
  212.                   $$ = invert(make_icmd(C_IF,$3,$5)); }
  213.       |    IF block compblock
  214.               { cmdline = $1;
  215. !                 $$ = make_icmd(C_IF,cmd_to_arg($2),$3); }
  216.       |    UNLESS block compblock
  217.               { cmdline = $1;
  218. !                 $$ = invert(make_icmd(C_IF,cmd_to_arg($2),$3)); }
  219.       ;
  220.   
  221.   loop    :    label WHILE '(' texpr ')' compblock
  222.               { cmdline = $2;
  223.                   $$ = wopt(add_label($1,
  224. !                 make_ccmd(C_WHILE,1,$4,$6) )); }
  225.       |    label UNTIL '(' expr ')' compblock
  226.               { cmdline = $2;
  227.                   $$ = wopt(add_label($1,
  228. !                 invert(make_ccmd(C_WHILE,1,$4,$6)) )); }
  229.       |    label WHILE block compblock
  230.               { cmdline = $2;
  231.                   $$ = wopt(add_label($1,
  232. !                 make_ccmd(C_WHILE, 1, cmd_to_arg($3),$4) )); }
  233.       |    label UNTIL block compblock
  234.               { cmdline = $2;
  235.                   $$ = wopt(add_label($1,
  236. !                 invert(make_ccmd(C_WHILE,1,cmd_to_arg($3),$4)) )); }
  237.       |    label FOR REG '(' expr crp compblock
  238.               { cmdline = $2;
  239.                   /*
  240. ***************
  241. *** 229,235 ****
  242.                       Nullarg)),
  243.                         Nullarg),
  244.                       wopt(over($3,add_label($1,
  245. !                       make_ccmd(C_WHILE,
  246.                       make_op(O_ARRAY, 1,
  247.                         stab2arg(A_STAB,scrstab),
  248.                         Nullarg,Nullarg ),
  249. --- 244,250 ----
  250.                       Nullarg)),
  251.                         Nullarg),
  252.                       wopt(over($3,add_label($1,
  253. !                       make_ccmd(C_WHILE, 0,
  254.                       make_op(O_ARRAY, 1,
  255.                         stab2arg(A_STAB,scrstab),
  256.                         Nullarg,Nullarg ),
  257. ***************
  258. *** 239,245 ****
  259.                   }
  260.                   else {
  261.                   $$ = wopt(over($3,add_label($1,
  262. !                 make_ccmd(C_WHILE,$5,$7) )));
  263.                   }
  264.               }
  265.       |    label FOR '(' expr crp compblock
  266. --- 254,260 ----
  267.                   }
  268.                   else {
  269.                   $$ = wopt(over($3,add_label($1,
  270. !                 make_ccmd(C_WHILE,1,$5,$7) )));
  271.                   }
  272.               }
  273.       |    label FOR '(' expr crp compblock
  274. ***************
  275. *** 256,262 ****
  276.                       Nullarg)),
  277.                         Nullarg),
  278.                       wopt(over(defstab,add_label($1,
  279. !                       make_ccmd(C_WHILE,
  280.                       make_op(O_ARRAY, 1,
  281.                         stab2arg(A_STAB,scrstab),
  282.                         Nullarg,Nullarg ),
  283. --- 271,277 ----
  284.                       Nullarg)),
  285.                         Nullarg),
  286.                       wopt(over(defstab,add_label($1,
  287. !                       make_ccmd(C_WHILE, 0,
  288.                       make_op(O_ARRAY, 1,
  289.                         stab2arg(A_STAB,scrstab),
  290.                         Nullarg,Nullarg ),
  291. ***************
  292. *** 266,272 ****
  293.                   }
  294.                   else {    /* lisp, anyone? */
  295.                   $$ = wopt(over(defstab,add_label($1,
  296. !                 make_ccmd(C_WHILE,$4,$6) )));
  297.                   }
  298.               }
  299.       |    label FOR '(' nexpr ';' texpr ';' nexpr ')' block
  300. --- 281,287 ----
  301.                   }
  302.                   else {    /* lisp, anyone? */
  303.                   $$ = wopt(over(defstab,add_label($1,
  304. !                 make_ccmd(C_WHILE,1,$4,$6) )));
  305.                   }
  306.               }
  307.       |    label FOR '(' nexpr ';' texpr ';' nexpr ')' block
  308. ***************
  309. *** 275,283 ****
  310.                   yyval.compval.comp_alt = $8;
  311.                   cmdline = $2;
  312.                   $$ = append_line($4,wopt(add_label($1,
  313. !                 make_ccmd(C_WHILE,$6,yyval.compval) ))); }
  314.       |    label compblock    /* a block is a loop that happens once */
  315. !             { $$ = add_label($1,make_ccmd(C_BLOCK,Nullarg,$2)); }
  316.       ;
  317.   
  318.   nexpr    :    /* NULL */
  319. --- 290,298 ----
  320.                   yyval.compval.comp_alt = $8;
  321.                   cmdline = $2;
  322.                   $$ = append_line($4,wopt(add_label($1,
  323. !                 make_ccmd(C_WHILE,1,$6,yyval.compval) ))); }
  324.       |    label compblock    /* a block is a loop that happens once */
  325. !             { $$ = add_label($1,make_ccmd(C_BLOCK,1,Nullarg,$2)); }
  326.       ;
  327.   
  328.   nexpr    :    /* NULL */
  329. ***************
  330. *** 286,298 ****
  331.       ;
  332.   
  333.   texpr    :    /* NULL means true */
  334. !             { (void)scanstr("1"); $$ = yylval.arg; }
  335.       |    expr
  336.       ;
  337.   
  338.   label    :    /* empty */
  339.               { $$ = Nullch; }
  340. !     |    WORD ':'
  341.       ;
  342.   
  343.   decl    :    format
  344. --- 301,313 ----
  345.       ;
  346.   
  347.   texpr    :    /* NULL means true */
  348. !             { (void)scanstr("1",SCAN_DEF); $$ = yylval.arg; }
  349.       |    expr
  350.       ;
  351.   
  352.   label    :    /* empty */
  353.               { $$ = Nullch; }
  354. !     |    LABEL
  355.       ;
  356.   
  357.   decl    :    format
  358. ***************
  359. *** 339,344 ****
  360. --- 354,360 ----
  361.                 curstash->tbl_coeffsize = 0;
  362.                 Safefree($2); $2 = Nullch;
  363.                 cmdline = NOLINE;
  364. +               expectterm = 2;
  365.               }
  366.       ;
  367.   
  368. ***************
  369. *** 409,415 ****
  370.               { $$ = make_op(O_BIT_OR, 2, $1, $3, Nullarg); }
  371.       |    sexpr DOTDOT sexpr
  372.               { arg4 = Nullarg;
  373. !               $$ = make_op(O_F_OR_R, 4, $1, $3, Nullarg); }
  374.       |    sexpr ANDAND sexpr
  375.               { $$ = make_op(O_AND, 2, $1, $3, Nullarg); }
  376.       |    sexpr OROR sexpr
  377. --- 425,432 ----
  378.               { $$ = make_op(O_BIT_OR, 2, $1, $3, Nullarg); }
  379.       |    sexpr DOTDOT sexpr
  380.               { arg4 = Nullarg;
  381. !               $$ = make_op(O_F_OR_R, 4, $1, $3, Nullarg);
  382. !               $$[0].arg_flags |= $2; }
  383.       |    sexpr ANDAND sexpr
  384.               { $$ = make_op(O_AND, 2, $1, $3, Nullarg); }
  385.       |    sexpr OROR sexpr
  386. ***************
  387. *** 449,454 ****
  388. --- 466,472 ----
  389.                   $$ = make_op($1, 1,
  390.                   stab2arg(A_STAB,stabent($2,TRUE)),
  391.                   Nullarg, Nullarg);
  392. +                 Safefree($2); $2 = Nullch;
  393.               }
  394.       |    FILETEST sexpr
  395.               { opargs[$1] = 1;
  396. ***************
  397. *** 487,497 ****
  398.               { $$ = make_op(O_ARRAY, 1,
  399.                   stab2arg(A_STAB,$1),
  400.                   Nullarg, Nullarg); }
  401. !     |    REG '{' expr '}'    %prec '('
  402.               { $$ = make_op(O_HELEM, 2,
  403.                   stab2arg(A_STAB,hadd($1)),
  404.                   jmaybe($3),
  405. !                 Nullarg); }
  406.       |    '(' expr crp '[' expr ']'    %prec '('
  407.               { $$ = make_op(O_LSLICE, 3,
  408.                   Nullarg,
  409. --- 505,516 ----
  410.               { $$ = make_op(O_ARRAY, 1,
  411.                   stab2arg(A_STAB,$1),
  412.                   Nullarg, Nullarg); }
  413. !     |    REG '{' expr ';' '}'    %prec '('
  414.               { $$ = make_op(O_HELEM, 2,
  415.                   stab2arg(A_STAB,hadd($1)),
  416.                   jmaybe($3),
  417. !                 Nullarg);
  418. !                 expectterm = FALSE; }
  419.       |    '(' expr crp '[' expr ']'    %prec '('
  420.               { $$ = make_op(O_LSLICE, 3,
  421.                   Nullarg,
  422. ***************
  423. *** 507,522 ****
  424.                   stab2arg(A_STAB,aadd($1)),
  425.                   listish(make_list($3)),
  426.                   Nullarg); }
  427. !     |    ARY '{' expr '}'    %prec '('
  428.               { $$ = make_op(O_HSLICE, 2,
  429.                   stab2arg(A_STAB,hadd($1)),
  430.                   listish(make_list($3)),
  431. !                 Nullarg); }
  432. !     |    DELETE REG '{' expr '}'    %prec '('
  433.               { $$ = make_op(O_DELETE, 2,
  434.                   stab2arg(A_STAB,hadd($2)),
  435.                   jmaybe($4),
  436. !                 Nullarg); }
  437.       |    ARYLEN    %prec '('
  438.               { $$ = stab2arg(A_ARYLEN,$1); }
  439.       |    RSTRING    %prec '('
  440. --- 526,549 ----
  441.                   stab2arg(A_STAB,aadd($1)),
  442.                   listish(make_list($3)),
  443.                   Nullarg); }
  444. !     |    ARY '{' expr ';' '}'    %prec '('
  445.               { $$ = make_op(O_HSLICE, 2,
  446.                   stab2arg(A_STAB,hadd($1)),
  447.                   listish(make_list($3)),
  448. !                 Nullarg);
  449. !                 expectterm = FALSE; }
  450. !     |    DELETE REG '{' expr ';' '}'    %prec '('
  451.               { $$ = make_op(O_DELETE, 2,
  452.                   stab2arg(A_STAB,hadd($2)),
  453.                   jmaybe($4),
  454. !                 Nullarg);
  455. !                 expectterm = FALSE; }
  456. !     |    DELETE '(' REG '{' expr ';' '}' ')'    %prec '('
  457. !             { $$ = make_op(O_DELETE, 2,
  458. !                 stab2arg(A_STAB,hadd($3)),
  459. !                 jmaybe($4),
  460. !                 Nullarg);
  461. !                 expectterm = FALSE; }
  462.       |    ARYLEN    %prec '('
  463.               { $$ = stab2arg(A_ARYLEN,$1); }
  464.       |    RSTRING    %prec '('
  465. ***************
  466. *** 543,559 ****
  467.                   stab2arg(A_WORD,stabent($2,MULTI)),
  468.                   make_list(Nullarg),
  469.                   Nullarg);
  470.                   $$->arg_flags |= AF_DEPR; }
  471.       |    AMPER WORD '(' ')'
  472.               { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
  473.                   stab2arg(A_WORD,stabent($2,MULTI)),
  474.                   make_list(Nullarg),
  475. !                 Nullarg); }
  476.       |    AMPER WORD
  477.               { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
  478.                   stab2arg(A_WORD,stabent($2,MULTI)),
  479.                   Nullarg,
  480. !                 Nullarg); }
  481.       |    DO REG '(' expr crp
  482.               { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
  483.                   stab2arg(A_STAB,$2),
  484. --- 570,591 ----
  485.                   stab2arg(A_WORD,stabent($2,MULTI)),
  486.                   make_list(Nullarg),
  487.                   Nullarg);
  488. +                 Safefree($2); $2 = Nullch;
  489.                   $$->arg_flags |= AF_DEPR; }
  490.       |    AMPER WORD '(' ')'
  491.               { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
  492.                   stab2arg(A_WORD,stabent($2,MULTI)),
  493.                   make_list(Nullarg),
  494. !                 Nullarg);
  495. !                 Safefree($2); $2 = Nullch;
  496. !             }
  497.       |    AMPER WORD
  498.               { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
  499.                   stab2arg(A_WORD,stabent($2,MULTI)),
  500.                   Nullarg,
  501. !                 Nullarg);
  502. !                 Safefree($2); $2 = Nullch;
  503. !             }
  504.       |    DO REG '(' expr crp
  505.               { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
  506.                   stab2arg(A_STAB,$2),
  507. ***************
  508. *** 609,620 ****
  509.               { $$ = make_op(O_OPEN, 2,
  510.                   stab2arg(A_WORD,stabent($2,TRUE)),
  511.                   stab2arg(A_STAB,stabent($2,TRUE)),
  512. !                 Nullarg); }
  513.       |    OPEN '(' WORD ')'
  514.               { $$ = make_op(O_OPEN, 2,
  515.                   stab2arg(A_WORD,stabent($3,TRUE)),
  516.                   stab2arg(A_STAB,stabent($3,TRUE)),
  517. !                 Nullarg); }
  518.       |    OPEN '(' handle cexpr ')'
  519.               { $$ = make_op(O_OPEN, 2,
  520.                   $3,
  521. --- 641,656 ----
  522.               { $$ = make_op(O_OPEN, 2,
  523.                   stab2arg(A_WORD,stabent($2,TRUE)),
  524.                   stab2arg(A_STAB,stabent($2,TRUE)),
  525. !                 Nullarg);
  526. !                 Safefree($2); $2 = Nullch;
  527. !             }
  528.       |    OPEN '(' WORD ')'
  529.               { $$ = make_op(O_OPEN, 2,
  530.                   stab2arg(A_WORD,stabent($3,TRUE)),
  531.                   stab2arg(A_STAB,stabent($3,TRUE)),
  532. !                 Nullarg);
  533. !                 Safefree($3); $3 = Nullch;
  534. !             }
  535.       |    OPEN '(' handle cexpr ')'
  536.               { $$ = make_op(O_OPEN, 2,
  537.                   $3,
  538. ***************
  539. *** 763,769 ****
  540.               { $$ = make_op($1,2,
  541.                   stab2arg(A_WORD,stabent($2,TRUE)),
  542.                   stab2arg(A_STAB,defstab),
  543. !                 Nullarg); }
  544.       |    LISTOP WORD expr
  545.               { $$ = make_op($1,2,
  546.                   stab2arg(A_WORD,stabent($2,TRUE)),
  547. --- 799,807 ----
  548.               { $$ = make_op($1,2,
  549.                   stab2arg(A_WORD,stabent($2,TRUE)),
  550.                   stab2arg(A_STAB,defstab),
  551. !                 Nullarg);
  552. !                 Safefree($2); $2 = Nullch;
  553. !             }
  554.       |    LISTOP WORD expr
  555.               { $$ = make_op($1,2,
  556.                   stab2arg(A_WORD,stabent($2,TRUE)),
  557. ***************
  558. *** 823,828 ****
  559. --- 861,867 ----
  560.                   warn(
  561.                     "\"%s\" may clash with future reserved word",
  562.                     $1 );
  563. +                 Safefree($1); $1 = Nullch;
  564.               }
  565.           ;
  566.   %% /* PROGRAM */
  567.  
  568. Index: atarist/test/pi.pl
  569. *** atarist/test/pi.pl.old    Mon Jun  8 17:45:13 1992
  570. --- atarist/test/pi.pl    Mon Jun  8 17:45:13 1992
  571. ***************
  572. *** 0 ****
  573. --- 1,174 ----
  574. + # ---------------------------------------------------------------------------
  575. + # pi.perl  computes pi (3.14...) about 5120 Digits
  576. + #
  577. + # W. Kebsch, July-1988  {uunet!mcvax}!unido!nixpbe!kebsch
  578. + $my_name = $0;
  579. + $version = $my_name . "-1.2";
  580. + # some working parameter
  581. + $smax =  5120;          # max digits
  582. + $lmax =     4;          # digits per one array element
  583. + $hmax = 10000;          # one array element contains: 0..9999
  584. + $smin = $lmax;          # min digits
  585. + $mag  =     7;          # magic number
  586. + # subroutines
  587. + sub mul_tm              # multiply the tm array with a long value
  588. + {
  589. +     $cb = pop(@_);      # elements(array)
  590. +     $x  = pop(@_);      # value
  591. +     $c = 0;
  592. +     for($i = 1; $i <= $cb; $i++)
  593. +     {
  594. +     $z      = $tm[$i] * $x + $c;
  595. +     $c      = int($z / $hmax);
  596. +     $tm[$i] = $z - $c * $hmax;
  597. +     }
  598. + }
  599. + sub mul_pm              # multiply the pm array with a long value
  600. + {
  601. +     $cb = pop(@_);      # elements(array)
  602. +     $x  = pop(@_);      # value
  603. +     $c = 0;
  604. +     for($i = 1; $i <= $cb; $i++)
  605. +     {
  606. +     $z      = $pm[$i] * $x + $c;
  607. +     $c      = int($z / $hmax);
  608. +     $pm[$i] = $z - $c * $hmax;
  609. +     }
  610. + }
  611. + sub divide              # divide the tm array by a long value
  612. + {
  613. +     $cb = pop(@_);      # elements(array)
  614. +     $x  = pop(@_);      # value
  615. +     $c = 0;
  616. +     for($i = $cb; $i >= 1; $i--)
  617. +     {
  618. +     $z      = $tm[$i] + $c;
  619. +     $q      = int($z / $x);
  620. +     $tm[$i] = $q;
  621. +     $c      = ($z - $q * $x) * $hmax;
  622. +     }
  623. + }
  624. + sub add                 # add tm array to pm array
  625. + {
  626. +     $cb = pop(@_);      # elements(array)
  627. +     $c = 0;
  628. +     for($i = 1; $i <= $cb; $i++)
  629. +     {
  630. +     $z = $pm[$i] + $tm[$i] + $c;
  631. +     if($z >= $hmax)
  632. +     {
  633. +         $pm[$i] = $z - $hmax;
  634. +         $c      = 1;
  635. +     }
  636. +     else
  637. +     {
  638. +         $pm[$i] = $z;
  639. +         $c      = 0;
  640. +     }
  641. +     }
  642. + }
  643. + $m0 = 0; $m1 = 0; $m2 = 0;
  644. + sub check_xb            # reduce current no. of elements (speed up!)
  645. + {
  646. +     $cb = pop(@_);      # current no. of elements
  647. +     if(($pm[$cb] == $m0) && ($pm[$cb - 1] == $m1) && ($pm[$cb - 2] == $m2))
  648. +     {
  649. +     $cb--;
  650. +     }
  651. +     $m0 = $pm[$cb];
  652. +     $m1 = $pm[$cb - 1];
  653. +     $m2 = $pm[$cb - 2];
  654. +     $cb;
  655. + }
  656. + sub display             # show the result
  657. + {
  658. +     $cb = pop(@_);      # elements(array);
  659. +     printf("\n%3d.", $pm[$cb]);
  660. +     $j = $mag - $lmax;
  661. +     for($i = $cb - 1; $i >= $j; $i--)
  662. +     {
  663. +     printf(" %04d", $pm[$i]);
  664. +     }
  665. +     print "\n";
  666. + }
  667. + sub the_job             # let's do the job
  668. + {
  669. +     $s = pop(@_);       # no. of digits
  670. +     $s  = int(($s + $lmax - 1) / $lmax) * $lmax;
  671. +     $b  = int($s / $lmax) + $mag - $lmax;
  672. +     $xb = $b;
  673. +     $t  = int($s * 5 / 3);
  674. +     for($i = 1; $i <= $b; $i++)         # init arrays
  675. +     {
  676. +     $pm[$i] = 0;
  677. +     $tm[$i] = 0;
  678. +     }
  679. +     $pm[$b - 1] = $hmax / 2;
  680. +     $tm[$b - 1] = $hmax / 2;
  681. +     printf("digits:%5d, terms:%5d, elements:%5d\n", $s, $t, $b);
  682. +     for($n = 1; $n <= $t; $n++)
  683. +     {
  684. +     printf("\r\t\t\t  term:%5d", $n);
  685. +     if($n < 200)
  686. +     {
  687. +         do mul_tm((4 * ($n * $n - $n) + 1), $xb);
  688. +     }
  689. +     else
  690. +     {
  691. +         do mul_tm((2 * $n - 1), $xb);
  692. +         do mul_tm((2 * $n - 1), $xb);
  693. +     }
  694. +     if($n < 100)
  695. +     {
  696. +         do divide(($n * (16 * $n + 8)), $xb);
  697. +     }
  698. +     else
  699. +     {
  700. +         do divide((8 * $n), $xb);
  701. +         do divide((2 * $n + 1), $xb);
  702. +     }
  703. +     do add($xb);
  704. +     if($xb > $mag)
  705. +     {
  706. +         $xb = do check_xb($xb);
  707. +     }
  708. +     }
  709. +     do mul_pm(6, $b);
  710. +     do display($b);
  711. +     ($user,$sys,$cuser,$csys) = times;
  712. +     printf("\n[u=%g  s=%g  cu=%g  cs=%g]\n",$user, $sys, $cuser, $csys);
  713. + }
  714. + # main block ----------------------------------------------------------------
  715. + $no_of_args = $#ARGV + 1;
  716. + print("$version, ");
  717. + die("usage: $my_name <no. of digits>") unless($no_of_args == 1);
  718. + $digits = int($ARGV[0]);
  719. + die("no. of digits out of range [$smin\..$smax]")
  720. +                 unless(($digits >= $smin) && ($digits <= $smax));
  721. + do the_job($digits);
  722. + exit 0;
  723. + # That's all ----------------------------------------------------------------
  724.  
  725. Index: pstruct
  726. *** pstruct.old    Mon Jun  8 17:51:29 1992
  727. --- pstruct    Mon Jun  8 17:51:30 1992
  728. ***************
  729. *** 0 ****
  730. --- 1,1071 ----
  731. + #!/usr/local/bin/perl
  732. + #
  733. + #
  734. + #   c2ph (aka pstruct)
  735. + #   Tom Christiansen, <tchrist@convex.com>
  736. + #   
  737. + #   As pstruct, dump C structures as generated from 'cc -g -S' stabs.
  738. + #   As c2ph, do this PLUS generate perl code for getting at the structures.
  739. + #
  740. + #   See the usage message for more.  If this isn't enough, read the code.
  741. + #
  742. + $RCSID = '$RCSfile: pstruct,v $$Revision: 4.0.1.1 $$Date: 92/06/08 15:19:40 $';
  743. + ######################################################################
  744. + # some handy data definitions.   many of these can be reset later.
  745. + $bitorder = 'b';  # ascending; set to B for descending bit fields
  746. + %intrinsics = 
  747. + %template = (
  748. +     'char',             'c',
  749. +     'unsigned char',         'C',
  750. +     'short',            's',
  751. +     'short int',        's',
  752. +     'unsigned short',        'S',
  753. +     'unsigned short int',    'S',
  754. +     'short unsigned int',    'S',
  755. +     'int',            'i',
  756. +     'unsigned int',        'I',
  757. +     'long',            'l',
  758. +     'long int',            'l',
  759. +     'unsigned long',        'L',
  760. +     'unsigned long',        'L',
  761. +     'long unsigned int',    'L',
  762. +     'unsigned long int',    'L',
  763. +     'long long',        'q',
  764. +     'long long int',        'q',
  765. +     'unsigned long long',    'Q',
  766. +     'unsigned long long int',    'Q',
  767. +     'float',            'f',
  768. +     'double',            'd',
  769. +     'pointer',            'p',
  770. +     'null',            'x',
  771. +     'neganull',            'X',
  772. +     'bit',            $bitorder,
  773. + ); 
  774. + &buildscrunchlist;
  775. + delete $intrinsics{'neganull'};
  776. + delete $intrinsics{'bit'};
  777. + delete $intrinsics{'null'};
  778. + # use -s to recompute sizes
  779. + %sizeof = (
  780. +     'char',             '1',
  781. +     'unsigned char',         '1',
  782. +     'short',            '2',
  783. +     'short int',        '2',
  784. +     'unsigned short',        '2',
  785. +     'unsigned short int',    '2',
  786. +     'short unsigned int',    '2',
  787. +     'int',            '4',
  788. +     'unsigned int',        '4',
  789. +     'long',            '4',
  790. +     'long int',            '4',
  791. +     'unsigned long',        '4',
  792. +     'unsigned long int',    '4',
  793. +     'long unsigned int',    '4',
  794. +     'long long',        '8',
  795. +     'long long int',        '8',
  796. +     'unsigned long long',    '8',
  797. +     'unsigned long long int',    '8',
  798. +     'float',            '4',
  799. +     'double',            '8',
  800. +     'pointer',            '4',
  801. + );
  802. + ($type_width, $member_width, $offset_width, $size_width) = (20, 20, 6, 5);
  803. + ($offset_fmt, $size_fmt) = ('d', 'd');
  804. + $indent = 2;
  805. + $CC = 'cc';
  806. + $CFLAGS = '-g -S';
  807. + $DEFINES = '';
  808. + $perl++ if $0 =~ m#/?c2ph$#;
  809. + require 'getopts.pl';
  810. + eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;
  811. + &Getopts('aixdpvtnws:') || &usage(0);
  812. + $opt_d && $debug++;
  813. + $opt_t && $trace++;
  814. + $opt_p && $perl++;
  815. + $opt_v && $verbose++;
  816. + $opt_n && ($perl = 0);
  817. + if ($opt_w) {
  818. +     ($type_width, $member_width, $offset_width) = (45, 35, 8);
  819. + } 
  820. + if ($opt_x) {
  821. +     ($offset_fmt, $offset_width, $size_fmt, $size_width) = ( 'x', '08', 'x', 04 );
  822. + }
  823. + eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;
  824. + sub PLUMBER {
  825. +     select(STDERR);
  826. +     print "oops, apperent pager foulup\n";
  827. +     $isatty++;
  828. +     &usage(1);
  829. + } 
  830. + sub usage {
  831. +     local($oops) = @_;
  832. +     unless (-t STDOUT) {
  833. +     select(STDERR);
  834. +     } elsif (!$oops) {
  835. +     $isatty++;
  836. +     $| = 1;
  837. +     print "hit <RETURN> for further explanation: ";
  838. +     <STDIN>;
  839. +     open (PIPE, "|". ($ENV{PAGER} || 'more'));
  840. +     $SIG{PIPE} = PLUMBER;
  841. +     select(PIPE);
  842. +     } 
  843. +     print "usage: $0 [-dpnP] [var=val] [files ...]\n";
  844. +     exit unless $isatty;
  845. +     print <<EOF;
  846. + Options:
  847. + -w    wide; short for: type_width=45 member_width=35 offset_width=8
  848. + -x    hex; short for:  offset_fmt=x offset_width=08 size_fmt=x size_width=04
  849. + -n      do not generate perl code  (default when invoked as pstruct)
  850. + -p      generate perl code         (default when invoked as c2ph)
  851. + -v    generate perl code, with C decls as comments
  852. + -i    do NOT recompute sizes for intrinsic datatypes
  853. + -a    dump information on intrinsics also
  854. + -t     trace execution
  855. + -d    spew reams of debugging output
  856. + -slist  give comma-separated list a structures to dump
  857. + Var Name        Default Value    Meaning
  858. + EOF
  859. +     &defvar('CC', 'which_compiler to call');
  860. +     &defvar('CFLAGS', 'how to generate *.s files with stabs');
  861. +     &defvar('DEFINES','any extra cflags or cpp defines, like -I, -D, -U');
  862. +     print "\n";
  863. +     &defvar('type_width', 'width of type field   (column 1)');
  864. +     &defvar('member_width', 'width of member field (column 2)');
  865. +     &defvar('offset_width', 'width of offset field (column 3)');
  866. +     &defvar('size_width', 'width of size field   (column 4)');
  867. +     print "\n";
  868. +     &defvar('offset_fmt', 'sprintf format type for offset');
  869. +     &defvar('size_fmt', 'sprintf format type for size');
  870. +     print "\n";
  871. +     &defvar('indent', 'how far to indent each nesting level');
  872. +    print <<'EOF';
  873. +     If any *.[ch] files are given, these will be catted together into
  874. +     a temporary *.c file and sent through:
  875. +         $CC $CFLAGS $DEFINES 
  876. +     and the resulting *.s groped for stab information.  If no files are
  877. +     supplied, then stdin is read directly with the assumption that it
  878. +     contains stab information.  All other liens will be ignored.  At
  879. +     most one *.s file should be supplied.
  880. + EOF
  881. +     close PIPE;
  882. +     exit 1;
  883. + } 
  884. + sub defvar {
  885. +     local($var, $msg) = @_;
  886. +     printf "%-16s%-15s  %s\n", $var, eval "\$$var", $msg;
  887. + } 
  888. + $recurse = 1;
  889. + if (@ARGV) {
  890. +     if (grep(!/\.[csh]$/,@ARGV)) {
  891. +     warn "Only *.[csh] files expected!\n";
  892. +     &usage;
  893. +     } 
  894. +     elsif (grep(/\.s$/,@ARGV)) {
  895. +     if (@ARGV > 1) { 
  896. +         warn "Only one *.s file allowed!\n";
  897. +         &usage;
  898. +     }
  899. +     } 
  900. +     elsif (@ARGV == 1 && $ARGV[0] =~ /\.c$/) {
  901. +     local($dir, $file) = $ARGV[0] =~ m#(.*/)?(.*)$#;
  902. +     $chdir = "cd $dir; " if $dir;
  903. +     &system("$chdir$CC $CFLAGS $DEFINES $file") && exit 1;
  904. +     $ARGV[0] =~ s/\.c$/.s/;
  905. +     } 
  906. +     else {
  907. +     $TMP = "/tmp/c2ph.$$.c";
  908. +     &system("cat @ARGV > $TMP") && exit 1;
  909. +     &system("cd /tmp; $CC $CFLAGS $DEFINES $TMP") && exit 1;
  910. +     unlink $TMP;
  911. +     $TMP =~ s/\.c$/.s/;
  912. +     @ARGV = ($TMP);
  913. +     } 
  914. + }
  915. + if ($opt_s) {
  916. +     for (split(/[\s,]+/, $opt_s)) {
  917. +     $interested{$_}++;
  918. +     } 
  919. + } 
  920. + $| = 1 if $debug;
  921. + main: {
  922. +     if ($trace) {
  923. +     if (-t && !@ARGV) { 
  924. +         print STDERR "reading from your keyboard: ";
  925. +     } else {
  926. +         print STDERR "reading from " . (@ARGV ? "@ARGV" : "<STDIN>").": ";
  927. +     }
  928. +     }
  929. + STAB: while (<>) {
  930. +     if ($trace && !($. % 10)) {
  931. +         $lineno = $..'';
  932. +         print STDERR $lineno, "\b" x length($lineno);
  933. +     } 
  934. +     next unless /^\s*\.stabs\s+/;
  935. +     $line = $_;
  936. +     s/^\s*\.stabs\s+//; 
  937. +     &stab; 
  938. +     }
  939. +     print STDERR "$.\n" if $trace;
  940. +     unlink $TMP if $TMP;
  941. +     &compute_intrinsics if $perl && !$opt_i;
  942. +     print STDERR "resolving types\n" if $trace;
  943. +     &resolve_types;
  944. +     &adjust_start_addrs;
  945. +     $sum = 2 + $type_width + $member_width;
  946. +     $pmask1 = "%-${type_width}s %-${member_width}s"; 
  947. +     $pmask2 = "%-${sum}s %${offset_width}${offset_fmt}%s %${size_width}${size_fmt}%s";
  948. +     if ($perl) {
  949. +     # resolve template -- should be in stab define order, but even this isn't enough.
  950. +     print STDERR "\nbuilding type templates: " if $trace;
  951. +     for $i (reverse 0..$#type) {
  952. +         next unless defined($name = $type[$i]);
  953. +         next unless defined $struct{$name};
  954. +         $build_recursed = 0;
  955. +         &build_template($name) unless defined $template{&psou($name)} ||
  956. +                     $opt_s && !$interested{$name};
  957. +     } 
  958. +     print STDERR "\n\n" if $trace;
  959. +     }
  960. +     print STDERR "dumping structs: " if $trace;
  961. +     foreach $name (sort keys %struct) {
  962. +     next if $opt_s && !$interested{$name};
  963. +     print STDERR "$name " if $trace;
  964. +     undef @sizeof;
  965. +     undef @typedef;
  966. +     undef @offsetof;
  967. +     undef @indices;
  968. +     undef @typeof;
  969. +     $mname = &munge($name);
  970. +     $fname = &psou($name);
  971. +     print "# " if $perl && $verbose;
  972. +     $pcode = '';
  973. +     print "$fname {\n" if !$perl || $verbose; 
  974. +     $template{$fname} = &scrunch($template{$fname}) if $perl;
  975. +     &pstruct($name,$name,0); 
  976. +     print "# " if $perl && $verbose;
  977. +     print "}\n" if !$perl || $verbose; 
  978. +     print "\n" if $perl && $verbose;
  979. +     if ($perl) {
  980. +         print "$pcode";
  981. +         printf("\nsub %-32s { %4d; }\n\n", "${mname}'struct", $countof{$name});
  982. +         print <<EOF;
  983. + sub ${mname}'typedef { 
  984. +     local(\$${mname}'index) = shift;
  985. +     defined \$${mname}'index 
  986. +     ? \$${mname}'typedef[\$${mname}'index] 
  987. +     : \$${mname}'typedef;
  988. + }
  989. + EOF
  990. +         print <<EOF;
  991. + sub ${mname}'sizeof { 
  992. +     local(\$${mname}'index) = shift;
  993. +     defined \$${mname}'index 
  994. +     ? \$${mname}'sizeof[\$${mname}'index] 
  995. +     : \$${mname}'sizeof;
  996. + }
  997. + EOF
  998. +         print <<EOF;
  999. + sub ${mname}'offsetof { 
  1000. +     local(\$${mname}'index) = shift;
  1001. +     defined \$${mname}index 
  1002. +     ? \$${mname}'offsetof[\$${mname}'index] 
  1003. +     : \$${mname}'sizeof;
  1004. + }
  1005. + EOF
  1006. +         print <<EOF;
  1007. + sub ${mname}'typeof { 
  1008. +     local(\$${mname}'index) = shift;
  1009. +     defined \$${mname}index 
  1010. +     ? \$${mname}'typeof[\$${mname}'index] 
  1011. +     : '$name';
  1012. + }
  1013. + EOF
  1014. +     
  1015. +         print "\$${mname}'typedef = '" . &scrunch($template{$fname}) 
  1016. +         . "';\n";
  1017. +         print "\$${mname}'sizeof = $sizeof{$name};\n\n";
  1018. +         print "\@${mname}'indices = (", &squishseq(@indices), ");\n";
  1019. +         print "\n";
  1020. +         print "\@${mname}'typedef[\@${mname}'indices] = (",
  1021. +             join("\n\t", '', @typedef), "\n    );\n\n";
  1022. +         print "\@${mname}'sizeof[\@${mname}'indices] = (",
  1023. +             join("\n\t", '', @sizeof), "\n    );\n\n";
  1024. +         print "\@${mname}'offsetof[\@${mname}'indices] = (",
  1025. +             join("\n\t", '', @offsetof), "\n    );\n\n";
  1026. +         print "\@${mname}'typeof[\@${mname}'indices] = (",
  1027. +             join("\n\t", '', @typeof), "\n    );\n\n";
  1028. +         $template_printed{$fname}++;
  1029. +         $size_printed{$fname}++;
  1030. +     } 
  1031. +     print "\n";
  1032. +     }
  1033. +     print STDERR "\n" if $trace;
  1034. +     unless ($perl && $opt_a) { 
  1035. +     print "\n1;\n";
  1036. +     exit;
  1037. +     }
  1038. +     foreach $name (sort bysizevalue keys %intrinsics) {
  1039. +     next if $size_printed{$name};
  1040. +     print '$',&munge($name),"'sizeof = ", $sizeof{$name}, ";\n";
  1041. +     }
  1042. +     print "\n";
  1043. +     sub bysizevalue { $sizeof{$a} <=> $sizeof{$b}; }
  1044. +     foreach $name (sort keys %intrinsics) {
  1045. +     print '$',&munge($name),"'typedef = '", $template{$name}, "';\n";
  1046. +     }
  1047. +     print "\n1;\n";
  1048. +     
  1049. +     exit;
  1050. + }
  1051. + ########################################################################################
  1052. + sub stab {
  1053. +     next unless /:[\$\w]+(\(\d+,\d+\))?=[\*\$\w]+/;  # (\d+,\d+) is for sun
  1054. +     s/"//                         || next;
  1055. +     s/",([x\d]+),([x\d]+),([x\d]+),.*//         || next;
  1056. +     next if /^\s*$/;
  1057. +     $size = $3 if $3;
  1058. +     $line = $_;
  1059. +     if (($name, $pdecl) = /^([\$ \w]+):[tT]((\d+)(=[rufs*](\d+))+)$/) {
  1060. +     print "$name is a typedef for some funky pointers: $pdecl\n" if $debug;
  1061. +     &pdecl($pdecl);
  1062. +     next;
  1063. +     }
  1064. +     if (/(([ \w]+):t(\d+|\(\d+,\d+\)))=r?(\d+|\(\d+,\d+\))(;\d+;\d+;)?/) {  
  1065. +     local($ident) = $2;
  1066. +     push(@intrinsics, $ident);
  1067. +     $typeno = &typeno($3);
  1068. +     $type[$typeno] = $ident;
  1069. +     print STDERR "intrinsic $ident in new type $typeno\n" if $debug; 
  1070. +     next;
  1071. +     }
  1072. +     if (($name, $typeordef, $typeno, $extra, $struct, $_) 
  1073. +     = /^([\$ \w]+):([ustT])(\d+|\(\d+,\d+\))(=[rufs*](\d+))?(.*)$/) 
  1074. +     {
  1075. +     $typeno = &typeno($typeno);  # sun foolery
  1076. +     } 
  1077. +     elsif (/^[\$\w]+:/) {
  1078. +     next; # variable
  1079. +     }
  1080. +     else { 
  1081. +     warn "can't grok stab: <$_> in: $line " if $_;
  1082. +     next;
  1083. +     } 
  1084. +     #warn "got size $size for $name\n";
  1085. +     $sizeof{$name} = $size if $size;
  1086. +     s/;[-\d]*;[-\d]*;$//;  # we don't care about ranges
  1087. +     $typenos{$name} = $typeno;
  1088. +     unless (defined $type[$typeno]) {
  1089. +     &panic("type 0??") unless $typeno;
  1090. +     $type[$typeno] = $name unless defined $type[$typeno];
  1091. +     printf "new type $typeno is $name" if $debug;
  1092. +     if ($extra =~ /\*/ && defined $type[$struct]) {
  1093. +         print ", a typedef for a pointer to " , $type[$struct] if $debug;
  1094. +     }
  1095. +     } else {
  1096. +     printf "%s is type %d", $name, $typeno if $debug;
  1097. +     print ", a typedef for " , $type[$typeno] if $debug;
  1098. +     } 
  1099. +     print "\n" if $debug;
  1100. +     #next unless $extra =~ /[su*]/;
  1101. +     #$type[$struct] = $name;
  1102. +     if ($extra =~ /[us*]/) {
  1103. +     &sou($name, $extra);
  1104. +     $_ = &sdecl($name, $_, 0);
  1105. +     }
  1106. +     elsif (/^=ar/) {
  1107. +     print "it's a bare array typedef -- that's pretty sick\n" if $debug;
  1108. +     $_ = "$typeno$_";
  1109. +     $scripts = '';
  1110. +     $_ = &adecl($_,1);
  1111. +     }
  1112. +     elsif (s/((\w+):t(\d+|\(\d+,\d+\)))?=r?(;\d+;\d+;)?//) {  # the ?'s are for gcc
  1113. +     push(@intrinsics, $2);
  1114. +     $typeno = &typeno($3);
  1115. +     $type[$typeno] = $2;
  1116. +     print STDERR "intrinsic $2 in new type $typeno\n" if $debug; 
  1117. +     }
  1118. +     elsif (s/^=e//) { # blessed by thy compiler; mine won't do this
  1119. +     &edecl;
  1120. +     } 
  1121. +     else {
  1122. +     warn "Funny remainder for $name on line $_ left in $line " if $_;
  1123. +     } 
  1124. + }
  1125. + sub typeno {  # sun thinks types are (0,27) instead of just 27
  1126. +     local($_) = @_;
  1127. +     s/\(\d+,(\d+)\)/$1/;
  1128. +     $_;
  1129. + } 
  1130. + sub pstruct {
  1131. +     local($what,$prefix,$base) = @_; 
  1132. +     local($field, $fieldname, $typeno, $count, $offset, $entry); 
  1133. +     local($fieldtype);
  1134. +     local($type, $tname); 
  1135. +     local($mytype, $mycount, $entry2);
  1136. +     local($struct_count) = 0;
  1137. +     local($pad, $revpad, $length, $prepad, $lastoffset, $lastlength, $fmt);
  1138. +     local($bits,$bytes);
  1139. +     local($template);
  1140. +     local($mname) = &munge($name);
  1141. +     sub munge { 
  1142. +     local($_) = @_;
  1143. +     s/[\s\$\.]/_/g;
  1144. +     $_;
  1145. +     }
  1146. +     local($sname) = &psou($what);
  1147. +     $nesting++;
  1148. +     for $field (split(/;/, $struct{$what})) {
  1149. +     $pad = $prepad = 0;
  1150. +     $entry = ''; 
  1151. +     ($fieldname, $typeno, $count, $offset, $length) = split(/,/, $field); 
  1152. +     $type = $type[$typeno];
  1153. +     $type =~ /([^[]*)(\[.*\])?/;
  1154. +     $mytype = $1;
  1155. +     $count .= $2;
  1156. +     $fieldtype = &psou($mytype);
  1157. +     local($fname) = &psou($name);
  1158. +     if ($build_templates) {
  1159. +         $pad = ($offset - ($lastoffset + $lastlength))/8 
  1160. +         if defined $lastoffset;
  1161. +         if (! $finished_template{$sname}) {
  1162. +         if ($isaunion{$what}) {
  1163. +             $template{$sname} .= 'X' x $revpad . ' '    if $revpad;
  1164. +         } else {
  1165. +             $template{$sname} .= 'x' x $pad    . ' '    if $pad;
  1166. +         }
  1167. +         }
  1168. +         $template = &fetch_template($type) x 
  1169. +                 ($count ? &scripts2count($count) : 1);
  1170. +         if (! $finished_template{$sname}) {
  1171. +         $template{$sname} .= $template;
  1172. +         }
  1173. +         $revpad = $length/8 if $isaunion{$what};
  1174. +         ($lastoffset, $lastlength) = ($offset, $length);
  1175. +     } else { 
  1176. +         print '# ' if $perl && $verbose;
  1177. +         $entry = sprintf($pmask1,
  1178. +             ' ' x ($nesting * $indent) . $fieldtype,
  1179. +             "$prefix.$fieldname" . $count); 
  1180. +         $entry =~ s/(\*+)( )/$2$1/; 
  1181. +         printf $pmask2,
  1182. +             $entry,
  1183. +             ($base+$offset)/8,
  1184. +             ($bits = ($base+$offset)%8) ? ".$bits" : "  ",
  1185. +             $length/8,
  1186. +             ($bits = $length % 8) ? ".$bits": ""
  1187. +             if !$perl || $verbose;
  1188. +         if ($perl && $nesting == 1) {
  1189. +         $template = &scrunch(&fetch_template($type) x 
  1190. +                 ($count ? &scripts2count($count) : 1));
  1191. +         push(@sizeof, int($length/8) .",\t# $fieldname");
  1192. +         push(@offsetof, int($offset/8) .",\t# $fieldname");
  1193. +         push(@typedef, "'$template', \t# $fieldname");
  1194. +         $type =~ s/(struct|union) //;
  1195. +         push(@typeof, "'$type" . ($count ? $count : '') .
  1196. +             "',\t# $fieldname");
  1197. +         }
  1198. +         print '  ', ' ' x $indent x $nesting, $template
  1199. +                 if $perl && $verbose;
  1200. +         print "\n" if !$perl || $verbose;
  1201. +     }    
  1202. +     if ($perl) {
  1203. +         local($mycount) = defined $struct{$mytype} ? $countof{$mytype} : 1;
  1204. +         $mycount *= &scripts2count($count) if $count;
  1205. +         if ($nesting==1 && !$build_templates) {
  1206. +         $pcode .= sprintf("sub %-32s { %4d; }\n", 
  1207. +             "${mname}'${fieldname}", $struct_count);
  1208. +         push(@indices, $struct_count);
  1209. +         }
  1210. +         $struct_count += $mycount;
  1211. +     } 
  1212. +     &pstruct($type, "$prefix.$fieldname", $base+$offset) 
  1213. +         if $recurse && defined $struct{$type}; 
  1214. +     }
  1215. +     $countof{$what} = $struct_count unless defined $countof{$whati};
  1216. +     $template{$sname} .= '$' if $build_templates;
  1217. +     $finished_template{$sname}++;
  1218. +     if ($build_templates && !defined $sizeof{$name}) {
  1219. +     local($fmt) = &scrunch($template{$sname});
  1220. +     print STDERR "no size for $name, punting with $fmt..." if $debug;
  1221. +     eval '$sizeof{$name} = length(pack($fmt, ()))';
  1222. +     if ($@) {
  1223. +         chop $@;
  1224. +         warn "couldn't get size for \$name: $@";
  1225. +     } else {
  1226. +         print STDERR $sizeof{$name}, "\n" if $debUg;
  1227. +     }
  1228. +     } 
  1229. +     --$nesting;
  1230. + }
  1231. + sub psize {
  1232. +     local($me) = @_; 
  1233. +     local($amstruct) = $struct{$me} ?  'struct ' : '';
  1234. +     print '$sizeof{\'', $amstruct, $me, '\'} = '; 
  1235. +     printf "%d;\n", $sizeof{$me}; 
  1236. + }
  1237. + sub pdecl {
  1238. +     local($pdecl) = @_;
  1239. +     local(@pdecls);
  1240. +     local($tname);
  1241. +     warn "pdecl: $pdecl\n" if $debug;
  1242. +     $pdecl =~ s/\(\d+,(\d+)\)/$1/g;
  1243. +     $pdecl =~ s/\*//g; 
  1244. +     @pdecls = split(/=/, $pdecl); 
  1245. +     $typeno = $pdecls[0];
  1246. +     $tname = pop @pdecls;
  1247. +     if ($tname =~ s/^f//) { $tname = "$tname&"; } 
  1248. +     #else { $tname = "$tname*"; } 
  1249. +     for (reverse @pdecls) {
  1250. +     $tname  .= s/^f// ? "&" : "*"; 
  1251. +     #$tname =~ s/^f(.*)/$1&/;
  1252. +     print "type[$_] is $tname\n" if $debug;
  1253. +     $type[$_] = $tname unless defined $type[$_];
  1254. +     } 
  1255. + }
  1256. + sub adecl {
  1257. +     ($arraytype, $unknown, $lower, $upper) = ();
  1258. +     #local($typeno);
  1259. +     # global $typeno, @type
  1260. +     local($_, $typedef) = @_;
  1261. +     while (s/^((\d+)=)?ar(\d+);//) {
  1262. +     ($arraytype, $unknown) = ($2, $3); 
  1263. +     if (s/^(\d+);(\d+);//) {
  1264. +         ($lower, $upper) = ($1, $2); 
  1265. +         $scripts .= '[' .  ($upper+1) . ']'; 
  1266. +     } else {
  1267. +         warn "can't find array bounds: $_"; 
  1268. +     } 
  1269. +     }
  1270. +     if (s/^([\d*f=]*),(\d+),(\d+);//) {
  1271. +     ($start, $length) = ($2, $3); 
  1272. +     local($whatis) = $1;
  1273. +     if ($whatis =~ /^(\d+)=/) {
  1274. +         $typeno = $1;
  1275. +         &pdecl($whatis);
  1276. +     } else {
  1277. +         $typeno = $whatis;
  1278. +     }
  1279. +     } elsif (s/^(\d+)(=[*suf]\d*)//) {
  1280. +     local($whatis) = $2; 
  1281. +     if ($whatis =~ /[f*]/) {
  1282. +         &pdecl($whatis); 
  1283. +     } elsif ($whatis =~ /[su]/) {  # 
  1284. +         print "$prefix.$fieldname is an array$scripts anon structs; disgusting\n" 
  1285. +         if $debug;
  1286. +         #$type[$typeno] = $name unless defined $type[$typeno];
  1287. +         ##printf "new type $typeno is $name" if $debug;
  1288. +         $typeno = $1;
  1289. +         $type[$typeno] = "$prefix.$fieldname";
  1290. +         local($name) = $type[$typeno];
  1291. +         &sou($name, $whatis);
  1292. +         $_ = &sdecl($name, $_, $start+$offset);
  1293. +         1;
  1294. +         $start = $start{$name};
  1295. +         $offset = $sizeof{$name};
  1296. +         $length = $offset;
  1297. +     } else {
  1298. +         warn "what's this? $whatis in $line ";
  1299. +     } 
  1300. +     } elsif (/^\d+$/) {
  1301. +     $typeno = $_;
  1302. +     } else {
  1303. +     warn "bad array stab: $_ in $line ";
  1304. +     next STAB;
  1305. +     } 
  1306. +     #local($wasdef) = defined($type[$typeno]) && $debug;
  1307. +     #if ($typedef) { 
  1308. +     #print "redefining $type[$typeno] to " if $wasdef;
  1309. +     #$type[$typeno] = "$whatis$scripts"; # unless defined $type[$typeno];
  1310. +     #print "$type[$typeno]\n" if $wasdef;
  1311. +     #} else {
  1312. +     #$type[$arraytype] = $type[$typeno] unless defined $type[$arraytype];
  1313. +     #}
  1314. +     $type[$arraytype] = "$type[$typeno]$scripts" if defined $type[$typeno];
  1315. +     print "type[$arraytype] is $type[$arraytype]\n" if $debug;
  1316. +     print "$prefix.$fieldname is an array of $type[$arraytype]\n" if $debug;
  1317. +     $_;
  1318. + }
  1319. + sub sdecl {
  1320. +     local($prefix, $_, $offset) = @_;
  1321. +     local($fieldname, $scripts, $type, $arraytype, $unknown,
  1322. +     $whatis, $pdecl, $upper,$lower, $start,$length) = ();
  1323. +     local($typeno,$sou);
  1324. + SFIELD:
  1325. +     while (/^([^;]+);/) {
  1326. +     $scripts = '';
  1327. +     warn "sdecl $_\n" if $debug;
  1328. +     if (s/^([\$\w]+)://) { 
  1329. +         $fieldname = $1;
  1330. +     } elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { # 
  1331. +         $typeno = &typeno($1);
  1332. +         $type[$typeno] = "$prefix.$fieldname";
  1333. +         local($name) = "$prefix.$fieldname";
  1334. +         &sou($name,$2);
  1335. +         $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
  1336. +         $start = $start{$name};
  1337. +         $offset += $sizeof{$name};
  1338. +         #print "done with anon, start is $start, offset is $offset\n";
  1339. +         #next SFIELD;
  1340. +     } else  {
  1341. +         warn "weird field $_ of $line" if $debug;
  1342. +         next STAB;
  1343. +         #$fieldname = &gensym;
  1344. +         #$_ = &sdecl("$prefix.$fieldname", $_, $start+$offset);
  1345. +     }
  1346. +     if (/^\d+=ar/) {
  1347. +         $_ = &adecl($_);
  1348. +     }
  1349. +     elsif (s/^(\d+|\(\d+,\d+\))?,(\d+),(\d+);//) {
  1350. +         ($start, $length) =  ($2, $3); 
  1351. +         &panic("no length?") unless $length;
  1352. +         $typeno = &typeno($1) if $1;
  1353. +     }
  1354. +     elsif (s/^((\d+|\(\d+,\d+\))(=[*f](\d+|\(\d+,\d+\)))+),(\d+),(\d+);//) {
  1355. +         ($pdecl, $start, $length) =  ($1,$5,$6); 
  1356. +         &pdecl($pdecl); 
  1357. +     }
  1358. +     elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { # the dratted anon struct
  1359. +         ($typeno, $sou) = ($1, $2);
  1360. +         $typeno = &typeno($typeno);
  1361. +         if (defined($type[$typeno])) {
  1362. +         warn "now how did we get type $1 in $fieldname of $line?";
  1363. +         } else {
  1364. +         print "anon type $typeno is $prefix.$fieldname\n" if $debug;
  1365. +         $type[$typeno] = "$prefix.$fieldname" unless defined $type[$typeno];
  1366. +         };
  1367. +         local($name) = "$prefix.$fieldname";
  1368. +         &sou($name,$sou);
  1369. +         print "anon ".($isastruct{$name}) ? "struct":"union"." for $prefix.$fieldname\n" if $debug;
  1370. +         $type[$typeno] = "$prefix.$fieldname";
  1371. +         $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset); 
  1372. +         $start = $start{$name};
  1373. +         $length = $sizeof{$name};
  1374. +     }
  1375. +     else {
  1376. +         warn "can't grok stab for $name ($_) in line $line "; 
  1377. +         next STAB; 
  1378. +     }
  1379. +     &panic("no length for $prefix.$fieldname") unless $length;
  1380. +     $struct{$name} .= join(',', $fieldname, $typeno, $scripts, $start, $length) . ';';
  1381. +     }
  1382. +     if (s/;\d*,(\d+),(\d+);//) {
  1383. +     local($start, $size) = ($1, $2); 
  1384. +     $sizeof{$prefix} = $size;
  1385. +     print "start of $prefix is $start, size of $sizeof{$prefix}\n" if $debug; 
  1386. +     $start{$prefix} = $start; 
  1387. +     } 
  1388. +     $_;
  1389. + }
  1390. + sub edecl {
  1391. +     s/;$//;
  1392. +     $enum{$name} = $_;
  1393. +     $_ = '';
  1394. + } 
  1395. + sub resolve_types {
  1396. +     local($sou);
  1397. +     for $i (0 .. $#type) {
  1398. +     next unless defined $type[$i];
  1399. +     $_ = $type[$i];
  1400. +     unless (/\d/) {
  1401. +         print "type[$i] $type[$i]\n" if $debug;
  1402. +         next;
  1403. +     }
  1404. +     print "type[$i] $_ ==> " if $debug;
  1405. +     s/^(\d+)(\**)\&\*(\**)/"$2($3".&type($1) . ')()'/e;
  1406. +     s/^(\d+)\&/&type($1)/e; 
  1407. +     s/^(\d+)/&type($1)/e; 
  1408. +     s/(\*+)([^*]+)(\*+)/$1$3$2/;
  1409. +     s/\((\*+)(\w+)(\*+)\)/$3($1$2)/;
  1410. +     s/^(\d+)([\*\[].*)/&type($1).$2/e;
  1411. +     #s/(\d+)(\*|(\[[\[\]\d\*]+]\])+)/&type($1).$2/ge;
  1412. +     $type[$i] = $_;
  1413. +     print "$_\n" if $debug;
  1414. +     }
  1415. + }
  1416. + sub type { &psou($type[$_[0]] || "<UNDEFINED>"); } 
  1417. + sub adjust_start_addrs {
  1418. +     for (sort keys %start) {
  1419. +     ($basename = $_) =~ s/\.[^.]+$//;
  1420. +     $start{$_} += $start{$basename};
  1421. +     print "start: $_ @ $start{$_}\n" if $debug;
  1422. +     }
  1423. + }
  1424. + sub sou {
  1425. +     local($what, $_) = @_;
  1426. +     /u/ && $isaunion{$what}++;
  1427. +     /s/ && $isastruct{$what}++;
  1428. + }
  1429. + sub psou {
  1430. +     local($what) = @_;
  1431. +     local($prefix) = '';
  1432. +     if ($isaunion{$what})  {
  1433. +     $prefix = 'union ';
  1434. +     } elsif ($isastruct{$what})  {
  1435. +     $prefix = 'struct ';
  1436. +     }
  1437. +     $prefix . $what;
  1438. + }
  1439. + sub scrunch {
  1440. +     local($_) = @_;
  1441. +     study;
  1442. +     s/\$//g;
  1443. +     s/  / /g;
  1444. +     1 while s/(\w) \1/$1$1/g;
  1445. +     # i wanna say this, but perl resists my efforts:
  1446. +     #       s/(\w)(\1+)/$2 . length($1)/ge;
  1447. +     &quick_scrunch;
  1448. +     s/ $//;
  1449. +     $_;
  1450. + }
  1451. + sub buildscrunchlist {
  1452. +     $scrunch_code = "sub quick_scrunch {\n";
  1453. +     for (values %intrinsics) {
  1454. +         $scrunch_code .= "\ts/($_{2,})/'$_' . length(\$1)/ge;\n";
  1455. +     } 
  1456. +     $scrunch_code .= "}\n";
  1457. +     print "$scrunch_code" if $debug;
  1458. +     eval $scrunch_code;
  1459. +     &panic("can't eval scrunch_code $@ \nscrunch_code") if $@;
  1460. + } 
  1461. + sub fetch_template {
  1462. +     local($mytype) = @_;
  1463. +     local($fmt);
  1464. +     local($count) = 1;
  1465. +     &panic("why do you care?") unless $perl;
  1466. +     if ($mytype =~ s/(\[\d+\])+$//) {
  1467. +     $count .= $1;
  1468. +     } 
  1469. +     if ($mytype =~ /\*/) {
  1470. +     $fmt = $template{'pointer'};
  1471. +     } 
  1472. +     elsif (defined $template{$mytype}) {
  1473. +     $fmt = $template{$mytype};
  1474. +     } 
  1475. +     elsif (defined $struct{$mytype}) {
  1476. +     if (!defined $template{&psou($mytype)}) {
  1477. +         &build_template($mytype) unless $mytype eq $name;
  1478. +     } 
  1479. +     elsif ($template{&psou($mytype)} !~ /\$$/) {
  1480. +         #warn "incomplete template for $mytype\n";
  1481. +     } 
  1482. +     $fmt = $template{&psou($mytype)} || '?';
  1483. +     } 
  1484. +     else {
  1485. +     warn "unknown fmt for $mytype\n";
  1486. +     $fmt = '?';
  1487. +     } 
  1488. +     $fmt x $count . ' ';
  1489. + }
  1490. + sub compute_intrinsics {
  1491. +     local($TMP) = "/tmp/c2ph-i.$$.c";
  1492. +     open (TMP, ">$TMP") || die "can't open $TMP: $!";
  1493. +     select(TMP);
  1494. +     print STDERR "computing intrinsic sizes: " if $trace;
  1495. +     undef %intrinsics;
  1496. +     print <<'EOF';
  1497. + main() {
  1498. +     char *mask = "%d %s\n";
  1499. + EOF
  1500. +     for $type (@intrinsics) {
  1501. +     next if $type eq 'void';
  1502. +     print <<"EOF";
  1503. +     printf(mask,sizeof($type), "$type");
  1504. + EOF
  1505. +     } 
  1506. +     print <<'EOF';
  1507. +     printf(mask,sizeof(char *), "pointer");
  1508. +     exit(0);
  1509. + }
  1510. + EOF
  1511. +     close TMP;
  1512. +     select(STDOUT);
  1513. +     open(PIPE, "cd /tmp && $CC $TMP && /tmp/a.out|");
  1514. +     while (<PIPE>) {
  1515. +     chop;
  1516. +     split(' ',$_,2);;
  1517. +     print "intrinsic $_[1] is size $_[0]\n" if $debug;
  1518. +     $sizeof{$_[1]} = $_[0];
  1519. +     $intrinsics{$_[1]} = $template{$_[0]};
  1520. +     } 
  1521. +     close(PIPE) || die "couldn't read intrinsics!";
  1522. +     unlink($TMP, '/tmp/a.out');
  1523. +     print STDERR "done\n" if $trace;
  1524. + } 
  1525. + sub scripts2count {
  1526. +     local($_) = @_;
  1527. +     s/^\[//;
  1528. +     s/\]$//;
  1529. +     s/\]\[/*/g;
  1530. +     $_ = eval;
  1531. +     &panic("$_: $@") if $@;
  1532. +     $_;
  1533. + }
  1534. + sub system {
  1535. +     print STDERR "@_\n" if $trace;
  1536. +     system @_;
  1537. + } 
  1538. + sub build_template { 
  1539. +     local($name) = @_;
  1540. +     &panic("already got a template for $name") if defined $template{$name};
  1541. +     local($build_templates) = 1;
  1542. +     local($lparen) = '(' x $build_recursed;
  1543. +     local($rparen) = ')' x $build_recursed;
  1544. +     print STDERR "$lparen$name$rparen " if $trace;
  1545. +     $build_recursed++;
  1546. +     &pstruct($name,$name,0);
  1547. +     print STDERR "TEMPLATE for $name is ", $template{&psou($name)}, "\n" if $debug;
  1548. +     --$build_recursed;
  1549. + }
  1550. + sub panic {
  1551. +     select(STDERR);
  1552. +     print "\npanic: @_\n";
  1553. +     exit 1 if $] <= 4.003;  # caller broken
  1554. +     local($i,$_);
  1555. +     local($p,$f,$l,$s,$h,$a,@a,@sub);
  1556. +     for ($i = 0; ($p,$f,$l,$s,$h,$w) = caller($i); $i++) {
  1557. +     @a = @DB'args;
  1558. +     for (@a) {
  1559. +         if (/^StB\000/ && length($_) == length($_main{'_main'})) {
  1560. +         $_ = sprintf("%s",$_);
  1561. +         }
  1562. +         else {
  1563. +         s/'/\\'/g;
  1564. +         s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/;
  1565. +         s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
  1566. +         s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
  1567. +         }
  1568. +     }
  1569. +     $w = $w ? '@ = ' : '$ = ';
  1570. +     $a = $h ? '(' . join(', ', @a) . ')' : '';
  1571. +     push(@sub, "$w&$s$a from file $f line $l\n");
  1572. +     last if $signal;
  1573. +     }
  1574. +     for ($i=0; $i <= $#sub; $i++) {
  1575. +     last if $signal;
  1576. +     print $sub[$i];
  1577. +     }
  1578. +     exit 1;
  1579. + } 
  1580. + sub squishseq {
  1581. +     local($num);
  1582. +     local($last) = -1e8;
  1583. +     local($string);
  1584. +     local($seq) = '..';
  1585. +     while (defined($num = shift)) {
  1586. +         if ($num == ($last + 1)) {
  1587. +             $string .= $seq unless $inseq++;
  1588. +             $last = $num;
  1589. +             next;
  1590. +         } elsif ($inseq) {
  1591. +             $string .= $last unless $last == -1e8;
  1592. +         }
  1593. +         $string .= ',' if defined $string;
  1594. +         $string .= $num;
  1595. +         $last = $num;
  1596. +         $inseq = 0;
  1597. +     }
  1598. +     $string .= $last if $inseq && $last != -e18;
  1599. +     $string;
  1600. + }
  1601.  
  1602. Index: lib/pwd.pl
  1603. Prereq: 4.0
  1604. *** lib/pwd.pl.old    Mon Jun  8 17:49:09 1992
  1605. --- lib/pwd.pl    Mon Jun  8 17:49:10 1992
  1606. ***************
  1607. *** 1,8 ****
  1608.   ;# pwd.pl - keeps track of current working directory in PWD environment var
  1609.   ;#
  1610. ! ;# $Header: pwd.pl,v 4.0 91/03/20 01:26:03 lwall Locked $
  1611.   ;#
  1612.   ;# $Log:    pwd.pl,v $
  1613.   ;# Revision 4.0  91/03/20  01:26:03  lwall
  1614.   ;# 4.0 baseline.
  1615.   ;# 
  1616. --- 1,11 ----
  1617.   ;# pwd.pl - keeps track of current working directory in PWD environment var
  1618.   ;#
  1619. ! ;# $RCSfile: pwd.pl,v $$Revision: 4.0.1.1 $$Date: 92/06/08 13:45:22 $
  1620.   ;#
  1621.   ;# $Log:    pwd.pl,v $
  1622. + ;# Revision 4.0.1.1  92/06/08  13:45:22  lwall
  1623. + ;# patch20: support added to pwd.pl to strip automounter crud
  1624. + ;# 
  1625.   ;# Revision 4.0  91/03/20  01:26:03  lwall
  1626.   ;# 4.0 baseline.
  1627.   ;# 
  1628. ***************
  1629. *** 25,33 ****
  1630.       if ($ENV{'PWD'}) {
  1631.       local($dd,$di) = stat('.');
  1632.       local($pd,$pi) = stat($ENV{'PWD'});
  1633. !     return if $di == $pi && $dd == $pd;
  1634.       }
  1635. !     chop($ENV{'PWD'} = `pwd`);
  1636.   }
  1637.   
  1638.   sub main'chdir {
  1639. --- 28,47 ----
  1640.       if ($ENV{'PWD'}) {
  1641.       local($dd,$di) = stat('.');
  1642.       local($pd,$pi) = stat($ENV{'PWD'});
  1643. !     if ($di != $pi || $dd != $pd) {
  1644. !         chop($ENV{'PWD'} = `pwd`);
  1645. !     }
  1646.       }
  1647. !     else {
  1648. !     chop($ENV{'PWD'} = `pwd`);
  1649. !     }
  1650. !     if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) {
  1651. !     local($pd,$pi) = stat($2);
  1652. !     local($dd,$di) = stat($1);
  1653. !     if ($di == $pi && $dd == $pd) {
  1654. !         $ENV{'PWD'}="$2$3";
  1655. !     }
  1656. !     }
  1657.   }
  1658.   
  1659.   sub main'chdir {
  1660.  
  1661. Index: t/op/readdir.t
  1662. *** t/op/readdir.t.old    Mon Jun  8 17:52:11 1992
  1663. --- t/op/readdir.t    Mon Jun  8 17:52:11 1992
  1664. ***************
  1665. *** 6,18 ****
  1666.   print "1..3\n";
  1667.   
  1668.   if (opendir(OP, "op")) { print "ok 1\n"; } else { print "not ok 1\n"; }
  1669. ! @D = grep(/^[^\.]/, readdir(OP));
  1670.   closedir(OP);
  1671.   
  1672.   if (@D > 20 && @D < 100) { print "ok 2\n"; } else { print "not ok 2\n"; }
  1673.   
  1674.   @R = sort @D;
  1675. ! @G = <op/*>;
  1676.   while (@R && @G && "op/".$R[0] eq $G[0]) {
  1677.       shift(@R);
  1678.       shift(@G);
  1679. --- 6,18 ----
  1680.   print "1..3\n";
  1681.   
  1682.   if (opendir(OP, "op")) { print "ok 1\n"; } else { print "not ok 1\n"; }
  1683. ! @D = grep(/^[^\.].*\.t$/, readdir(OP));
  1684.   closedir(OP);
  1685.   
  1686.   if (@D > 20 && @D < 100) { print "ok 2\n"; } else { print "not ok 2\n"; }
  1687.   
  1688.   @R = sort @D;
  1689. ! @G = <op/*.t>;
  1690.   while (@R && @G && "op/".$R[0] eq $G[0]) {
  1691.       shift(@R);
  1692.       shift(@G);
  1693.  
  1694. Index: atarist/test/readme
  1695. *** atarist/test/readme.old    Mon Jun  8 17:45:19 1992
  1696. --- atarist/test/readme    Mon Jun  8 17:45:19 1992
  1697. ***************
  1698. *** 0 ****
  1699. --- 1,3 ----
  1700. + this directory contain simple tests for the atariST port. to run a test
  1701. + simply enter
  1702. +     perl file
  1703.  
  1704. Index: hints/ultrix_1.sh
  1705. *** hints/ultrix_1.sh.old    Mon Jun  8 17:48:25 1992
  1706. --- hints/ultrix_1.sh    Mon Jun  8 17:48:26 1992
  1707. ***************
  1708. *** 0 ****
  1709. --- 1 ----
  1710. + ccflags="$ccflags -DULTRIX_STDIO_BOTCH"
  1711.  
  1712. *** End of Patch 30 ***
  1713. exit 0 # Just in case...
  1714.