Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!apple!ames!purdue!haven!mimsy!chris From: chris@mimsy.UUCP (Chris Torek) Newsgroups: comp.unix.questions Subject: Re: weird if-then-else behavior in "csh" Keywords: csh if Message-ID: <18058@mimsy.UUCP> Date: 13 Jun 89 21:02:21 GMT References: <540@acf2.NYU.EDU> Distribution: usa Organization: U of Maryland, Dept. of Computer Science, Coll. Pk., MD 20742 Lines: 57 In article <540@acf2.NYU.EDU> mckenney@acf2.NYU.EDU (Alan Michael McKenney) writes: >... The only difference between the [csh if/then/else example that works >and the one that does not] is that the second "if" in the second file is >immediately followed by "(", rather than " (". (In general, the "if" >command seems to require spaces in many non-intuitive places.) In general, the C shell's `parser' does not. (Parse, that is.) > Is this a bug, a feature, or what? How could it be anything but a bug? It is not documented. :-) > And further, is there any good guide as to where spaces are required >in "if" statements in "csh" (other than just putting them everywhere >that they are legal)? The trick is that, when skipping a false `if', the C shell uses a completely different routine than when it is reading commands for the purpose of actually executing them. The latter routine breaks things at spaces, parentheses, and other `special' characters, while the former breaks only at spaces. The false-if-skipping-code looks for a line which, after being broken at spaces, starts with `if' and ends with `then', with code like the following: count = 1; do { read line; break at spaces; if (strcmp(word[0], "endif") == 0) count--; else if (strcmp(word[0], "if") == 0 && strcmp(word[nwords-1], "then") == 0) count++; } while (count); So: if (0) then # enter above pseudo-code if then # count now reaches 2 if obviously&*csh[ would (never? like this` then # now 3 endif this is bad # now 2 endif # now 1 endif # count reaches 0 echo this gets echoed. # and we revert to the normal parser But if you take out the first `if (0) then' you get an error (`if: Expression syntax'); if you take out the first and second you get a different error (`Unmatched `.'). If you put arguments after `endif' inside a true `if' you get still another error. The false-if-skipping-code recognises only `first word is "if", last word is "then"', and breaks only at whitespace, so if you always put a space after an `if' and one before a `then', you should never have trouble. -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163) Domain: chris@mimsy.umd.edu Path: uunet!mimsy!chris