pc doesn't allow an ``others'' clause in outputs
Chris Torek
chris at umcp-cs.UUCP
Mon Nov 5 17:08:06 AEST 1984
Index: ucb/pc/src 4.2BSD Fix
Description:
While not strictly a bug, the lack of a specifier for a
default case label can be quite a pain. The changes included
here are straight from Cornell; though their changes were
for version 2.0, the code has been tested in version 3.0
and appears to work.
Repeat-By:
program main (input, output);
var i : integer;
begin
read (i);
case i of
1 : writeln ('one');
2 : writeln ('two');
others : writeln ('neither one nor two');
end;
end.
Fix:
Apply the appended diff listings.
Chris
RCS file: RCS/hash.c,v
retrieving revision 1.1
diff -c1 -r1.1 hash.c
*** /tmp/,RCSt1004856 Mon Nov 5 01:52:22 1984
--- hash.c Mon Nov 5 01:18:54 1984
***************
*** 63,64
"external", YEXTERN,
0
--- 63,65 -----
"external", YEXTERN,
+ "others", YOTHERS,
0
RCS file: RCS/pas.y,v
retrieving revision 1.1
diff -c1 -r1.1 pas.y
*** /tmp/,RCSt1004861 Mon Nov 5 01:52:27 1984
--- pas.y Mon Nov 5 01:18:37 1984
***************
*** 67,68
YCASELAB YILLCH YEXTERN YLAST
--- 67,69 -----
YCASELAB YILLCH YEXTERN YLAST
+ YOTHERS
***************
*** 542,543
= $$ = tree4(T_CSTAT, lineof($1), NIL, $2);
|
--- 543,547 -----
= $$ = tree4(T_CSTAT, lineof($1), NIL, $2);
+ |
+ YOTHERS ':' stat
+ = $$ = tree4(T_OTHERCASE, lineof($2), NIL, $3);
|
RCS file: RCS/pccaseop.c,v
retrieving revision 1.1
diff -c1 -r1.1 pccaseop.c
*** /tmp/,RCSt1004866 Mon Nov 5 01:52:35 1984
--- pccaseop.c Mon Nov 5 01:18:46 1984
***************
*** 47,49
* [3] list of cased statements:
! * cstat [0] T_CSTAT
* [1] lineof ":"
--- 47,49 -----
* [3] list of cased statements:
! * cstat [0] T_CSTAT or T_OTHERCASE
* [1] lineof ":"
***************
*** 68,69
long *casep;
struct ct *ctab;
--- 68,70 -----
long *casep;
+ long *othercase;
struct ct *ctab;
***************
*** 155,156
count = 0;
for ( cstatlp = tcase[3] ; cstatlp != NIL ; cstatlp = cstatlp[2] ) {
--- 156,158 -----
count = 0;
+ othercase = NIL;
for ( cstatlp = tcase[3] ; cstatlp != NIL ; cstatlp = cstatlp[2] ) {
***************
*** 160,161
}
line = cstatp[1];
--- 162,171 -----
}
+ if ( cstatp[0] == T_OTHERCASE ) {
+ if ( othercase != NIL ) {
+ error("Too many 'others' cases; only one allowed");
+ } else {
+ othercase = cstatp;
+ }
+ continue;
+ }
line = cstatp[1];
***************
*** 195,197
}
- noreach = nr;
/*
--- 205,206 -----
}
/*
***************
*** 197,199
/*
! * default action is to call error
*/
--- 206,209 -----
/*
! * default action is to call error,
! * unless there is an ``others:'' label.
*/
***************
*** 200,206
putlab( ctab[0].clabel );
! putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR ) , "_CASERNG" );
! putRV( 0 , cbn , exprnlp -> value[ NL_OFFS ] ,
! exprnlp -> extra_flags , P2INT );
! putop( P2CALL , P2INT );
! putdot( filename , line );
/*
--- 210,226 -----
putlab( ctab[0].clabel );
! if ( othercase == NIL ) {
! putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR ) , "_CASERNG" );
! putRV( 0 , cbn , exprnlp -> value[ NL_OFFS ] ,
! exprnlp -> extra_flags , P2INT );
! putop( P2CALL , P2INT );
! putdot( filename , line );
! } else {
! level++;
! statement( othercase[3] );
! nr = (nr && noreach);
! noreach = 0;
! level--;
! putjbr( endlabel );
! }
! noreach = nr;
/*
RCS file: RCS/tree.h,v
retrieving revision 1.1
diff -c1 -r1.1 tree.h
*** /tmp/,RCSt1004871 Mon Nov 5 01:52:40 1984
--- tree.h Mon Nov 5 01:18:49 1984
***************
*** 84
#define T_LAST 81
--- 84,85 -----
#define T_LAST 81
+ #define T_OTHERCASE 82
--
(This mind accidently left blank.)
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (301) 454-7690
UUCP: {seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet: chris at umcp-cs ARPA: chris at maryland
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list