home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume35 / zsh / part15 < prev    next >
Text File  |  1993-02-20  |  56KB  |  1,889 lines

  1. Newsgroups: comp.sources.misc
  2. From: zsh-list@cs.uow.edu.au (The Zsh Mailing List)
  3. Subject: v35i065:  zsh - The Z Shell, version 2.3.1, Part15/22
  4. Message-ID: <1993Feb20.212627.29125@sparky.imd.sterling.com>
  5. X-Md4-Signature: 8665e41aee9765e7da349210419eafd3
  6. Date: Sat, 20 Feb 1993 21:26:27 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: zsh-list@cs.uow.edu.au (The Zsh Mailing List)
  10. Posting-number: Volume 35, Issue 65
  11. Archive-name: zsh/part15
  12. Environment: UNIX
  13. Supersedes: zsh2.2: Volume 29, Issue 97-113
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # Contents:  help/bindkey help/unalias help/unsetopt src/parse.c
  22. # Wrapped by mattson@odin on Sat Feb  6 14:41:54 1993
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 15 (of 22)."'
  26. if test -f 'help/bindkey' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'help/bindkey'\"
  28. else
  29.   echo shar: Extracting \"'help/bindkey'\" \(19763 characters\)
  30.   sed "s/^X//" >'help/bindkey' <<'END_OF_FILE'
  31. X     bindkey -mevd
  32. X     bindkey -r in-string ...
  33. X     bindkey [ -a ] in-string [ command ] ...
  34. X     bindkey -s [ -a ] in-string out-string ...
  35. X          If one of the -e, -v, or -d options is given, reset the
  36. X          keymaps  for  emacs mode, vi mode, or the default mode,
  37. X          respectively; if the -m option is also given, allow the
  38. X          use  of  a meta key.  If the -r option is given, remove
  39. X          any binding for each in-string.  If the  -s  option  is
  40. X          not  specified, bind each in-string to a specified com-
  41. X          mand.  If no command is specified, print the binding of
  42. X          in-string if it is bound, or return a nonzero exit code
  43. X          if it is not bound.  If the  -s  option  is  specified,
  44. X          bind each in-string to each specified out-string.  When
  45. X          in-string is typed, out-string will be pushed back  and
  46. X          treated  as input to the line editor.  If the -a option
  47. X          is specified, bind the in-strings  in  the  alternative
  48. X          keymap  instead  of  the standard one.  The alternative
  49. X          keymap is used in vi command mode.
  50. X
  51. X          For either in-string or out-string, control  characters
  52. X          may  be specified in the form ^X, and the backslash may
  53. X          be used  to  introduce  one  of  the  following  escape
  54. X          sequences:
  55. X               \a   bell character
  56. X               \n   linefeed (newline)
  57. X               \b   backspace
  58. X               \t   horizontal tab
  59. X               \v   vertical tab
  60. X               \f   form feed
  61. X               \r   carriage return
  62. X               \e   escape
  63. X               \nnn character code in octal
  64. X               \M-xxx
  65. X                    character or escape sequence  with  meta  bit
  66. X                    set
  67. X
  68. X          In all other cases, \ escapes the following  character.
  69. X          Delete is written as `^?'.
  70. X
  71. X     vi-backward-blank-word (unbound) (B)
  72. X          Move backward one word, where a word is  defined  as  a
  73. X          series of non-blank characters.
  74. X
  75. X     backward-char (^B ESC-[D) ()
  76. X          Move backward one character.
  77. X
  78. X     vi-backward-char () (h)
  79. X          Move backward one character, without changing lines.
  80. X
  81. X     backward-word (ESC-B ESC-b) (unbound)
  82. X          Move to the beginning of the previous word.
  83. X
  84. X     emacs-backward-word
  85. X          Move to the beginning of the previous word.
  86. X
  87. X     vi-backward-word (unbound) (b)
  88. X          Move to the beginning of the previous word, vi-style.
  89. X
  90. X     beginning-of-line (^A) (0)
  91. X          Move to the beginning of the line.  If already  at  the
  92. X          beginning  of  the  line,  move to the beginning of the
  93. X          previous line, if any.
  94. X
  95. X     vi-beginning-of-line
  96. X          Move to the beginning of  the  line,  without  changing
  97. X          lines.
  98. X
  99. X     end-of-line (^E)
  100. X          Move to the end of the line.  If already at the end  of
  101. X          the line, move to the end of the next line, if any.
  102. X
  103. X     vi-end-of-line (unbound) ($)
  104. X          Move to the end of the line.
  105. X
  106. X     vi-forward-blank-word (unbound) (W)
  107. X          Move forward one word, where a word  is  defined  as  a
  108. X          series of non-blank characters.
  109. X
  110. X     vi-forward-blank-word-end (unbound) (E)
  111. X          Move to the end of the current word, or, if at the  end
  112. X          of the current word, to the end of the next word, where
  113. X          a word is defined as a series of non-blank characters.
  114. X
  115. X     forward-char (^F ESC-[C)
  116. X          Move forward one character.
  117. X
  118. X     vi-forward-char (unbound) (space l)
  119. X          Move forward one character.
  120. X
  121. X     vi-find-next-char (^X^F) (f)
  122. X          Read a character from the keyboard,  and  move  to  the
  123. X          next occurrence of it in the line.
  124. X
  125. X     vi-find-next-char-skip (unbound) (t)
  126. X          Read a character from the keyboard,  and  move  to  the
  127. X          position  just  before the next occurrence of it in the
  128. X          line.
  129. X
  130. X     vi-find-prev-char (unbound) (F)
  131. X          Read a character from the keyboard,  and  move  to  the
  132. X          previous occurrence of it in the line.
  133. X
  134. X     vi-find-prev-char-skip (unbound) (T)
  135. X          Read a character from the keyboard,  and  move  to  the
  136. X          position  just  after  the previous occurrence of it in
  137. X          the line.
  138. X
  139. X     vi-first-non-blank (unbound) (^)
  140. X          Move to the first non-blank character in the line.
  141. X
  142. X     vi-forward-word (unbound) (w)
  143. X          Move forward one word, vi-style.
  144. X
  145. X     forward-word (ESC-F ESC-f) (unbound)
  146. X          Move to the beginning of the next word.   The  editor's
  147. X          idea  of a word is specified with the WORDCHARS parame-
  148. X          ter.
  149. X
  150. X     emacs-forward-word
  151. X          Move to the end of the next word.
  152. X
  153. X     vi-forward-word-end (unbound) (e)
  154. X          Move to the end of the next word.
  155. X
  156. X     vi-goto-column (ESC-|) (|)
  157. X          Move to the column specified by the numeric argument.
  158. X
  159. X     vi-goto-mark (unbound) (`)
  160. X          Move to the specified mark.
  161. X
  162. X     vi-goto-mark-line (unbound) (')
  163. X          Move to beginning of the line containing the  specified
  164. X          mark.
  165. X
  166. X     vi-repeat-find (unbound) (;)
  167. X          Repeat the last vi-find command.
  168. X
  169. X     vi-rev-repeat-find (unbound) (,)
  170. X          Repeat the last vi-find command in the opposite  direc-
  171. X          tion.
  172. X
  173. X     beginning-of-buffer-or-history (ESC-<)
  174. X          Move to the beginning of  the  buffer,  or  if  already
  175. X          there, move to the first event in the history list.
  176. X
  177. X     beginning-of-line-hist
  178. X          Move to the beginning of the line.  If already  at  the
  179. X          beginning  of  the buffer, move to the previous history
  180. X          line.
  181. X
  182. X     beginning-of-history
  183. X          Move to the first event in the history list.
  184. X
  185. X     down-line-or-history (^N ESC-[B) (+ j)
  186. X          Move down a line in the buffer, or if  already  at  the
  187. X          bottom  line,  move  to  the  next event in the history
  188. X          list.
  189. X
  190. X     down-line-or-search
  191. X          Move down a line in the buffer, or if  already  at  the
  192. X          bottom  line,  search forward in the history for a line
  193. X          beginning with the first word in the buffer.
  194. X
  195. X     down-history (unbound) (^N)
  196. X          Move to the next event in the history list.
  197. X
  198. X     end-of-buffer-or-history (ESC->)
  199. X          Move to the end of the buffer,  or  if  already  there,
  200. X          move to the last event in the history list.
  201. X
  202. X     end-of-line-hist
  203. X          Move to the end of the line.  If already at the end  of
  204. X          the buffer, move to the next history line.
  205. X
  206. X     end-of-history
  207. X          Move to the last event in the history list.
  208. X
  209. X     vi-fetch-history (unbound) (G)
  210. X          Fetch the history line specified by the  numeric  argu-
  211. X          ment.
  212. X
  213. X     history-incremental-search-backward (^R ^Xr)
  214. X          Search backward incrementally for a  specified  string.
  215. X          The  string  may begin with `^' to anchor the search to
  216. X          the beginning of the line.
  217. X
  218. X     history-incremental-search-forward (^Xs)
  219. X          Search forward incrementally for  a  specified  string.
  220. X          The  string  may begin with `^' to anchor the search to
  221. X          the beginning of the line.
  222. X
  223. X     history-search-backward (ESC-P ESC-p) (K)
  224. X          Search backward in the history  for  a  line  beginning
  225. X          with the first word in the buffer.
  226. X
  227. X     vi-history-search-backward (unbound) (/)
  228. X          Search backward in the history for a specified  string.
  229. X          The  string  may begin with `^' to anchor the search to
  230. X          the beginning of the line.
  231. X
  232. X     history-search-forward (ESC-N ESC-n) (J)
  233. X          Search forward in the history for a line beginning with
  234. X          the first word in the buffer.
  235. X
  236. X     vi-history-search-forward (unbound) (?)
  237. X          Search forward in the history for a  specified  string.
  238. X          The  string  may begin with `^' to anchor the search to
  239. X          the beginning of the line.
  240. X
  241. X     infer-next-history (^X^N)
  242. X          Search in the history list  for  a  line  matching  the
  243. X          current one and fetch the event following it.
  244. X
  245. X     insert-last-word (ESC-_ ESC-.)
  246. X          Insert the last word from the previous history event at
  247. X          the cursor position.
  248. X
  249. X     vi-repeat-search (unbound) (n)
  250. X          Repeat the last vi history search.
  251. X
  252. X     vi-rev-repeat-search (unbound) (N)
  253. X          Repeat the last vi history search, but in reverse.
  254. X
  255. X     toggle-literal-history (ESC-R ESC-r)
  256. X          Toggle  between  literal  and  lexical  history.    The
  257. X          default is lexical history unless the HISTLIT option is
  258. X          set.
  259. X
  260. X     up-line-or-history (^P ESC-[A) (- k)
  261. X          Move up a line in the buffer, or if already at the  top
  262. X          line, move to the previous event in the history list.
  263. X
  264. X     up-line-or-search
  265. X          Move up a line in the buffer, or if already at the  top
  266. X          line,  search backward in the history for a line begin-
  267. X          ning with the first word in the buffer.
  268. X
  269. X     up-history (unbound) (^P)
  270. X          Move to the previous event in the history list.
  271. X
  272. X     vi-add-eol (unbound) (A)
  273. X          Move to the end of the line and enter insert mode.
  274. X
  275. X     vi-add-next (unbound) (a)
  276. X          Move forward one character and enter insert mode.
  277. X
  278. X     backward-delete-char (^H ^?) (^?)
  279. X          Delete the character behind the cursor.
  280. X
  281. X     vi-backward-delete-char (unbound) (X)
  282. X          Delete the character behind the cursor, without  chang-
  283. X          ing lines.
  284. X
  285. X     backward-delete-word
  286. X          Delete the word behind the cursor.
  287. X
  288. X     backward-kill-line
  289. X          Kill from the beginning of the line to the cursor posi-
  290. X          tion.
  291. X
  292. X     backward-kill-word (^W ESC-^H ESC-^?)
  293. X          Kill the word behind the cursor.
  294. X
  295. X     vi-backward-kill-word (unbound) (^W)
  296. X          Kill the word behind the cursor.
  297. X
  298. X     capitalize-word (ESC-C ESC-c)
  299. X          Capitalize the current word and move past it.
  300. X
  301. X     vi-change (unbound) (c)
  302. X          Read a movement command from  the  keyboard,  and  kill
  303. X          from  the  cursor position to the endpoint of the move-
  304. X          ment.  Then enter insert mode.  If the command  is  vi-
  305. X          change, kill the current line.
  306. X
  307. X     vi-change-eol (unbound) (C)
  308. X          Kill to the end of the line and enter insert mode.
  309. X
  310. X     vi-change-whole-line (unbound) (S s)
  311. X          Kill the current line and enter insert mode.
  312. X
  313. X     copy-region-as-kill (ESC-W ESC-w)
  314. X          Copy the area from the cursor to the mark to  the  kill
  315. X          buffer.
  316. X
  317. X     copy-prev-word (ESC-^_)
  318. X          Duplicate the word behind the cursor.
  319. X
  320. X     vi-delete (unbound) (d)
  321. X          Read a movement command from  the  keyboard,  and  kill
  322. X          from  the  cursor position to the endpoint of the move-
  323. X          ment.  If the command is vi-delete,  kill  the  current
  324. X          line.
  325. X
  326. X     delete-char (unbound) (x)
  327. X          Delete the character under the cursor.
  328. X
  329. X     vi-delete-char (unbound) (x)
  330. X          Delete the character under the cursor.
  331. X
  332. X     delete-word (ESC-D ESC-d)
  333. X          Delete the current word.
  334. X
  335. X     down-case-word (ESC-L ESC-l)
  336. X          Convert the current word to all lowercase and move past
  337. X          it.
  338. X
  339. X     kill-word
  340. X          Kill the current word.
  341. X
  342. X     gosmacs-transpose-chars
  343. X          Exchange the two characters behind the cursor.
  344. X
  345. X     vi-indent (unbound) (>)
  346. X          Indent a number of lines.
  347. X
  348. X     vi-insert (unbound) (i)
  349. X          Enter insert mode.
  350. X
  351. X     vi-insert-bol (unbound) (I)
  352. X          Move to the beginning of  the  line  and  enter  insert
  353. X          mode.
  354. X
  355. X     vi-join (^X^J)
  356. X          Join the current line with the next one.
  357. X
  358. X     kill-line (^K) (D)
  359. X          Kill from the cursor to the end of the line.
  360. X
  361. X     kill-region
  362. X          Kill from the cursor to the mark.
  363. X
  364. X     kill-buffer (^X^U) (^U)
  365. X          Kill the entire buffer.
  366. X
  367. X     kill-whole-line (^U) (unbound)
  368. X          Kill the current line.
  369. X
  370. X     vi-match-bracket (^X^B) (%)
  371. X          Move to the bracket character (one of {},  (),  or  [])
  372. X          that matches the one under the cursor.
  373. X
  374. X     vi-open-line-above (unbound) (O)
  375. X          Open a line above the cursor and enter insert mode.
  376. X
  377. X     vi-open-line-below (unbound) (o)
  378. X          Open a line below the cursor and enter insert mode.
  379. X
  380. X     vi-oper-swap-case
  381. X          Read a movement command from the keyboard, and swap the
  382. X          case  of all characters from the cursor position to the
  383. X          endpoint of the movement.  If the movement  command  is
  384. X          vi-oper-swap-case,  swap  the case of all characters on
  385. X          the current line.
  386. X
  387. X     overwrite-mode (^X^O)
  388. X          Toggle between overwrite mode and insert mode.
  389. X
  390. X     vi-put-after (unbound) (p)
  391. X          Insert the contents of the kill buffer after  the  cur-
  392. X          sor.
  393. X
  394. X     quoted-insert (^V)
  395. X          Insert  the  next  character  typed  into  the   buffer
  396. X          literally.
  397. X
  398. X     quote-line (ESC-')
  399. X          Quote the current line; that is, put a '  character  at
  400. X          the beginning and the end, and convert all ' characters
  401. X          to '\''.
  402. X
  403. X     quote-region (ESC-")
  404. X          Quote the region from the cursor to the mark.
  405. X
  406. X     vi-replace (unbound) (R)
  407. X          Enter overwrite mode.
  408. X
  409. X     vi-repeat-change (unbound) (.)
  410. X          Repeat the last vi mode text modification.
  411. X
  412. X     vi-replace-chars (unbound) (r)
  413. X          Replace the character under the cursor with a character
  414. X          read from the keyboard.
  415. X
  416. X     self-insert (printable characters)
  417. X          Put a character in the buffer at the cursor position.
  418. X
  419. X     self-insert-unmeta (ESC-^I ESC-^J ESC-^M)
  420. X          Put a character in the buffer after stripping the  meta
  421. X          bit and converting ^M to ^J.
  422. X
  423. X     vi-substitute (unbound) (s)
  424. X          Substitute the next character(s).
  425. X
  426. X     vi-swap-case (unbound) (~)
  427. X          Swap the case of the character  under  the  cursor  and
  428. X          move past it.
  429. X
  430. X     transpose-chars (^T)
  431. X          Exchange the two characters to the left of  the  cursor
  432. X          if  at  end  of line, else exchange the character under
  433. X          the cursor with the character to the left.
  434. X
  435. X     transpose-words (ESC-T ESC-t)
  436. X          Exchange the current word with the one before it.
  437. X
  438. X     vi-unindent (unbound) (<)
  439. X          Unindent a number of lines.
  440. X
  441. X     up-case-word (ESC-U ESC-u)
  442. X          Convert the current word to all caps and move past it.
  443. X
  444. X     yank (^Y) (P)
  445. X          Insert the contents of the kill buffer  at  the  cursor
  446. X          position.
  447. X
  448. X     yank-pop (ESC-y) (unbound)
  449. X          Remove the text just yanked, rotate the kill-ring,  and
  450. X          yank  the  new top.  Only works following yank or yank-
  451. X          pop.
  452. X
  453. X     vi-yank (unbound) (y)
  454. X          Read a movement command from the keyboard, and copy the
  455. X          region  from the cursor position to the endpoint of the
  456. X          movement into the kill buffer.  If the command  is  vi-
  457. X          yank, copy the current line.
  458. X
  459. X     vi-yank-eol (unbound) (Y)
  460. X          Copy the region from the cursor position to the end  of
  461. X          the line into the kill buffer.
  462. X
  463. X     digit-argument (ESC-0..ESC-9) (0-9)
  464. X          Start a new numeric argument, or  add  to  the  current
  465. X          one.
  466. X
  467. X     universal-argument
  468. X          Multiply the argument of the next command by 4.
  469. X
  470. X     accept-and-menu-complete
  471. X          In a menu completion,  insert  the  current  completion
  472. X          into  the buffer, and advance to the next possible com-
  473. X          pletion.
  474. X
  475. X     complete-word (unbound) (\)
  476. X          Attempt completion on the current word.
  477. X
  478. X     delete-char-or-list (^D)
  479. X          Delete the character under the cursor.  If  the  cursor
  480. X          is  at  the  end of the line, list possible completions
  481. X          for the current word.
  482. X
  483. X     execute-named-cmd (ESC-x)
  484. X          Read the name of a editor command and execute it.
  485. X
  486. X     execute-last-named-cmd (ESC-z)
  487. X          Redo the last function executed with execute-named-cmd.
  488. X
  489. X     expand-cmd-path
  490. X          Expand the current command to its full pathname.
  491. X
  492. X     expand-or-complete (TAB) (TAB ^X)
  493. X          Attempt shell expansion on the current word.   If  that
  494. X          fails, attempt completion.
  495. X
  496. X     expand-history (ESC-space ESC-!)
  497. X          Perform history expansion on the edit buffer.
  498. X
  499. X     expand-word (^X*)
  500. X          Attempt shell expansion on the current word.
  501. X
  502. X     list-choices (ESC-^D) (^D =)
  503. X          List possible completions for the current word.
  504. X
  505. X     list-expand (^Xg ^XG) (^G)
  506. X          List the expansion of the current word.
  507. X
  508. X     magic-space
  509. X          Perform history expansion and insert a space  into  the
  510. X          buffer.  This is intended to be bound to space.
  511. X
  512. X     menu-complete
  513. X          Like complete-word,  except  that  menu  completion  is
  514. X          used.  See the MENU_COMPLETE option below.
  515. X
  516. X     menu-expand-or-complete
  517. X          Like expand-or-complete, except that menu completion is
  518. X          used.
  519. X
  520. X     reverse-menu-complete
  521. X          See the MENU_COMPLETE option below.
  522. X
  523. X     accept-and-hold (ESC-A ESC-a)
  524. X          Push the contents of the buffer on the buffer stack and
  525. X          execute it.
  526. X
  527. X     accept-and-infer-next-history
  528. X          Execute the contents of the buffer.   Then  search  the
  529. X          history  list  for  a line matching the current one and
  530. X          push the event following onto the buffer stack.
  531. X
  532. X     accept-line (^J ^M)
  533. X          Execute the contents of the buffer.
  534. X
  535. X     accept-line-and-down-history (^O)
  536. X          Execute the current line, and  push  the  next  history
  537. X          event on the the buffer stack.
  538. X
  539. X     vi-cmd-mode (^X^V) (^[)
  540. X          Enter command mode; that is, use the alternate  keymap.
  541. X          Yes, this is bound by default in emacs mode.
  542. X
  543. X     vi-caps-lock-panic (unbound) (H K)
  544. X          Hang until any lowercase key is pressed.  This  is  for
  545. X          vi  users  without the mental capacity to keep track of
  546. X          their caps lock key (like the author).
  547. X
  548. X     clear-screen (^L ESC-^L)
  549. X          Clear the screen and redraw the prompt.
  550. X
  551. X     exchange-point-and-mark (^X^X)
  552. X          Exchange the cursor position with the position  of  the
  553. X          mark.
  554. X
  555. X     get-line (ESC-G ESC-g)
  556. X          Pop the top line off the buffer stack and insert it  at
  557. X          the cursor position.
  558. X
  559. X     pound-insert (unbound) (#)
  560. X          If there is no # character  at  the  beginning  of  the
  561. X          current line, add one.  If there is one, remove it.  In
  562. X          either   case,   accept   the   current   line.     The
  563. X          INTERACTIVE_COMMENTS  option  must  be  set for this to
  564. X          have any usefulness.
  565. X
  566. X     push-line (^Q ESC-Q ESC-q)
  567. X          Push the current buffer onto the buffer stack and clear
  568. X          the buffer.  Next time the editor starts up, the buffer
  569. X          will be popped off the top  of  the  buffer  stack  and
  570. X          loaded into the editing buffer.
  571. X
  572. X     redisplay (unbound) (^R)
  573. X          Redisplays the edit buffer.
  574. X
  575. X     run-help (ESC-H ESC-h)
  576. X          Push the buffer onto the buffer stack, and execute  the
  577. X          command  "run-help  cmd", where cmd is the current com-
  578. X          mand.  run-help is normally aliased to man.
  579. X
  580. X     send-break (^C)
  581. X          Abort the parsing of the current line.
  582. X
  583. X     vi-set-buffer (unbound) (")
  584. X          Specify a buffer to be used in the following command.
  585. X
  586. X     vi-set-mark (unbound) (m)
  587. X          Set the specified mark at the cursor position.
  588. X
  589. X     set-mark-command (^@)
  590. X          Set the mark at the cursor position.
  591. X
  592. X     spell-word (ESC-$ ESC-S ESC-s)
  593. X          Attempt spelling correction on the current word.
  594. X
  595. X     undefined-key
  596. X          Beep.
  597. X
  598. X     undo (^_ ^X^U) (u)
  599. X          Incrementally undo the last text modification.
  600. X
  601. X     which-command (ESC-?)
  602. X          Push the buffer onto the buffer stack, and execute  the
  603. X          command  "which-command  cmd", where cmd is the current
  604. X          command.  which-command is normally aliased to whence.
  605. END_OF_FILE
  606.   if test 19763 -ne `wc -c <'help/bindkey'`; then
  607.     echo shar: \"'help/bindkey'\" unpacked with wrong size!
  608.   fi
  609.   # end of 'help/bindkey'
  610. fi
  611. if test -f 'help/unalias' -a "${1}" != "-c" ; then 
  612.   echo shar: Will not clobber existing file \"'help/unalias'\"
  613. else
  614.   echo shar: Extracting \"'help/unalias'\" \(781 characters\)
  615.   sed "s/^X//" >'help/unalias' <<'END_OF_FILE'
  616. X     alias [ -g ] [ name[=value] ] ...
  617. X          With no arguments, print the list  of  aliases  in  the
  618. X          form  name=value on the standard output.  For each name
  619. X          with a corresponding value, define an alias  with  that
  620. X          value.   A trailing space in value causes the next word
  621. X          to be checked for alias substitution.  If the  -g  flag
  622. X          is  present,  define a global alias; global aliases are
  623. X          expanded even if they do not occur in command position.
  624. X          For  each  name with no value, print the value of name,
  625. X          if any.  The exit status is nonzero if a name (with  no
  626. X          value) given for which no alias has been defined.
  627. X     unalias name ...
  628. X          The alias definition, if any, for each name is removed.
  629. END_OF_FILE
  630.   if test 781 -ne `wc -c <'help/unalias'`; then
  631.     echo shar: \"'help/unalias'\" unpacked with wrong size!
  632.   fi
  633.   # end of 'help/unalias'
  634. fi
  635. if test -f 'help/unsetopt' -a "${1}" != "-c" ; then 
  636.   echo shar: Will not clobber existing file \"'help/unsetopt'\"
  637. else
  638.   echo shar: Extracting \"'help/unsetopt'\" \(11726 characters\)
  639.   sed "s/^X//" >'help/unsetopt' <<'END_OF_FILE'
  640. X     setopt [ +-options ] [ name ... ]
  641. X          Set the options for the shell.  All  options  specified
  642. X          either  with flags or by name are set.  If no arguments
  643. X          are supplied, the names of all  options  currently  set
  644. X          are  printed.   In option names, case is insignificant,
  645. X          and all underscore characters are ignored.
  646. X     unsetopt [ +-options ] [ name ... ]
  647. X          Unset the options for the shell.  All options specified
  648. X          either with flags or by name are unset.
  649. X
  650. X     The following options may be  set  upon  invocation  of  the
  651. X     shell, or with the set or setopt builtins:
  652. X          ALLEXPORT (-a)
  653. X               All parameters subsequently defined are  automati-
  654. X               cally exported.
  655. X          AUTO_CD (-J)
  656. X               If a command is not in the hash table,  and  there
  657. X               exists  an executable directory by that name, per-
  658. X               form the cd command to that directory.
  659. X          AUTOLIST (-9)
  660. X               Automatically list choices on an ambiguous comple-
  661. X               tion.
  662. X          AUTOMENU
  663. X               Automatically use menu completion if the  TAB  key
  664. X               is pressed repeatedly.
  665. X          AUTO_PUSHD (-N)
  666. X               Make cd act like pushd.
  667. X          AUTO_RESUME (-W)
  668. X               Treat single word simple commands without redirec-
  669. X               tion  as  candidates for resumption of an existing
  670. X               job.
  671. X          BGNICE (-6)
  672. X               Run all background jobs at a lower priority.  This
  673. X               option is set by default.
  674. X          BRACECCL
  675. X               Allow brace expansions of the form {a-zA-Z}, etc.
  676. X          CDABLEVARS (-T)
  677. X               If the argument to a cd command is  not  a  direc-
  678. X               tory,  but  a  parameter  exists  by the same name
  679. X               whose value begins with a /, try to change to  the
  680. X               directory specified by the parameter's value.
  681. X          CHASELINKS (-w)
  682. X               Resolve symbolic links to their true values.
  683. X          CORRECT (-0)
  684. X               Try to correct the spelling of commands.
  685. X          CORRECT_ALL (-O)
  686. X               Try to correct the spelling of all arguments in  a
  687. X               line.
  688. X          CSH_JUNKIE_LOOPS
  689. X               Allow loop bodies to take  the  form  "list;  end"
  690. X               instead of "do list; done".
  691. X          CSH_JUNKIE_QUOTES
  692. X               Complain if a quoted expression runs off  the  end
  693. X               of  a  line;  prevent quoted expressions from con-
  694. X               taining unescaped newlines.
  695. X          CSH_NULL_GLOB
  696. X               If  a  pattern  for  filename  generation  has  no
  697. X               matches,  delete  the  pattern  from  the argument
  698. X               list; do not report an error unless all  the  pat-
  699. X               terns  in  a  command  have no matches.  Overrides
  700. X               NULLGLOB.
  701. X          ERREXIT (-e)
  702. X               If a command has a non-zero exit  status,  execute
  703. X               the ERR trap, if set, and exit.
  704. X          EXTENDED_GLOB
  705. X               Treat the # and ^ characters as part  of  patterns
  706. X               for filename generation, etc.
  707. X          GLOB_COMPLETE
  708. X               Like MENU_COMPLETE, except that the  current  word
  709. X               is  expanded  using normal shell expansion instead
  710. X               of completion.  If no matches are found,  a  *  is
  711. X               added  to  the  end  of the word, and expansion is
  712. X               attempted again.
  713. X          GLOB_DOTS (-4)
  714. X               Do not require a leading . in  a  filename  to  be
  715. X               matched explicitly.
  716. X          HASH_CMDS
  717. X               Place the location of each  command  in  the  hash
  718. X               table  the  first  time  it  is executed.  If this
  719. X               option is unset, no path hashing will be  done  at
  720. X               all.
  721. X          HASH_DIRS
  722. X               Whenever a command is executed, hash the directory
  723. X               containing  it,  as  well  as all directories that
  724. X               occur earlier in  the  path.   Has  no  effect  if
  725. X               HASH_CMDS is unset.
  726. X          HASH_LIST_ALL
  727. X               Whenever a command completion is  attempted,  make
  728. X               sure  the  entire  command  path  is hashed first.
  729. X               This makes the first completion slower.
  730. X          HIST_IGNORE_DUPS (-h)
  731. X               Do not enter command lines into the  history  list
  732. X               if they are duplicates of the previous event.
  733. X          HIST_IGNORE_SPACE (-g)
  734. X               Do not enter command lines into the  history  list
  735. X               if they begin with a blank.
  736. X          HISTLIT (-j)
  737. X               Use literal (unparsed)  versions  of  the  history
  738. X               lines in the editor.
  739. X          HIST_NO_STORE
  740. X               Remove the history (fc -l) command from  the  his-
  741. X               tory when invoked.
  742. X          HIST_VERIFY
  743. X               Whenever the user enters a line with history  sub-
  744. X               stitution,   don't   execute  the  line  directly;
  745. X               instead, perform history substitution  and  reload
  746. X               the line into the editing buffer.
  747. X          IGNORE_BRACES (-I)
  748. X               Do not perform brace expansion.
  749. X          IGNOREEOF (-7)
  750. X               Do not exit on end-of-file.  Require  the  use  of
  751. X               exit or logout instead.
  752. X          INTERACTIVE (-i)
  753. X               This is an interactive shell.
  754. X          INTERACTIVE_COMMENTS (-k)
  755. X               Allow comments even in interactive shells.
  756. X          KSH_OPTION_PRINT
  757. X               Alters the way options settings are printed.
  758. X          LIST_TYPES (-X)
  759. X               When listing files that are possible  completions,
  760. X               show the type of each file with a trailing identi-
  761. X               fying mark.
  762. X          LOGIN (-l)
  763. X               This is a login shell.
  764. X          LONG_LIST_JOBS (-R)
  765. X               List jobs in the long format by default.
  766. X          MAIL_WARNING (-U)
  767. X               Print a warning message if a mail  file  has  been
  768. X               accessed since the shell last checked.
  769. X          MARKDIRS (-8)
  770. X               Append a trailing / to all directory names result-
  771. X               ing from filename generation (globbing).
  772. X          MENU_COMPLETE (-Y)
  773. X               On an ambiguous  completion,  instead  of  listing
  774. X               possibilities,  insert the first match.  Then when
  775. X               completion is requested again,  remove  the  first
  776. X               match  and  insert  the  second  match, etc.  When
  777. X               there are no more matches, go back  to  the  first
  778. X               one  again.   reverse-menu-complete may be used to
  779. X               loop through the list in the other direction.
  780. X          MENU_COMPLETE_BEEP
  781. X               Beep on an ambiguous menu completion.
  782. X          MONITOR (-m)
  783. X               Allow job control.  Set by default in  interactive
  784. X               shells.
  785. X          NO_BAD_PATTERN (-2)
  786. X               If a pattern  for  filename  generation  is  badly
  787. X               formed,  leave  it  unchanged in the argument list
  788. X               instead of printing an error.
  789. X          NO_BANG_HIST (-K)
  790. X               Do not perform textual history  substitution.   Do
  791. X               not treat the ! character specially.
  792. X          NOBEEP (-B)
  793. X               Do not beep.
  794. X          NO_CLOBBER (-1)
  795. X               Prevents > redirection  from  truncating  existing
  796. X               files.  >! may be used to truncate a file instead.
  797. X               Also prevents >> from creating files.  >>! may  be
  798. X               used instead.
  799. X          NO_EQUALS
  800. X               Don't perform = filename substitution.
  801. X          NOEXEC (-n)
  802. X               Read commands and check them  for  syntax  errors,
  803. X               but do not execute them.
  804. X          NOGLOB (-F)
  805. X               Disable filename generation.
  806. X          NO_HIST_BEEP
  807. X               Don't beep when an attempt is  made  to  access  a
  808. X               history entry which isn't there.
  809. X          NOHUP
  810. X               Don't send the HUP signal to running jobs when the
  811. X               shell exits.
  812. X          NO_LIST_BEEP
  813. X               Don't beep on an ambiguous completion.
  814. X          NO_NOMATCH (-3)
  815. X               If  a  pattern  for  filename  generation  has  no
  816. X               matches,  leave  it unchanged in the argument list
  817. X               instead of printing an error.
  818. X          NO_PROMPT_CR (-V)
  819. X               Don't print a carriage return just before printing
  820. X               a prompt in the line editor.
  821. X          NO_RCS (-f)
  822. X               Do not source the .zshenv, .zshrc, .zlogin,  .zlo-
  823. X               gout, or .zprofile files.
  824. X          NO_SHORT_LOOPS
  825. X               Disallow the short forms of for, select,  if,  and
  826. X               function constructs.
  827. X          NOTIFY (-5)
  828. X               Report the status of background jobs  immediately,
  829. X               rather  than  waiting until just before printing a
  830. X               prompt.
  831. X          NOUNSET (-u)
  832. X               Treat unset parameters as an error when substitut-
  833. X               ing.
  834. X          NULLGLOB (-G)
  835. X               If  a  pattern  for  filename  generation  has  no
  836. X               matches, delete the pattern from the argument list
  837. X               instead  of   reporting   an   error.    Overrides
  838. X               NO_NOMATCH.
  839. X          NUMERICGLOBSORT
  840. X               If numeric filenames are  matched  by  a  filename
  841. X               generation pattern, sort the filenames numerically
  842. X               rather than lexicographically.
  843. X          OVERSTRIKE
  844. X               Start up the line editor in overstrike mode.
  845. X          PATH_DIRS (-Q)
  846. X               Perform a path search even on command  names  with
  847. X               slashes  in  them.  Thus if "/usr/local/bin" is in
  848. X               the user's path, and  he  types  "X11/xinit",  the
  849. X               command  "/usr/local/bin/X11/xinit"  will  be exe-
  850. X               cuted (assuming it exists).
  851. X          PRINT_EXIT_VALUE (-C)
  852. X               Print the exit value  of  programs  with  non-zero
  853. X               exit status.
  854. X          PUSHD_IGNORE_DUPS
  855. X               Don't push multiple copies of the  same  directory
  856. X               onto the directory stack.
  857. X          PUSHD_MINUS
  858. X               See popd below.
  859. X          PUSHD_SILENT (-E)
  860. X               Do not print the directory stack  after  pushd  or
  861. X               popd.
  862. X          PUSHD_TO_HOME (-D)
  863. X               Have pushd with no arguments act like pushd $HOME.
  864. X          RC_EXPAND_PARAM (-P)
  865. X               See Parameter Expansion.
  866. X          RC_QUOTES
  867. X               Allow the character sequence '' to signify a  sin-
  868. X               gle quote within singly quoted strings.
  869. X          RECEXACT (-S)
  870. X               In completion, recognize  exact  matches  even  if
  871. X               they are ambiguous.
  872. X          RMSTARSILENT (-H)
  873. X               Do not query the user before executing "rm  *"  or
  874. X               "rm path/*".
  875. X          SHINSTDIN (-s)
  876. X               Read commands from the standard input.
  877. X          SH_WORD_SPLIT (-y)
  878. X               See Parameter Expansion.
  879. X          SINGLE_LINE_ZLE (-M)
  880. X               Use single-line command line  editing  instead  of
  881. X               multi-line.
  882. X          SUN_KEYBOARD_HACK (-L)
  883. X               If a line ends with a backquote, and there are  an
  884. X               odd  number  of backquotes on the line, ignore the
  885. X               trailing backquote.  This is useful on  some  key-
  886. X               boards  where the return key is too small, and the
  887. X               backquote key lies annoyingly close to it.
  888. X          VERBOSE (-v)
  889. X               Print shell input lines as they are read.
  890. X          XTRACE (-x)
  891. X               Print commands and their  arguments  as  they  are
  892. X               executed.
  893. X          ZLE (-Z)
  894. X               Use the zsh line editor.
  895. END_OF_FILE
  896.   if test 11726 -ne `wc -c <'help/unsetopt'`; then
  897.     echo shar: \"'help/unsetopt'\" unpacked with wrong size!
  898.   fi
  899.   # end of 'help/unsetopt'
  900. fi
  901. if test -f 'src/parse.c' -a "${1}" != "-c" ; then 
  902.   echo shar: Will not clobber existing file \"'src/parse.c'\"
  903. else
  904.   echo shar: Extracting \"'src/parse.c'\" \(18751 characters\)
  905.   sed "s/^X//" >'src/parse.c' <<'END_OF_FILE'
  906. X/*
  907. X *
  908. X * parse.c - parser
  909. X *
  910. X * This file is part of zsh, the Z shell.
  911. X *
  912. X * This software is Copyright 1992 by Paul Falstad
  913. X *
  914. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  915. X * use this software as long as: there is no monetary profit gained
  916. X * specifically from the use or reproduction of this software, it is not
  917. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  918. X * included prominently in any copy made. 
  919. X *
  920. X * The author make no claims as to the fitness or correctness of this software
  921. X * for any use whatsoever, and it is provided as is. Any use of this software
  922. X * is at the user's own risk. 
  923. X *
  924. X */
  925. X
  926. X#include "zsh.h"
  927. X
  928. X#define YYERROR { tok = LEXERR; return NULL; }
  929. X#define YYERRORV { tok = LEXERR; return; }
  930. X
  931. X#define make_list() allocnode(N_LIST)
  932. X#define make_sublist() allocnode(N_SUBLIST)
  933. X#define make_pline() allocnode(N_PLINE)
  934. X#define make_cmd() allocnode(N_CMD)
  935. X#define make_forcmd() allocnode(N_FOR)
  936. X#define make_casecmd() allocnode(N_CASE)
  937. X#define make_ifcmd() allocnode(N_IF)
  938. X#define make_whilecmd() allocnode(N_WHILE)
  939. X#define make_varnode() allocnode(N_VARASG)
  940. X#define make_cond() allocnode(N_COND)
  941. X
  942. X/*
  943. X * event    : ENDINPUT
  944. X *            | SEPER
  945. X *            | sublist [ SEPER | AMPER ]
  946. X */
  947. XList parse_event() /**/
  948. X{
  949. X    tok = ENDINPUT;
  950. X    incmdpos = 1;
  951. X    yylex();
  952. X    return par_event();
  953. X}
  954. X
  955. XList par_event() /**/
  956. X{
  957. XSublist sl;
  958. XList l = NULL;
  959. X
  960. X    while (tok == SEPER) {
  961. X        if (isnewlin > 0) return NULL;
  962. X        yylex();
  963. X    }
  964. X    if (tok == ENDINPUT) return NULL;
  965. X    if (sl = par_sublist())
  966. X        if (tok == ENDINPUT) {
  967. X            l = make_list();
  968. X            l->type = SYNC; l->left = sl;
  969. X        } else if (tok == SEPER) {
  970. X            l = make_list();
  971. X            l->type = SYNC; l->left = sl;
  972. X            if (isnewlin <= 0) yylex();
  973. X        } else if (tok == AMPER) {
  974. X            l = make_list();
  975. X            l->type = ASYNC; l->left = sl;
  976. X            yylex();
  977. X        } else
  978. X            l = NULL;
  979. X    if (!l) {
  980. X        if (errflag) { yyerror(); return NULL; }
  981. X        yyerror();
  982. X        errflag = 0;
  983. X        if (isnewlin <= 0) {
  984. X            int c;
  985. X
  986. X            hwbegin();
  987. X            while ((c = hgetc()) != '\n' && !lexstop);
  988. X            if (c == '\n') hungetc('\n');
  989. X            hwaddc(HISTSPACE);
  990. X            hwadd();
  991. X        }
  992. X        errflag = 1;
  993. X        return NULL;
  994. X    } else {
  995. X        l->right = par_event();
  996. X    }
  997. X    return l;
  998. X}
  999. X
  1000. XList parse_list() /**/
  1001. X{
  1002. X    tok = ENDINPUT;
  1003. X    incmdpos = 1;
  1004. X    yylex();
  1005. X    return par_list();
  1006. X}
  1007. X
  1008. X/*
  1009. X * list    : { SEPER } [ sublist [ { SEPER | AMPER } list ] ]
  1010. X */
  1011. XList par_list() /**/
  1012. X{
  1013. XSublist sl;
  1014. XList l = NULL;
  1015. X
  1016. X    while (tok == SEPER) yylex();
  1017. X    if (sl = par_sublist())
  1018. X        if (tok == SEPER || tok == AMPER) {
  1019. X            l = make_list();
  1020. X            l->left = sl;
  1021. X            l->type = (tok == SEPER) ? SYNC : ASYNC;
  1022. X            incmdpos = 1;
  1023. X            while (tok == SEPER || tok == AMPER) yylex();
  1024. X            l->right = par_list();
  1025. X        } else {
  1026. X            l = make_list();
  1027. X            l->left = sl;
  1028. X            l->type = SYNC;
  1029. X        }
  1030. X    return l;
  1031. X}
  1032. X
  1033. XList par_list1() /**/
  1034. X{
  1035. XSublist sl;
  1036. XList l = NULL;
  1037. X
  1038. X    if (sl = par_sublist()) {
  1039. X        l = make_list();
  1040. X        l->type = SYNC;
  1041. X        l->left = sl;
  1042. X    }
  1043. X    return l;
  1044. X}
  1045. X
  1046. X/*
  1047. X * sublist    : sublist2 [ ( DBAR | DAMPER ) { SEPER } sublist ]
  1048. X */
  1049. XSublist par_sublist() /**/
  1050. X{
  1051. XSublist sl;
  1052. X
  1053. X    if (sl = par_sublist2())
  1054. X        if (tok == DBAR || tok == DAMPER) {
  1055. X            int qtok = tok;
  1056. X            yylex();
  1057. X            while (tok == SEPER) yylex();
  1058. X            sl->right = par_sublist();
  1059. X            sl->type = (qtok == DBAR) ? ORNEXT : ANDNEXT;
  1060. X        }
  1061. X    return sl;
  1062. X}
  1063. X
  1064. X/*
  1065. X * sublist2    : [ COPROC | BANG ] pline
  1066. X */
  1067. XSublist par_sublist2() /**/
  1068. X{
  1069. XSublist sl;
  1070. XPline p;
  1071. X
  1072. X    sl = make_sublist();
  1073. X    if (tok == COPROC) { sl->flags |= PFLAG_COPROC; yylex(); }
  1074. X    else if (tok == BANG) { sl->flags |= PFLAG_NOT; yylex(); }
  1075. X    if (!(p = par_pline()) && !sl->flags)
  1076. X        return NULL;
  1077. X    sl->left = p;
  1078. X    return sl;
  1079. X}
  1080. X
  1081. X/*
  1082. X * pline    : cmd [ ( BAR | BARAMP ) { SEPER } pline ]
  1083. X */
  1084. XPline par_pline() /**/
  1085. X{
  1086. XCmd c;
  1087. XPline p,p2;
  1088. X
  1089. X    if (!(c = par_cmd()))
  1090. X        return NULL;
  1091. X    if (tok == BAR) {
  1092. X        yylex();
  1093. X        while (tok == SEPER) yylex();
  1094. X        p2 = par_pline();
  1095. X        p = make_pline();
  1096. X        p->left = c; p->right = p2; p->type = PIPE;
  1097. X        return p;
  1098. X    } else if (tok == BARAMP) {
  1099. X        struct redir *rdr = alloc(sizeof *rdr);
  1100. X        rdr->type = MERGEOUT; rdr->fd1 = 2; rdr->fd2 = 1;
  1101. X        addnode(c->redir,rdr);
  1102. X
  1103. X        yylex();
  1104. X        p2 = par_pline();
  1105. X        p = make_pline();
  1106. X        p->left = c; p->right = p2; p->type = PIPE;
  1107. X        return p;
  1108. X    } else {
  1109. X        p = make_pline();
  1110. X        p->left = c; p->type = END;
  1111. X        return p;
  1112. X    }
  1113. X}
  1114. X
  1115. X/*
  1116. X * cmd    : { redir } ( for | case | if | while | repeat |
  1117. X *                subsh | funcdef | time | dinbrack | simple ) { redir }
  1118. X */
  1119. XCmd par_cmd() /**/
  1120. X{
  1121. XCmd c;
  1122. X
  1123. X    c = make_cmd();
  1124. X    c->args = newlist();
  1125. X    c->redir = newlist();
  1126. X    c->vars = newlist();
  1127. X    while (IS_REDIROP(tok))
  1128. X        par_redir(c->redir);
  1129. X    switch (tok) {
  1130. X    case FOR: case FOREACH: case SELECT: par_for(c); break;
  1131. X    case CASE: par_case(c); break;
  1132. X    case IF: par_if(c); break;
  1133. X    case WHILE: case UNTIL: par_while(c); break;
  1134. X    case REPEAT: par_repeat(c); break;
  1135. X    case INPAR: case INBRACE: par_subsh(c); break;
  1136. X    case FUNC: par_funcdef(c); break;
  1137. X    case TIME: par_time(c); break;
  1138. X    case DINBRACK: par_dinbrack(c); break;
  1139. X    default: if (!par_simple(c)) return NULL; break;
  1140. X    }
  1141. X    while (IS_REDIROP(tok))
  1142. X        par_redir(c->redir);
  1143. X    incmdpos = 1;
  1144. X    incasepat = 0;
  1145. X    incond = 0;
  1146. X    return c;
  1147. X}
  1148. X
  1149. X/*
  1150. X * for    : ( FOR[EACH] | SELECT ) name ( "in" wordlist | INPAR wordlist OUTPAR )
  1151. X                { SEPER } ( DO list DONE | INBRACE list OUTBRACE |
  1152. X                list ZEND | list1 )
  1153. X */
  1154. Xvoid par_for(c) /**/
  1155. XCmd c;
  1156. X{
  1157. Xstruct forcmd *f;
  1158. Xint csh = (tok == FOREACH || isset(CSHJUNKIELOOPS));
  1159. X
  1160. X    f = make_forcmd();
  1161. X    c->type = (tok == SELECT) ? CSELECT : CFOR;
  1162. X    incmdpos = 0;
  1163. X    yylex();
  1164. X    if (tok != STRING) YYERRORV;
  1165. X    f->name = tokstr;
  1166. X    incmdpos = 1;
  1167. X    yylex();
  1168. X    if (tok == STRING && !strcmp(tokstr,"in")) {
  1169. X        f->inflag = 1;
  1170. X        incmdpos = 0;
  1171. X        yylex();
  1172. X        c->args = par_wordlist();
  1173. X        if (tok != SEPER) YYERRORV;
  1174. X    } else if (tok == INPAR) {
  1175. X        f->inflag = 1;
  1176. X        incmdpos = 0;
  1177. X        yylex();
  1178. X        c->args = par_nl_wordlist();
  1179. X        if (tok != OUTPAR) YYERRORV;
  1180. X        incmdpos = 1;
  1181. X        yylex();
  1182. X    }
  1183. X    incmdpos = 1;
  1184. X    while (tok == SEPER) yylex();
  1185. X    if (tok == DO) {
  1186. X        yylex();
  1187. X        f->list = par_list();
  1188. X        if (tok != DONE) YYERRORV;
  1189. X        yylex();
  1190. X    } else if (tok == INBRACE) {
  1191. X        yylex();
  1192. X        f->list = par_list();
  1193. X        if (tok != OUTBRACE) YYERRORV;
  1194. X        yylex();
  1195. X    } else if (csh) {
  1196. X        f->list = par_list();
  1197. X        if (tok != ZEND) YYERRORV;
  1198. X        yylex();
  1199. X    } else if (isset(NOSHORTLOOPS)) {
  1200. X        YYERRORV;
  1201. X    } else
  1202. X        f->list = par_list1();
  1203. X    c->u.forcmd = f;
  1204. X}
  1205. X
  1206. X/*
  1207. X * case    : CASE STRING { SEPER } ( "in" | INBRACE )
  1208. X                { { SEPER } STRING { BAR STRING } OUTPAR list [ DSEMI ] }
  1209. X                { SEPER } ( "esac" | OUTBRACE )
  1210. X */
  1211. Xvoid par_case(c) /**/
  1212. XCmd c;
  1213. X{
  1214. Xstruct casecmd **ccp;
  1215. Xint brflag;
  1216. X
  1217. X    c->type = CCASE;
  1218. X    incmdpos = 0;
  1219. X    yylex();
  1220. X    if (tok != STRING) YYERRORV;
  1221. X    addnode(c->args,tokstr);
  1222. X    incmdpos = 1;
  1223. X    yylex();
  1224. X    while (tok == SEPER) yylex();
  1225. X    if (!(tok == STRING && !strcmp(tokstr,"in")) && tok != INBRACE) YYERRORV;
  1226. X    brflag = (tok == INBRACE);
  1227. X    incasepat = 1;
  1228. X    incmdpos = 0;
  1229. X    yylex();
  1230. X    ccp = &c->u.casecmd;
  1231. X    for (;;) {
  1232. X        char *str;
  1233. X        struct casecmd *cc;
  1234. X
  1235. X        *ccp = cc = make_casecmd();
  1236. X        while (tok == SEPER) yylex();
  1237. X        if (tok == OUTBRACE) {
  1238. X            yylex();
  1239. X            break;
  1240. X        }
  1241. X        if (tok != STRING) YYERRORV;
  1242. X        if (!strcmp(tokstr,"esac")) {
  1243. X            yylex();
  1244. X            break;
  1245. X        }
  1246. X        str = tokstr;
  1247. X        yylex();
  1248. X        while (tok == BAR) {
  1249. X            char *str2;
  1250. X            int sl = strlen(str);
  1251. X
  1252. X            yylex();
  1253. X            if (tok != STRING) YYERRORV;
  1254. X            str2 = alloc(sl+strlen(tokstr)+1);
  1255. X            strcpy(str2,str);
  1256. X            str2[sl] = Bar;
  1257. X            strcpy(str2+sl+1,tokstr);
  1258. X            str = str2;
  1259. X            yylex();
  1260. X        }
  1261. X        if (tok != OUTPAR) YYERRORV;
  1262. X        incasepat = 0;
  1263. X        incmdpos = 1;
  1264. X        yylex();
  1265. X        cc->pat = str;
  1266. X        cc->list = par_list();
  1267. X        ccp = &cc->next;
  1268. X        if ((tok == ESAC && !brflag) || (tok == OUTBRACE && brflag)) {
  1269. X            yylex();
  1270. X            break;
  1271. X        }
  1272. X        if (tok != DSEMI) YYERRORV;
  1273. X        incasepat = 1;
  1274. X        incmdpos = 0;
  1275. X        yylex();
  1276. X    }
  1277. X    *ccp = NULL;
  1278. X}
  1279. X
  1280. X/*
  1281. X * if    : { ( IF | ELIF ) { SEPER } ( INPAR list OUTPAR | list )
  1282. X            { SEPER } ( THEN list | INBRACE list OUTBRACE | list1 ) }
  1283. X            [ FI | ELSE list FI | ELSE { SEPER } INBRACE list OUTBRACE ]
  1284. X            (you get the idea...?)
  1285. X */
  1286. Xvoid par_if(c) /**/
  1287. XCmd c;
  1288. X{
  1289. Xstruct ifcmd *i,**ip;
  1290. Xint xtok;
  1291. X
  1292. X    c->type = CIF;
  1293. X    ip = &c->u.ifcmd;
  1294. X    for (;;) {
  1295. X        xtok = tok;
  1296. X        yylex();
  1297. X        if (xtok == FI)
  1298. X            break;
  1299. X        while (tok == SEPER) yylex();
  1300. X        if (xtok == ELSE)
  1301. X            break;
  1302. X        if (!(xtok == IF || xtok == ELIF)) YYERRORV;
  1303. X        *ip = i = make_ifcmd();
  1304. X        ip = &i->next;
  1305. X        if (tok == INPAR) {
  1306. X            yylex();
  1307. X            i->ifl = par_list();
  1308. X            if (tok != OUTPAR) YYERRORV;
  1309. X            incmdpos = 1;
  1310. X            yylex();
  1311. X        } else {
  1312. X            i->ifl = par_list();
  1313. X            incmdpos = 1;
  1314. X        }
  1315. X        while (tok == SEPER) yylex();
  1316. X        xtok = FI;
  1317. X        if (tok == THEN) {
  1318. X            yylex();
  1319. X            i->thenl = par_list();
  1320. X            incmdpos = 1;
  1321. X        } else if (tok == INBRACE) {
  1322. X            yylex();
  1323. X            i->thenl = par_list();
  1324. X            if (tok != OUTBRACE) YYERRORV;
  1325. X            yylex();
  1326. X            incmdpos = 1;
  1327. X            if (tok == SEPER) break;
  1328. X        } else if (isset(NOSHORTLOOPS)) {
  1329. X            YYERRORV;
  1330. X        } else {
  1331. X            i->thenl = par_list1();
  1332. X            incmdpos = 1;
  1333. X            break;
  1334. X        }
  1335. X    }
  1336. X    if (xtok == ELSE) {
  1337. X        *ip = i = make_ifcmd();
  1338. X        if (tok == INBRACE) {
  1339. X            yylex();
  1340. X            i->thenl = par_list();
  1341. X            if (tok != OUTBRACE) YYERRORV;
  1342. X            yylex();
  1343. X        } else {
  1344. X            i->thenl = par_list();
  1345. X            if (tok != FI) YYERRORV;
  1346. X            yylex();
  1347. X        }
  1348. X    }
  1349. X}
  1350. X
  1351. X/*
  1352. X * while    : ( WHILE | UNTIL ) ( INPAR list OUTPAR | list ) { SEPER }
  1353. X                ( DO list DONE | INBRACE list OUTBRACE | list ZEND )
  1354. X */
  1355. Xvoid par_while(c) /**/
  1356. XCmd c;
  1357. X{
  1358. Xstruct whilecmd *w;
  1359. X
  1360. X    c->type = CWHILE;
  1361. X    w = c->u.whilecmd = make_whilecmd();
  1362. X    w->cond = (tok == UNTIL);
  1363. X    yylex();
  1364. X    if (tok == INPAR) {
  1365. X        yylex();
  1366. X        w->cont = par_list();
  1367. X        if (tok != OUTPAR) YYERRORV;
  1368. X        yylex();
  1369. X    } else {
  1370. X        w->cont = par_list();
  1371. X    }
  1372. X    incmdpos = 1;
  1373. X    while (tok == SEPER) yylex();
  1374. X    if (tok == DO) {
  1375. X        yylex();
  1376. X        w->loop = par_list();
  1377. X        if (tok != DONE) YYERRORV;
  1378. X        yylex();
  1379. X    } else if (tok == INBRACE) {
  1380. X        yylex();
  1381. X        w->loop = par_list();
  1382. X        if (tok != OUTBRACE) YYERRORV;
  1383. X        yylex();
  1384. X    } else if (isset(CSHJUNKIELOOPS)) {
  1385. X        w->loop = par_list();
  1386. X        if (tok != ZEND) YYERRORV;
  1387. X        yylex();
  1388. X    } else
  1389. X        YYERRORV;
  1390. X}
  1391. X
  1392. X/*
  1393. X * repeat    : REPEAT STRING { SEPER } ( DO list DONE | list1 )
  1394. X */
  1395. Xvoid par_repeat(c) /**/
  1396. XCmd c;
  1397. X{
  1398. X    c->type = CREPEAT;
  1399. X    incmdpos = 0;
  1400. X    yylex();
  1401. X    if (tok != STRING) YYERRORV;
  1402. X    addnode(c->args,tokstr);
  1403. X    incmdpos = 1;
  1404. X    yylex();
  1405. X    while (tok == SEPER) yylex();
  1406. X    if (tok == DO) {
  1407. X        yylex();
  1408. X        c->u.list = par_list();
  1409. X        if (tok != DONE) YYERRORV;
  1410. X        yylex();
  1411. X    } else {
  1412. X        c->u.list = par_list1();
  1413. X    }
  1414. X}
  1415. X
  1416. X/*
  1417. X * subsh    : ( INPAR | INBRACE ) list ( OUTPAR | OUTBRACE )
  1418. X */
  1419. Xvoid par_subsh(c) /**/
  1420. XCmd c;
  1421. X{
  1422. X    c->type = (tok == INPAR) ? SUBSH : CURSH;
  1423. X    yylex();
  1424. X    c->u.list = par_list();
  1425. X    if (tok != ((c->type == SUBSH) ? OUTPAR : OUTBRACE)) YYERRORV;
  1426. X    yylex();
  1427. X}
  1428. X
  1429. X/*
  1430. X * funcdef    : FUNCTION wordlist [ INOUTPAR ] { SEPER }
  1431. X *                    ( list1 | INBRACE list OUTBRACE )
  1432. X */
  1433. Xvoid par_funcdef(c) /**/
  1434. XCmd c;
  1435. X{
  1436. X    nocorrect = 1;
  1437. X    incmdpos = 0;
  1438. X    yylex();
  1439. X    c->type = FUNCDEF;
  1440. X    c->args = newlist();
  1441. X    incmdpos = 1;
  1442. X    while (tok == STRING) {
  1443. X        if (*tokstr == Inbrace && !tokstr[1]) { tok = INBRACE; break; }
  1444. X        addnode(c->args,tokstr);
  1445. X        yylex();
  1446. X    }
  1447. X    nocorrect = 0;
  1448. X    if (tok == INOUTPAR) yylex();
  1449. X    while (tok == SEPER) yylex();
  1450. X    if (tok == INBRACE) {
  1451. X        yylex();
  1452. X        c->u.list = par_list();
  1453. X        if (tok != OUTBRACE) YYERRORV;
  1454. X        yylex();
  1455. X    } else if (isset(NOSHORTLOOPS)) {
  1456. X        YYERRORV;
  1457. X    } else
  1458. X        c->u.list = par_list1();
  1459. X}
  1460. X
  1461. X/*
  1462. X * time    : TIME sublist2
  1463. X */
  1464. Xvoid par_time(c) /**/
  1465. XCmd c;
  1466. X{
  1467. X    yylex();
  1468. X    c->type = ZCTIME;
  1469. X    c->u.pline = par_sublist2();
  1470. X}
  1471. X
  1472. X/*
  1473. X * dinbrack    : DINBRACK cond DOUTBRACK
  1474. X */
  1475. Xvoid par_dinbrack(c) /**/
  1476. XCmd c;
  1477. X{
  1478. X    c->type = COND;
  1479. X    incond = 1;
  1480. X    incmdpos = 0;
  1481. X    yylex();
  1482. X    c->u.cond = par_cond();
  1483. X    if (tok != DOUTBRACK) YYERRORV;
  1484. X    incond = 0;
  1485. X    incmdpos = 1;
  1486. X    yylex();
  1487. X}
  1488. X
  1489. X/*
  1490. X * simple    : { COMMAND | EXEC | NOGLOB | NOCORRECT | DASH }
  1491. X                    { STRING | ENVSTRING | ENVARRAY wordlist OUTPAR | redir }
  1492. X                    [ INOUTPAR { SEPER } ( list1 | INBRACE list OUTBRACE ) ]
  1493. X */
  1494. XCmd par_simple(c) /**/
  1495. XCmd c;
  1496. X{
  1497. Xint isnull = 1;
  1498. X
  1499. X    c->type = SIMPLE;
  1500. X    for (;;) {
  1501. X        if (tok == COMMAND) c->flags |= CFLAG_COMMAND;
  1502. X        else if (tok == EXEC) c->flags |= CFLAG_EXEC;
  1503. X        else if (tok == NOGLOB) c->flags |= CFLAG_NOGLOB;
  1504. X        else if (tok == NOCORRECT) nocorrect = 1;
  1505. X        else if (tok == DASH) c->flags = CFLAG_DASH;
  1506. X        else break;
  1507. X        yylex();
  1508. X    }
  1509. X    if (tok == AMPER) YYERROR;
  1510. X    for (;;) {
  1511. X        if (tok == STRING) {
  1512. X            incmdpos = 0;
  1513. X            addnode(c->args,tokstr);
  1514. X            yylex();
  1515. X        } else if (tok == ENVSTRING) {
  1516. X            struct varasg *v = make_varnode();
  1517. X            v->type = PMFLAG_s;
  1518. X            equalsplit(v->name = tokstr,&v->str);
  1519. X            addnode(c->vars,v);
  1520. X            yylex();
  1521. X        } else if (tok == ENVARRAY) {
  1522. X            struct varasg *v = make_varnode();
  1523. X            int oldcmdpos = incmdpos;
  1524. X            v->type = PMFLAG_A;
  1525. X            incmdpos = 0;
  1526. X            v->name = tokstr;
  1527. X            yylex();
  1528. X            v->arr = par_nl_wordlist();
  1529. X            if (tok != OUTPAR) YYERROR;
  1530. X            incmdpos = oldcmdpos;
  1531. X            yylex();
  1532. X            addnode(c->vars,v);
  1533. X        } else if (IS_REDIROP(tok)) {
  1534. X            par_redir(c->redir);
  1535. X        } else if (tok == INOUTPAR) {
  1536. X            incmdpos = 1;
  1537. X            yylex();
  1538. X            while (tok == SEPER) yylex();
  1539. X            if (tok == INBRACE) {
  1540. X                yylex();
  1541. X                c->u.list = par_list();
  1542. X                if (tok != OUTBRACE) YYERROR;
  1543. X                yylex();
  1544. X            } else if (isset(NOSHORTLOOPS)) {
  1545. X                YYERROR;
  1546. X            } else
  1547. X                c->u.list = par_list1();
  1548. X            c->type = FUNCDEF;
  1549. X        } else break;
  1550. X        isnull = 0;
  1551. X    }
  1552. X    if (isnull && empty(c->redir)) return NULL;
  1553. X    if (full(c->args)) {
  1554. X        if (underscore)
  1555. X            free(underscore);
  1556. X        underscore = ztrdup(getdata(lastnode(c->args)));
  1557. X        untokenize(underscore);
  1558. X    }
  1559. X    incmdpos = 1;
  1560. X    return c;
  1561. X}
  1562. X
  1563. X/*
  1564. X * cond    : cond_1 { SEPER } [ DBAR { SEPER } cond ]
  1565. X */
  1566. XCond par_cond() /**/
  1567. X{
  1568. XCond c,c2;
  1569. X
  1570. X    c = par_cond_1();
  1571. X    while (tok == SEPER) yylex();
  1572. X    if (tok == DBAR) {
  1573. X        yylex();
  1574. X        while (tok == SEPER) yylex();
  1575. X        c2 = make_cond();
  1576. X        c2->left = c;
  1577. X        c2->right = par_cond();
  1578. X        c2->type = COND_OR;
  1579. X        return c2;
  1580. X    }
  1581. X    return c;
  1582. X}
  1583. X
  1584. X/*
  1585. X * cond_1 : cond_2 { SEPER } [ DAMPER { SEPER } cond_1 ]
  1586. X */
  1587. XCond par_cond_1() /**/
  1588. X{
  1589. XCond c,c2;
  1590. X
  1591. X    c = par_cond_2();
  1592. X    while (tok == SEPER) yylex();
  1593. X    if (tok == DAMPER) {
  1594. X        yylex();
  1595. X        while (tok == SEPER) yylex();
  1596. X        c2 = make_cond();
  1597. X        c2->left = c;
  1598. X        c2->right = par_cond_1();
  1599. X        c2->type = COND_AND;
  1600. X        return c2;
  1601. X    }
  1602. X    return c;
  1603. X}
  1604. X
  1605. X/*
  1606. X * cond_2    : BANG cond_2
  1607. X                | INPAR { SEPER } cond_2 { SEPER } OUTPAR
  1608. X                | STRING STRING STRING
  1609. X                | STRING STRING
  1610. X                | STRING ( INANG | OUTANG ) STRING
  1611. X */
  1612. XCond par_cond_2() /**/
  1613. X{
  1614. XCond c,c2;
  1615. Xchar *s1,*s2,*s3;
  1616. Xint xtok;
  1617. X
  1618. X    if (tok == BANG) {
  1619. X        yylex();
  1620. X        c = par_cond_2();
  1621. X        c2 = make_cond();
  1622. X        c2->left = c;
  1623. X        c2->type = COND_NOT;
  1624. X        return c2;
  1625. X    }
  1626. X    if (tok == INPAR) {
  1627. X        yylex();
  1628. X        while (tok == SEPER) yylex();
  1629. X        c = par_cond();
  1630. X        while (tok == SEPER) yylex();
  1631. X        if (tok != OUTPAR) YYERROR;
  1632. X        yylex();
  1633. X        return c;
  1634. X    }
  1635. X    if (tok != STRING) YYERROR;
  1636. X    s1 = tokstr;
  1637. X    yylex();
  1638. X    xtok = tok;
  1639. X    if (tok == INANG || tok == OUTANG) {
  1640. X        yylex();
  1641. X        if (tok != STRING) YYERROR;
  1642. X        s3 = tokstr;
  1643. X        yylex();
  1644. X        c = make_cond();
  1645. X        c->left = s1;
  1646. X        c->right = s3;
  1647. X        c->type = (xtok == INANG) ? COND_STRLT : COND_STRGTR;
  1648. X        c->types[0] = c->types[1] = NT_STR;
  1649. X        return c;
  1650. X    }
  1651. X    if (tok != STRING) YYERROR;
  1652. X    s2 = tokstr;
  1653. X    yylex();
  1654. X    if (tok == STRING) {
  1655. X        s3 = tokstr;
  1656. X        yylex();
  1657. X        return par_cond_triple(s1,s2,s3);
  1658. X    } else
  1659. X        return par_cond_double(s1,s2);
  1660. X}
  1661. X
  1662. X/*
  1663. X * redir    : ( OUTANG | ... | TRINANG ) STRING
  1664. X */
  1665. Xvoid par_redir(l) /**/
  1666. XLklist l;
  1667. X{
  1668. Xchar *toks;
  1669. Xstruct redir *fn = allocnode(N_REDIR);
  1670. Xint mergerror = 0;
  1671. Xint oldcmdpos,oldnc;
  1672. X
  1673. X    oldcmdpos = incmdpos;
  1674. X    incmdpos = 0;
  1675. X    oldnc = nocorrect;
  1676. X    if (tok != INANG) nocorrect = 1;
  1677. X    fn->type = redirtab[tok-OUTANG];
  1678. X    fn->fd1 = tokfd;
  1679. X    yylex();
  1680. X    if (tok != STRING && tok != ENVSTRING) YYERRORV;
  1681. X    toks = tokstr;
  1682. X    incmdpos = oldcmdpos;
  1683. X    nocorrect = oldnc;
  1684. X    yylex();
  1685. X
  1686. X/* assign default fd */
  1687. X
  1688. X    if (fn->fd1 == -1)
  1689. X        fn->fd1 = IS_READFD(fn->type) ? 0 : 1;
  1690. X
  1691. X/* > >(...) or < <(...) */
  1692. X
  1693. X    if ((*toks == Inang || *toks == Outang) && toks[1] == Inpar) {
  1694. X        if ((fn->type & ~1) == WRITE) fn->type = OUTPIPE;
  1695. X        else if (fn->type == READ) fn->type = INPIPE;
  1696. X        else YYERRORV;
  1697. X        fn->name = toks;
  1698. X
  1699. X/* <<[-] name */
  1700. X
  1701. X    } else if (fn->type == HEREDOC || fn->type == HEREDOCDASH) {
  1702. X        char tbuf[256], *tlin = NULL;
  1703. X        int tsiz = 0, l;
  1704. X        /* Save the rest of the current line for later tokenization */
  1705. X        if (!isnewlin) {
  1706. X            while (hgets(tbuf, 256) != NULL) {
  1707. X                l = strlen(tbuf);
  1708. X                if (tsiz == 0) {
  1709. X                    tlin = ztrdup(tbuf); /* Test for failure? */
  1710. X                    tsiz = l;
  1711. X                } else {
  1712. X                    tlin = realloc(tlin,tsiz+l+1); /* Test for failure? */
  1713. X                    strcpy(&tlin[tsiz], tbuf);
  1714. X                    tsiz += l;
  1715. X                }
  1716. X                if (tbuf[l-1] == '\n') break;
  1717. X            }
  1718. X        }
  1719. X        /* Now grab the document */
  1720. X        fn->name = gethere(toks,fn->type);
  1721. X        fn->type = HERESTR;
  1722. X        /* Put back the saved line to resume tokenizing */
  1723. X        if (tsiz > 0) {
  1724. X            hungets(tlin);
  1725. X            free(tlin);
  1726. X        }
  1727. X
  1728. X/* >& name or >>& name */
  1729. X
  1730. X    } else if (IS_ERROR_REDIR(fn->type) && getfdstr(toks) == FD_WORD) {
  1731. X        mergerror = 1;
  1732. X        fn->name = toks;
  1733. X        fn->type = UN_ERROR_REDIR(fn->type);
  1734. X
  1735. X/* >>& and >>&! are only valid with a name after them */
  1736. X
  1737. X    } else if (fn->type == ERRAPP || fn->type == ERRAPPNOW) {
  1738. X        YYERRORV;
  1739. X
  1740. X/* >& # */
  1741. X
  1742. X    } else if (fn->type == MERGE || fn->type == MERGEOUT) {
  1743. X        fn->fd2 = getfdstr(toks);
  1744. X        if (fn->fd2 == FD_CLOSE) fn->type = CLOSE;
  1745. X        else if (fn->fd2 == FD_WORD) fn->fd2 = (fn->type==MERGEOUT) ? 1 : 0;
  1746. X    } else
  1747. X        fn->name = toks;
  1748. X    addnode(l,fn);
  1749. X    if (mergerror)
  1750. X        {
  1751. X        struct redir *fe = allocnode(N_REDIR);
  1752. X
  1753. X        fe->fd1 = 2;
  1754. X        fe->fd2 = fn->fd1;
  1755. X        fe->type = MERGEOUT;
  1756. X        addnode(l,fe);
  1757. X        }
  1758. X}
  1759. X
  1760. X/*
  1761. X * wordlist    : { STRING }
  1762. X */
  1763. XLklist par_wordlist() /**/
  1764. X{
  1765. XLklist l;
  1766. X
  1767. X    l = newlist();
  1768. X    while (tok == STRING) {
  1769. X        addnode(l,tokstr);
  1770. X        yylex();
  1771. X    }
  1772. X    return l;
  1773. X}
  1774. X
  1775. X/*
  1776. X * nl_wordlist    : { STRING | SEPER }
  1777. X */
  1778. XLklist par_nl_wordlist() /**/
  1779. X{
  1780. XLklist l;
  1781. X
  1782. X    l = newlist();
  1783. X    while (tok == STRING || tok == SEPER) {
  1784. X        if (tok != SEPER)
  1785. X            addnode(l,tokstr);
  1786. X        yylex();
  1787. X    }
  1788. X    return l;
  1789. X}
  1790. X
  1791. X/* get fd associated with str */
  1792. X
  1793. Xint getfdstr(s) /**/
  1794. Xchar *s;
  1795. X{
  1796. X    if (s[1]) return FD_WORD;
  1797. X    if (idigit(*s)) return *s-'0';
  1798. X    if (*s == 'p') return FD_COPROC;
  1799. X    if (*s == '-') return FD_CLOSE;
  1800. X    return FD_WORD;
  1801. X}
  1802. X
  1803. XCond par_cond_double(a,b) /**/
  1804. Xchar *a;char *b;
  1805. X{
  1806. XCond n = make_cond();
  1807. X
  1808. X    if (a[0] != '-' || !a[1] || a[2])
  1809. X        {
  1810. X        zerr("parse error: condition expected: %s",a,0);
  1811. X        return NULL;
  1812. X        }
  1813. X    n->left = b;
  1814. X    n->type = a[1];
  1815. X    n->types[0] = n->types[1] = NT_STR;
  1816. X    return n;
  1817. X}
  1818. X
  1819. XCond par_cond_triple(a,b,c) /**/
  1820. Xchar *a;char *b;char *c;
  1821. X{
  1822. XCond n = make_cond();
  1823. Xstatic char *condstrs[] = {
  1824. X    "nt","ot","ef","eq","ne","lt","gt","le","ge",NULL
  1825. X    };
  1826. Xint t0;
  1827. X
  1828. X    if ((b[0] == Equals || b[0] == '=') && !b[1])
  1829. X        n->type = COND_STREQ;
  1830. X    else if (b[0] == '!' && b[1] == '=' && !b[2])
  1831. X        n->type = COND_STRNEQ;
  1832. X    else if (b[0] == '-')
  1833. X        {
  1834. X        for (t0 = 0; condstrs[t0]; t0++)
  1835. X            if (!strcmp(condstrs[t0],b+1))
  1836. X                break;
  1837. X        if (condstrs[t0])
  1838. X            n->type = t0+COND_NT;
  1839. X        else
  1840. X            zerr("unrecognized condition: %s",b,0);
  1841. X        }
  1842. X    else
  1843. X        zerr("condition expected: %s",b,0);
  1844. X    n->left = a;
  1845. X    n->right = c;
  1846. X    n->types[0] = n->types[1] = NT_STR;
  1847. X    return n;
  1848. X}
  1849. X
  1850. Xvoid yyerror() /**/
  1851. X{
  1852. Xint t0;
  1853. X
  1854. X    for (t0 = 0; t0 != 20; t0++)
  1855. X        if (!yytext[t0] || yytext[t0] == '\n' || yytext[t0] == HISTSPACE)
  1856. X            break;
  1857. X    if (t0 == 20)
  1858. X        zerr("parse error near `%l...'",yytext,20);
  1859. X    else if (t0)
  1860. X        zerr("parse error near `%l'",yytext,t0);
  1861. X    else
  1862. X        zerr("parse error",NULL,0);
  1863. X}
  1864. X
  1865. END_OF_FILE
  1866.   if test 18751 -ne `wc -c <'src/parse.c'`; then
  1867.     echo shar: \"'src/parse.c'\" unpacked with wrong size!
  1868.   fi
  1869.   # end of 'src/parse.c'
  1870. fi
  1871. echo shar: End of archive 15 \(of 22\).
  1872. cp /dev/null ark15isdone
  1873. MISSING=""
  1874. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ; do
  1875.     if test ! -f ark${I}isdone ; then
  1876.     MISSING="${MISSING} ${I}"
  1877.     fi
  1878. done
  1879. if test "${MISSING}" = "" ; then
  1880.     echo You have unpacked all 22 archives.
  1881.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1882. else
  1883.     echo You still must unpack the following archives:
  1884.     echo "        " ${MISSING}
  1885. fi
  1886. exit 0
  1887.  
  1888. exit 0 # Just in case...
  1889.