rh

Hex Artifact Content
Login

Artifact 7ec2111c8277ceef2e2fe3fd26c59bced44d224a69c339ea9029e39798b25272:


0000: 2f 2a 0a 20 2a 20 72 68 2e 63 0a 20 2a 0a 20 2a  /*. * rh.c. *. *
0010: 20 57 72 69 74 74 65 6e 20 62 79 3a 09 4b 65 6e   Written by:.Ken
0020: 20 53 74 61 75 66 66 65 72 0a 20 2a 09 09 52 69   Stauffer. *..Ri
0030: 63 6b 20 4f 68 6e 65 6d 75 73 09 28 72 69 63 6b  ck Ohnemus.(rick
0040: 40 73 74 65 72 6c 69 6e 67 2e 63 6f 6d 29 0a 20  @sterling.com). 
0050: 2a 20 0a 20 2a 20 47 6c 6f 62 61 6c 20 46 75 6e  * . * Global Fun
0060: 63 74 69 6f 6e 73 3a 20 6d 61 69 6e 2c 20 66 75  ctions: main, fu
0070: 6e 63 5f 6e 61 6d 65 2c 20 61 63 74 69 76 61 74  nc_name, activat
0080: 65 2c 20 64 65 61 63 74 69 76 61 74 65 0a 20 2a  e, deactivate. *
0090: 0a 20 2a 20 53 74 61 74 69 63 20 46 75 6e 63 74  . * Static Funct
00a0: 69 6f 6e 73 3a 20 70 72 69 6e 74 68 65 6c 70 2c  ions: printhelp,
00b0: 20 6d 61 78 5f 64 65 73 63 72 69 70 74 6f 72 73   max_descriptors
00c0: 2c 20 66 6d 74 5f 72 65 71 5f 73 74 61 74 2c 0a  , fmt_req_stat,.
00d0: 20 2a 09 09 20 20 20 20 20 70 72 6f 67 5f 72 65   *..     prog_re
00e0: 71 5f 73 74 61 74 2c 20 65 78 65 63 75 74 65 2c  q_stat, execute,
00f0: 20 65 78 61 6d 31 2c 20 65 78 61 6d 32 2c 0a 20   exam1, exam2,. 
0100: 2a 09 09 20 20 20 20 20 65 78 61 6d 33 2c 20 65  *..     exam3, e
0110: 78 61 6d 34 2c 20 67 65 74 5f 72 68 70 61 74 68  xam4, get_rhpath
0120: 2c 20 67 65 74 5f 66 75 6e 63 2c 0a 20 2a 09 09  , get_func,. *..
0130: 20 20 20 20 20 70 75 73 68 5f 69 6e 73 74 72 2c       push_instr,
0140: 20 77 72 69 74 65 5f 74 72 65 65 2c 20 77 72 69   write_tree, wri
0150: 74 65 5f 66 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f  te_functions. */
0160: 0a 0a 23 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f  ..#define _FILE_
0170: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0180: 69 6e 63 6c 75 64 65 20 22 72 68 2e 68 22 0a 23  include "rh.h".#
0190: 69 6e 63 6c 75 64 65 20 22 72 68 63 6d 64 73 2e  include "rhcmds.
01a0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 72 68 64  h".#include "rhd
01b0: 61 74 61 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ata.h".#include 
01c0: 22 72 68 67 72 61 6d 2e 68 22 0a 23 69 6e 63 6c  "rhgram.h".#incl
01d0: 75 64 65 20 22 61 6c 6c 6f 63 2e 68 22 0a 23 69  ude "alloc.h".#i
01e0: 6e 63 6c 75 64 65 20 22 65 72 72 6d 73 67 2e 68  nclude "errmsg.h
01f0: 22 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e  "..#include <fcn
0200: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0210: 70 77 64 2e 68 3e 0a 0a 23 69 66 20 64 65 66 69  pwd.h>..#if defi
0220: 6e 65 64 28 44 45 42 55 47 29 0a 23 20 20 69 6e  ned(DEBUG).#  in
0230: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0240: 0a 23 20 20 69 6e 63 6c 75 64 65 20 22 64 75 6d  .#  include "dum
0250: 70 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 64 65  p.h".#endif..#de
0260: 66 69 6e 65 20 56 45 52 53 49 4f 4e 20 22 56 65  fine VERSION "Ve
0270: 72 73 69 6f 6e 20 33 2e 30 72 22 0a 0a 65 78 74  rsion 3.0r"..ext
0280: 65 72 6e 20 76 6f 69 64 09 66 74 72 77 28 63 68  ern void.ftrw(ch
0290: 61 72 20 2a 66 69 6c 65 2c 0a 09 09 20 20 20 20  ar *file,...    
02a0: 20 76 6f 69 64 20 28 2a 66 6e 29 28 29 2c 0a 09   void (*fn)(),..
02b0: 09 20 20 20 20 20 69 6e 74 20 64 65 70 74 68 2c  .     int depth,
02c0: 0a 09 09 20 20 20 20 20 69 6e 74 20 64 61 73 68  ...     int dash
02d0: 72 2c 0a 09 09 20 20 20 20 20 69 6e 74 20 73 61  r,...     int sa
02e0: 6d 65 66 73 50 43 29 3b 0a 65 78 74 65 72 6e 20  mefsPC);.extern 
02f0: 63 68 61 72 20 2a 09 67 72 61 70 68 69 63 28 63  char *.graphic(c
0300: 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 29  onst char *name)
0310: 3b 0a 65 78 74 65 72 6e 20 76 6f 69 64 09 70 72  ;.extern void.pr
0320: 69 6e 74 65 6e 74 72 79 28 69 6e 74 20 76 65 72  intentry(int ver
0330: 62 6f 73 65 2c 0a 09 09 09 20 20 20 69 6e 74 20  bose,....   int 
0340: 73 74 72 5f 6f 77 6e 65 72 2c 0a 09 09 09 20 20  str_owner,....  
0350: 20 69 6e 74 20 66 75 6c 6c 5f 64 61 74 65 2c 0a   int full_date,.
0360: 09 09 09 20 20 20 73 74 72 75 63 74 20 73 74 61  ...   struct sta
0370: 74 20 2a 62 75 66 2c 0a 09 09 09 20 20 20 63 6f  t *buf,....   co
0380: 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 29 3b  nst char *name);
0390: 0a 65 78 74 65 72 6e 20 76 6f 69 64 09 70 72 69  .extern void.pri
03a0: 6e 74 66 6f 72 6d 61 74 28 73 74 72 75 63 74 20  ntformat(struct 
03b0: 73 74 61 74 20 2a 62 75 66 2c 0a 09 09 09 20 20  stat *buf,....  
03c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61    const char *na
03d0: 6d 65 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 64  me,....    int d
03e0: 65 70 74 68 29 3b 0a 65 78 74 65 72 6e 20 69 6e  epth);.extern in
03f0: 74 09 72 68 5f 70 61 72 73 65 28 29 3b 0a 65 78  t.rh_parse();.ex
0400: 74 65 72 6e 20 76 6f 69 64 09 72 68 66 69 6e 69  tern void.rhfini
0410: 73 68 28 76 6f 69 64 29 3b 0a 65 78 74 65 72 6e  sh(void);.extern
0420: 20 76 6f 69 64 09 72 68 69 6e 69 74 28 76 6f 69   void.rhinit(voi
0430: 64 29 3b 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  d);...static int
0440: 20 2a 09 61 63 74 69 76 65 5f 66 75 6e 63 73 20   *.active_funcs 
0450: 3d 20 28 69 6e 74 20 2a 29 20 4e 55 4c 4c 3b 0a  = (int *) NULL;.
0460: 73 74 61 74 69 63 20 69 6e 74 09 6e 75 6d 5f 61  static int.num_a
0470: 63 74 69 76 65 5f 66 75 6e 63 73 20 3d 20 30 3b  ctive_funcs = 0;
0480: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 44 45  ..#if defined(DE
0490: 42 55 47 29 0a 65 78 74 65 72 6e 20 69 6e 74 09  BUG).extern int.
04a0: 67 64 5f 64 65 62 75 67 3b 0a 65 78 74 65 72 6e  gd_debug;.extern
04b0: 20 69 6e 74 09 72 68 5f 64 65 62 75 67 3b 0a 65   int.rh_debug;.e
04c0: 78 74 65 72 6e 20 69 6e 74 09 79 79 5f 66 6c 65  xtern int.yy_fle
04d0: 78 5f 64 65 62 75 67 3b 0a 0a 69 6e 74 09 09 54  x_debug;..int..T
04e0: 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
04f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 5f  ..#if defined(S_
0500: 49 46 4c 4e 4b 29 0a 0a 23 69 66 20 64 65 66 69  IFLNK)..#if defi
0510: 6e 65 64 28 44 45 42 55 47 29 0a 23 64 65 66 69  ned(DEBUG).#defi
0520: 6e 65 20 53 57 49 54 43 48 45 53 20 22 43 44 46  ne SWITCHES "CDF
0530: 4c 54 55 56 57 58 59 5a 62 63 64 65 3a 66 3a 68  LTUVWXYZbcde:f:h
0540: 69 6c 70 3a 71 72 73 74 76 77 78 3a 22 0a 23 65  ilp:qrstvwx:".#e
0550: 6c 73 65 0a 23 64 65 66 69 6e 65 20 53 57 49 54  lse.#define SWIT
0560: 43 48 45 53 20 22 43 44 46 4c 56 62 63 64 65 3a  CHES "CDFLVbcde:
0570: 66 3a 68 69 6c 70 3a 71 72 73 74 76 77 78 3a 22  f:hilp:qrstvwx:"
0580: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
0590: 63 68 61 72 20 2a 75 73 61 67 65 20 3d 0a 20 20  char *usage =.  
05a0: 20 20 22 55 73 61 67 65 3a 20 25 73 20 5b 2d 43    "Usage: %s [-C
05b0: 44 46 4c 56 62 63 64 68 69 6c 71 72 73 76 77 5d  DFLVbcdhilqrsvw]
05c0: 20 5b 2d 66 20 66 69 6c 65 6e 61 6d 65 5d 20 5b   [-f filename] [
05d0: 2d 65 20 65 78 70 72 65 73 73 69 6f 6e 5d 5c 6e  -e expression]\n
05e0: 22 0a 20 20 20 20 22 5c 74 5c 74 5b 2d 70 20 66  ".    "\t\t[-p f
05f0: 6f 72 6d 61 74 5d 20 5b 2d 78 20 63 6f 6d 6d 61  ormat] [-x comma
0600: 6e 64 5d 20 5b 64 69 72 65 63 74 6f 72 79 2f 66  nd] [directory/f
0610: 69 6c 65 20 2e 2e 2e 5d 5c 6e 22 3b 0a 0a 23 65  ile ...]\n";..#e
0620: 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  lse..#if defined
0630: 28 44 45 42 55 47 29 0a 23 64 65 66 69 6e 65 20  (DEBUG).#define 
0640: 53 57 49 54 43 48 45 53 20 22 43 54 55 56 57 58  SWITCHES "CTUVWX
0650: 59 5a 62 63 64 65 3a 66 3a 68 69 6c 70 3a 71 72  YZbcde:f:hilp:qr
0660: 73 74 76 77 78 3a 22 0a 23 65 6c 73 65 0a 23 64  stvwx:".#else.#d
0670: 65 66 69 6e 65 20 53 57 49 54 43 48 45 53 20 22  efine SWITCHES "
0680: 43 56 62 63 64 65 3a 66 3a 68 69 6c 70 3a 71 72  CVbcde:f:hilp:qr
0690: 73 74 76 77 78 3a 22 0a 23 65 6e 64 69 66 0a 0a  stvwx:".#endif..
06a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 73 61  static char *usa
06b0: 67 65 20 3d 20 0a 20 20 20 20 22 55 73 61 67 65  ge = .    "Usage
06c0: 3a 20 25 73 20 5b 2d 43 56 62 63 64 68 69 6c 71  : %s [-CVbcdhilq
06d0: 72 73 76 77 5d 20 5b 2d 66 20 66 69 6c 65 6e 61  rsvw] [-f filena
06e0: 6d 65 5d 20 5b 2d 65 20 65 78 70 72 65 73 73 69  me] [-e expressi
06f0: 6f 6e 5d 5c 6e 22 0a 20 20 20 20 22 5c 74 5c 74  on]\n".    "\t\t
0700: 5b 2d 70 20 66 6f 72 6d 61 74 5d 20 5b 2d 78 20  [-p format] [-x 
0710: 63 6f 6d 6d 61 6e 64 5d 20 5b 64 69 72 65 63 74  command] [direct
0720: 6f 72 79 2f 66 69 6c 65 20 2e 2e 2e 5d 5c 6e 22  ory/file ...]\n"
0730: 3b 0a 23 65 6e 64 69 66 0a 0a 0c 0a 2f 2a 0a 20  ;.#endif..../*. 
0740: 2a 20 70 72 69 6e 74 68 65 6c 70 3a 0a 20 2a 09  * printhelp:. *.
0750: 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 68 65  Print out the he
0760: 6c 70 20 73 63 72 65 65 6e 2e 20 54 68 65 20 73  lp screen. The s
0770: 74 72 69 6e 67 20 27 73 27 20 69 73 20 61 72 67  tring 's' is arg
0780: 76 5b 30 5d 2e 0a 20 2a 09 43 61 6c 6c 65 64 20  v[0].. *.Called 
0790: 77 68 65 6e 20 74 68 65 20 2d 68 20 6f 70 74 69  when the -h opti
07a0: 6f 6e 20 69 73 20 75 73 65 64 2e 0a 20 2a 2f 0a  on is used.. */.
07b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
07c0: 6e 74 68 65 6c 70 28 63 6f 6e 73 74 20 63 68 61  nthelp(const cha
07d0: 72 20 2a 73 29 0a 7b 0a 20 20 20 20 69 6e 74 09  r *s).{.    int.
07e0: 09 09 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  ..i;.    const s
07f0: 79 6d 62 6f 6c 20 2a 09 70 3b 0a 0a 20 20 20 20  ymbol *.p;..    
0800: 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73  (void) fprintf(s
0810: 74 64 65 72 72 2c 20 75 73 61 67 65 2c 20 73 29  tderr, usage, s)
0820: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 72  ;.    (void) fpr
0830: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
0840: 25 73 5c 6e 22 2c 20 56 45 52 53 49 4f 4e 29 3b  %s\n", VERSION);
0850: 0a 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69  .    (void) fpri
0860: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 6f  ntf(stderr, "\no
0870: 70 74 69 6f 6e 73 3a 5c 6e 22 0a 23 69 66 20 64  ptions:\n".#if d
0880: 65 66 69 6e 65 64 28 44 45 42 55 47 29 0a 09 09  efined(DEBUG)...
0890: 20 20 20 22 5c 74 2d 54 5c 74 74 72 61 63 65 5c     "\t-T\ttrace\
08a0: 6e 22 0a 09 09 20 20 20 22 5c 74 2d 55 5c 74 64  n"...   "\t-U\td
08b0: 75 6d 70 20 65 6e 74 69 72 65 20 63 6f 6d 70 69  ump entire compi
08c0: 6c 65 64 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 09  led program\n"..
08d0: 09 20 20 20 22 5c 74 2d 57 5c 74 64 75 6d 70 20  .   "\t-W\tdump 
08e0: 65 78 65 63 75 74 61 62 6c 65 20 63 6f 6d 70 69  executable compi
08f0: 6c 65 64 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 09  led program\n"..
0900: 09 20 20 20 22 5c 74 2d 58 5c 74 67 65 74 64 61  .   "\t-X\tgetda
0910: 74 65 20 64 65 62 75 67 5c 6e 22 0a 09 09 20 20  te debug\n"...  
0920: 20 22 5c 74 2d 59 5c 74 72 68 67 72 61 6d 20 64   "\t-Y\trhgram d
0930: 65 62 75 67 5c 6e 22 0a 09 09 20 20 20 22 5c 74  ebug\n"...   "\t
0940: 2d 5a 5c 74 72 68 6c 65 78 20 64 65 62 75 67 5c  -Z\trhlex debug\
0950: 6e 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  n".#endif.#if de
0960: 66 69 6e 65 64 28 53 5f 49 46 4c 4e 4b 29 0a 09  fined(S_IFLNK)..
0970: 09 20 20 20 22 5c 74 2d 44 5c 74 66 6f 6c 6c 6f  .   "\t-D\tfollo
0980: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73  w symbolic links
0990: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 64   that point to d
09a0: 69 72 65 63 74 6f 72 69 65 73 5c 6e 22 0a 09 09  irectories\n"...
09b0: 20 20 20 22 5c 74 2d 46 5c 74 66 6f 6c 6c 6f 77     "\t-F\tfollow
09c0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20   symbolic links 
09d0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  that point to no
09e0: 6e 2d 64 69 72 65 63 74 6f 72 69 65 73 5c 6e 22  n-directories\n"
09f0: 0a 09 09 20 20 20 22 5c 74 2d 4c 5c 74 66 6f 6c  ...   "\t-L\tfol
0a00: 6c 6f 77 20 61 6c 6c 20 73 79 6d 62 6f 6c 69 63  low all symbolic
0a10: 20 6c 69 6e 6b 73 5c 6e 22 0a 23 65 6e 64 69 66   links\n".#endif
0a20: 0a 09 09 20 20 20 22 5c 74 2d 43 5c 74 64 6f 20  ...   "\t-C\tdo 
0a30: 6e 6f 74 20 63 72 6f 73 73 20 66 69 6c 65 20 73  not cross file s
0a40: 79 73 74 65 6d 73 5c 6e 22 0a 09 09 20 20 20 22  ystems\n"...   "
0a50: 5c 74 2d 56 5c 74 77 72 69 74 65 20 76 65 72 73  \t-V\twrite vers
0a60: 69 6f 6e 20 6e 75 6d 62 65 72 20 74 6f 20 73 74  ion number to st
0a70: 64 65 72 72 20 61 6e 64 20 65 78 69 74 5c 6e 22  derr and exit\n"
0a80: 0a 09 09 20 20 20 22 5c 74 2d 62 5c 74 70 72 69  ...   "\t-b\tpri
0a90: 6e 74 20 6c 65 61 64 69 6e 67 20 5c 22 2e 2f 5c  nt leading \"./\
0aa0: 22 20 69 66 20 6e 6f 20 64 69 72 65 63 74 6f 72  " if no director
0ab0: 79 5c 6e 22 0a 09 09 20 20 20 22 5c 74 2d 63 5c  y\n"...   "\t-c\
0ac0: 74 64 6f 20 6e 6f 74 20 72 65 61 64 20 52 48 52  tdo not read RHR
0ad0: 43 20 66 69 6c 65 5c 6e 22 0a 09 09 20 20 20 22  C file\n"...   "
0ae0: 5c 74 2d 64 5c 74 6c 65 61 64 69 6e 67 20 27 3f  \t-d\tleading '?
0af0: 27 20 6f 72 20 27 2a 27 20 6d 61 74 63 68 65 73  ' or '*' matches
0b00: 20 6c 65 61 64 69 6e 67 20 27 2e 27 20 69 6e 20   leading '.' in 
0b10: 66 69 6c 65 20 6e 61 6d 65 5c 6e 22 0a 09 09 20  file name\n"... 
0b20: 20 20 22 5c 74 2d 65 5c 74 67 65 74 20 65 78 70    "\t-e\tget exp
0b30: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
0b40: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 5c 6e 22   command line\n"
0b50: 0a 09 09 20 20 20 22 5c 74 2d 66 5c 74 67 65 74  ...   "\t-f\tget
0b60: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
0b70: 20 66 69 6c 65 5c 6e 22 0a 09 09 20 20 20 22 5c   file\n"...   "\
0b80: 74 2d 69 5c 74 69 67 6e 6f 72 65 20 63 61 73 65  t-i\tignore case
0b90: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 6e 61 6d   during file nam
0ba0: 65 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 09 09  e matching\n"...
0bb0: 20 20 20 22 5c 74 2d 68 5c 74 73 68 6f 77 20 74     "\t-h\tshow t
0bc0: 68 69 73 20 6d 65 73 73 61 67 65 20 61 6e 64 20  his message and 
0bd0: 65 78 69 74 5c 6e 22 0a 09 09 20 20 20 22 5c 74  exit\n"...   "\t
0be0: 2d 6c 5c 74 6c 6f 6e 67 20 66 69 6c 65 6e 61 6d  -l\tlong filenam
0bf0: 65 20 6f 75 74 70 75 74 5c 6e 22 0a 09 09 20 20  e output\n"...  
0c00: 20 22 5c 74 2d 70 20 66 6f 72 6d 61 74 5c 74 70   "\t-p format\tp
0c10: 72 69 6e 74 20 66 69 6c 65 20 69 6e 66 6f 72 6d  rint file inform
0c20: 61 74 69 6f 6e 20 75 73 69 6e 67 20 27 66 6f 72  ation using 'for
0c30: 6d 61 74 27 5c 6e 22 0a 09 09 20 20 20 22 5c 74  mat'\n"...   "\t
0c40: 2d 71 5c 74 64 69 73 70 6c 61 79 20 6e 6f 6e 2d  -q\tdisplay non-
0c50: 67 72 61 70 68 69 63 20 63 68 61 72 61 63 74 65  graphic characte
0c60: 72 73 20 69 6e 20 66 69 6c 65 6e 61 6d 65 73 20  rs in filenames 
0c70: 61 73 20 3f 5c 6e 22 0a 09 09 20 20 20 22 5c 74  as ?\n"...   "\t
0c80: 2d 72 5c 74 64 6f 20 6e 6f 74 20 67 6f 20 64 6f  -r\tdo not go do
0c90: 77 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  wn the directory
0ca0: 20 74 72 65 65 20 28 6e 6f 6e 2d 72 65 63 75 72   tree (non-recur
0cb0: 73 69 76 65 29 5c 6e 22 0a 09 09 20 20 20 22 5c  sive)\n"...   "\
0cc0: 74 2d 73 5c 74 70 72 69 6e 74 20 75 73 65 72 73  t-s\tprint users
0cd0: 2f 67 72 6f 75 70 73 20 61 73 20 73 74 72 69 6e  /groups as strin
0ce0: 67 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6e 75  gs instead of nu
0cf0: 6d 62 65 72 73 5c 6e 22 0a 09 09 20 20 20 22 5c  mbers\n"...   "\
0d00: 74 2d 74 5c 74 70 72 69 6e 74 20 66 75 6c 6c 20  t-t\tprint full 
0d10: 64 61 74 65 2f 74 69 6d 65 20 69 6e 73 74 65 61  date/time instea
0d20: 64 20 6f 66 20 6c 73 28 31 29 20 74 79 70 65 20  d of ls(1) type 
0d30: 64 61 74 65 2f 74 69 6d 65 5c 6e 22 0a 09 09 20  date/time\n"... 
0d40: 20 20 22 5c 74 2d 76 5c 74 76 65 72 62 6f 73 65    "\t-v\tverbose
0d50: 20 6f 75 74 70 75 74 5c 6e 22 0a 09 09 20 20 20   output\n"...   
0d60: 22 5c 74 2d 77 5c 74 64 69 73 70 6c 61 79 20 77  "\t-w\tdisplay w
0d70: 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 73 5c  arning messages\
0d80: 6e 22 0a 09 09 20 20 20 22 5c 74 2d 78 20 63 6f  n"...   "\t-x co
0d90: 6d 6d 61 6e 64 5c 74 65 78 65 63 75 74 65 20 27  mmand\texecute '
0da0: 63 6f 6d 6d 61 6e 64 27 20 66 6f 72 20 6d 61 74  command' for mat
0db0: 63 68 69 6e 67 20 66 69 6c 65 73 5c 6e 22 0a 09  ching files\n"..
0dc0: 09 20 20 20 22 5c 6e 76 61 6c 69 64 20 73 79 6d  .   "\nvalid sym
0dd0: 62 6f 6c 73 3a 5c 6e 22 0a 09 09 20 20 20 29 3b  bols:\n"...   );
0de0: 0a 09 09 20 20 20 0a 20 20 20 20 66 6f 72 20 28  ...   .    for (
0df0: 69 20 3d 20 31 2c 20 70 20 3d 20 53 79 6d 62 6f  i = 1, p = Symbo
0e00: 6c 5f 74 61 62 6c 65 3b 20 70 20 21 3d 20 28 73  l_table; p != (s
0e10: 79 6d 62 6f 6c 20 2a 29 20 4e 55 4c 4c 3b 20 70  ymbol *) NULL; p
0e20: 20 3d 20 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29   = p->next, i++)
0e30: 20 7b 0a 09 28 76 6f 69 64 29 20 66 70 72 69 6e   {..(void) fprin
0e40: 74 66 28 73 74 64 65 72 72 2c 20 22 25 31 32 73  tf(stderr, "%12s
0e50: 25 73 22 2c 20 70 2d 3e 6e 61 6d 65 2c 0a 09 09  %s", p->name,...
0e60: 20 20 20 20 20 20 28 28 28 69 20 2d 20 31 29 20        (((i - 1) 
0e70: 25 20 35 29 20 3d 3d 20 34 0a 09 09 20 20 20 20  % 5) == 4...    
0e80: 20 20 20 7c 7c 20 70 2d 3e 6e 65 78 74 20 3d 3d     || p->next ==
0e90: 20 28 73 79 6d 62 6f 6c 20 2a 29 20 4e 55 4c 4c   (symbol *) NULL
0ea0: 29 20 3f 20 22 5c 6e 22 20 3a 20 22 20 22 29 3b  ) ? "\n" : " ");
0eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
0ec0: 28 76 6f 69 64 29 20 66 70 72 69 6e 74 66 28 73  (void) fprintf(s
0ed0: 74 64 65 72 72 2c 20 22 5c 6e 43 20 6f 70 65 72  tderr, "\nC oper
0ee0: 61 74 6f 72 73 3a 5c 6e 22 0a 09 09 20 20 20 22  ators:\n"...   "
0ef0: 5c 74 21 20 7e 20 2d 20 2a 20 2f 20 25 25 20 2b  \t! ~ - * / %% +
0f00: 20 3c 20 3c 3d 20 3e 20 3e 3d 20 3d 3d 20 21 3d   < <= > >= == !=
0f10: 20 26 20 5e 20 7c 20 3c 3c 20 3e 3e 20 26 26 20   & ^ | << >> && 
0f20: 7c 7c 20 3f 3a 5c 6e 22 0a 09 09 20 20 20 22 5c  || ?:\n"...   "\
0f30: 6e 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f  nspecial operato
0f40: 72 73 3a 5c 6e 22 0a 09 09 20 20 20 22 5c 74 24  rs:\n"...   "\t$
0f50: 75 73 65 72 6e 61 6d 65 20 2c 20 40 67 72 6f 75  username , @grou
0f60: 70 6e 61 6d 65 20 2c 20 5c 22 2a 2e 63 5c 22 20  pname , \"*.c\" 
0f70: 2c 20 5b 64 61 74 65 2f 74 69 6d 65 20 73 70 65  , [date/time spe
0f80: 63 5d 5c 6e 5c 6e 22 0a 09 09 20 20 20 29 3b 0a  c]\n\n"...   );.
0f90: 20 20 20 20 0a 20 20 20 20 65 78 69 74 28 31 29      .    exit(1)
0fa0: 3b 0a 7d 0a 0c 0a 23 69 66 20 64 65 66 69 6e 65  ;.}...#if define
0fb0: 64 28 52 4c 49 4d 49 54 5f 4e 4f 46 49 4c 45 29  d(RLIMIT_NOFILE)
0fc0: 0a 0a 2f 2a 0a 20 2a 20 6d 61 78 5f 64 65 73 63  ../*. * max_desc
0fd0: 72 69 70 74 6f 72 73 3a 0a 20 2a 09 52 65 74 75  riptors:. *.Retu
0fe0: 72 6e 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  rns the maximum 
0ff0: 6e 75 6d 62 65 72 20 6f 66 20 66 69 6c 65 20 64  number of file d
1000: 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 2a 2f 0a  escriptors.. */.
1010: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 78 5f  .static int max_
1020: 64 65 73 63 72 69 70 74 6f 72 73 28 76 6f 69 64  descriptors(void
1030: 29 0a 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72  ).{.    struct r
1040: 6c 69 6d 69 74 20 6e 65 77 72 6c 70 3b 0a 20 20  limit newrlp;.  
1050: 20 20 73 74 72 75 63 74 20 72 6c 69 6d 69 74 20    struct rlimit 
1060: 72 6c 70 3b 0a 20 20 20 20 0a 20 20 20 20 69 66  rlp;.    .    if
1070: 20 28 67 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d   (getrlimit(RLIM
1080: 49 54 5f 4e 4f 46 49 4c 45 2c 20 26 72 6c 70 29  IT_NOFILE, &rlp)
1090: 20 3d 3d 20 30 29 20 7b 0a 09 69 66 20 28 72 6c   == 0) {..if (rl
10a0: 70 2e 72 6c 69 6d 5f 63 75 72 20 3c 20 4e 4f 46  p.rlim_cur < NOF
10b0: 49 4c 45 29 20 7b 0a 09 20 20 20 20 6e 65 77 72  ILE) {..    newr
10c0: 6c 70 2e 72 6c 69 6d 5f 6d 61 78 20 3d 20 6e 65  lp.rlim_max = ne
10d0: 77 72 6c 70 2e 72 6c 69 6d 5f 63 75 72 20 3d 20  wrlp.rlim_cur = 
10e0: 4e 4f 46 49 4c 45 3b 0a 09 20 20 20 20 69 66 20  NOFILE;..    if 
10f0: 28 73 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49  (setrlimit(RLIMI
1100: 54 5f 4e 4f 46 49 4c 45 2c 20 26 6e 65 77 72 6c  T_NOFILE, &newrl
1110: 70 29 20 3d 3d 20 30 29 0a 09 09 72 65 74 75 72  p) == 0)...retur
1120: 6e 20 4e 4f 46 49 4c 45 3b 0a 09 7d 0a 09 72 65  n NOFILE;..}..re
1130: 74 75 72 6e 20 72 6c 70 2e 72 6c 69 6d 5f 63 75  turn rlp.rlim_cu
1140: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  r;.    }.    els
1150: 65 20 7b 0a 09 72 65 74 75 72 6e 20 4e 4f 46 49  e {..return NOFI
1160: 4c 45 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64  LE;.    }.}.#end
1170: 69 66 0a 0c 0a 2f 2a 0a 20 2a 20 66 75 6e 63 5f  if.../*. * func_
1180: 6e 61 6d 65 3a 0a 20 2a 09 49 66 20 61 20 50 43  name:. *.If a PC
1190: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
11a0: 61 20 63 6f 6d 70 69 6c 65 64 20 66 75 6e 63 74  a compiled funct
11b0: 69 6f 6e 20 74 68 65 6e 0a 20 2a 09 72 65 74 75  ion then. *.retu
11c0: 72 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 27  rn the function'
11d0: 73 20 6e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73  s name. Otherwis
11e0: 65 2c 20 72 65 74 75 72 6e 0a 20 2a 09 4e 55 4c  e, return. *.NUL
11f0: 4c 2e 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68  L.. */..const ch
1200: 61 72 20 2a 66 75 6e 63 5f 6e 61 6d 65 28 69 6e  ar *func_name(in
1210: 74 20 70 63 29 0a 7b 0a 20 20 20 20 63 6f 6e 73  t pc).{.    cons
1220: 74 20 73 79 6d 62 6f 6c 20 2a 09 73 3b 0a 0a 20  t symbol *.s;.. 
1230: 20 20 20 66 6f 72 20 28 73 20 3d 20 53 79 6d 62     for (s = Symb
1240: 6f 6c 5f 74 61 62 6c 65 3b 20 73 20 21 3d 20 28  ol_table; s != (
1250: 73 79 6d 62 6f 6c 20 2a 29 20 4e 55 4c 4c 3b 20  symbol *) NULL; 
1260: 73 20 3d 20 73 2d 3e 6e 65 78 74 29 20 7b 0a 09  s = s->next) {..
1270: 69 66 20 28 73 2d 3e 74 79 70 65 20 3d 3d 20 46  if (s->type == F
1280: 55 4e 43 54 49 4f 4e 20 26 26 20 73 2d 3e 76 61  UNCTION && s->va
1290: 6c 75 65 20 3d 3d 20 70 63 29 20 7b 0a 09 20 20  lue == pc) {..  
12a0: 20 20 72 65 74 75 72 6e 20 73 2d 3e 6e 61 6d 65    return s->name
12b0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
12c0: 72 65 74 75 72 6e 20 28 63 68 61 72 20 2a 29 20  return (char *) 
12d0: 4e 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20  NULL;.}.../*. * 
12e0: 61 63 74 69 76 61 74 65 3a 0a 20 2a 09 49 66 20  activate:. *.If 
12f0: 61 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63  a function is ac
1300: 74 69 76 65 20 74 68 65 6e 20 72 65 74 75 72 6e  tive then return
1310: 20 30 20 28 46 41 4c 53 45 29 2e 20 49 66 20 74   0 (FALSE). If t
1320: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 09 69  he function. *.i
1330: 73 20 6e 6f 74 20 61 63 74 69 76 65 20 74 68 65  s not active the
1340: 6e 20 73 61 76 65 20 74 68 65 20 70 63 20 61 6e  n save the pc an
1350: 64 20 72 65 74 75 72 6e 20 31 20 28 54 52 55 45  d return 1 (TRUE
1360: 29 2e 0a 20 2a 2f 0a 0a 69 6e 74 20 61 63 74 69  ).. */..int acti
1370: 76 61 74 65 28 69 6e 74 20 70 63 29 0a 7b 0a 20  vate(int pc).{. 
1380: 20 20 20 69 6e 74 09 09 69 3b 0a 0a 20 20 20 20     int..i;..    
1390: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
13a0: 6e 75 6d 5f 61 63 74 69 76 65 5f 66 75 6e 63 73  num_active_funcs
13b0: 3b 20 69 2b 2b 29 20 7b 0a 09 69 66 20 28 70 63  ; i++) {..if (pc
13c0: 20 3d 3d 20 61 63 74 69 76 65 5f 66 75 6e 63 73   == active_funcs
13d0: 5b 69 5d 29 20 7b 0a 09 20 20 20 20 72 65 74 75  [i]) {..    retu
13e0: 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  rn 0;..}.    }..
13f0: 20 20 20 20 61 63 74 69 76 65 5f 66 75 6e 63 73      active_funcs
1400: 20 3d 0a 09 52 45 41 4c 4c 4f 43 41 54 45 28 61   =..REALLOCATE(a
1410: 63 74 69 76 65 5f 66 75 6e 63 73 2c 20 28 6e 75  ctive_funcs, (nu
1420: 6d 5f 61 63 74 69 76 65 5f 66 75 6e 63 73 20 2b  m_active_funcs +
1430: 20 31 29 20 2a 20 73 69 7a 65 6f 66 28 69 6e 74   1) * sizeof(int
1440: 29 29 3b 0a 0a 20 20 20 20 61 63 74 69 76 65 5f  ));..    active_
1450: 66 75 6e 63 73 5b 6e 75 6d 5f 61 63 74 69 76 65  funcs[num_active
1460: 5f 66 75 6e 63 73 2b 2b 5d 20 3d 20 70 63 3b 0a  _funcs++] = pc;.
1470: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a      return 1;.}.
1480: 0c 0a 2f 2a 0a 20 2a 20 64 65 61 63 74 69 76 61  ../*. * deactiva
1490: 74 65 3a 0a 20 2a 09 52 65 6d 6f 76 65 20 61 20  te:. *.Remove a 
14a0: 66 75 6e 63 74 69 6f 6e 27 73 20 70 63 20 66 72  function's pc fr
14b0: 6f 6d 20 74 68 65 20 61 63 74 69 76 65 20 6c 69  om the active li
14c0: 73 74 2e 0a 20 2a 2f 0a 0a 76 6f 69 64 20 64 65  st.. */..void de
14d0: 61 63 74 69 76 61 74 65 28 69 6e 74 20 70 63 29  activate(int pc)
14e0: 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .{.    const cha
14f0: 72 20 2a 09 66 6e 3b 0a 20 20 20 20 69 6e 74 09  r *.fn;.    int.
1500: 09 09 69 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  ..i;..    for (i
1510: 20 3d 20 30 3b 20 69 20 3c 20 6e 75 6d 5f 61 63   = 0; i < num_ac
1520: 74 69 76 65 5f 66 75 6e 63 73 3b 20 69 2b 2b 29  tive_funcs; i++)
1530: 20 7b 0a 09 69 66 20 28 70 63 20 3d 3d 20 61 63   {..if (pc == ac
1540: 74 69 76 65 5f 66 75 6e 63 73 5b 69 5d 29 20 7b  tive_funcs[i]) {
1550: 0a 09 20 20 20 20 69 66 20 28 6e 75 6d 5f 61 63  ..    if (num_ac
1560: 74 69 76 65 5f 66 75 6e 63 73 20 3d 3d 20 31 29  tive_funcs == 1)
1570: 20 7b 0a 09 09 6e 75 6d 5f 61 63 74 69 76 65 5f   {...num_active_
1580: 66 75 6e 63 73 20 3d 20 30 3b 0a 09 09 66 72 65  funcs = 0;...fre
1590: 65 28 28 63 68 61 72 20 2a 29 20 61 63 74 69 76  e((char *) activ
15a0: 65 5f 66 75 6e 63 73 29 3b 0a 09 09 61 63 74 69  e_funcs);...acti
15b0: 76 65 5f 66 75 6e 63 73 20 3d 20 28 69 6e 74 20  ve_funcs = (int 
15c0: 2a 29 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  *) NULL;..    }.
15d0: 09 20 20 20 20 65 6c 73 65 20 7b 0a 09 09 66 6f  .    else {...fo
15e0: 72 20 28 2d 2d 6e 75 6d 5f 61 63 74 69 76 65 5f  r (--num_active_
15f0: 66 75 6e 63 73 3b 20 69 20 3c 20 6e 75 6d 5f 61  funcs; i < num_a
1600: 63 74 69 76 65 5f 66 75 6e 63 73 3b 20 69 2b 2b  ctive_funcs; i++
1610: 29 20 7b 0a 09 09 20 20 20 20 61 63 74 69 76 65  ) {...    active
1620: 5f 66 75 6e 63 73 5b 69 5d 20 3d 20 61 63 74 69  _funcs[i] = acti
1630: 76 65 5f 66 75 6e 63 73 5b 69 20 2b 20 31 5d 3b  ve_funcs[i + 1];
1640: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20  ...}..    }..   
1650: 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20   return;..}.    
1660: 7d 0a 0a 20 20 20 20 66 6e 20 3d 20 66 75 6e 63  }..    fn = func
1670: 5f 6e 61 6d 65 28 70 63 29 3b 0a 20 20 20 20 65  _name(pc);.    e
1680: 72 72 6f 72 28 22 64 65 61 63 74 69 76 61 74 65  rror("deactivate
1690: 3a 20 66 75 6e 63 74 69 6f 6e 20 27 25 73 27 20  : function '%s' 
16a0: 6e 6f 74 20 61 63 74 69 76 65 5c 6e 22 2c 20 28  not active\n", (
16b0: 66 6e 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 22 22  fn == NULL) ? ""
16c0: 20 3a 20 66 6e 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20   : fn);.}.../*. 
16d0: 2a 20 66 6d 74 5f 72 65 71 5f 73 74 61 74 3a 0a  * fmt_req_stat:.
16e0: 20 2a 09 53 63 61 6e 20 27 2d 70 27 20 73 77 69   *.Scan '-p' swi
16f0: 74 63 68 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  tch format strin
1700: 67 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20 74  g for anything t
1710: 68 61 74 0a 20 2a 09 72 65 71 75 69 72 65 73 20  hat. *.requires 
1720: 61 20 73 74 61 74 28 29 20 63 61 6c 6c 20 74 6f  a stat() call to
1730: 20 62 65 20 6d 61 64 65 2e 0a 20 2a 09 52 65 74   be made.. *.Ret
1740: 75 72 6e 20 54 52 55 45 20 69 66 20 73 74 61 74  urn TRUE if stat
1750: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 72 20  () is needed or 
1760: 46 41 4c 53 45 20 69 66 20 69 74 20 69 73 6e 27  FALSE if it isn'
1770: 74 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  t.. */..static i
1780: 6e 74 20 66 6d 74 5f 72 65 71 5f 73 74 61 74 28  nt fmt_req_stat(
1790: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 63 6f 6e 73  void).{.    cons
17a0: 74 20 63 68 61 72 20 2a 09 66 70 3b 0a 20 20 20  t char *.fp;.   
17b0: 20 69 6e 74 09 09 09 73 74 61 74 5f 61 6c 6c 20   int...stat_all 
17c0: 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 20 20 66 6f  = FALSE;..    fo
17d0: 72 20 28 66 70 20 3d 20 61 74 74 72 2e 66 6f 72  r (fp = attr.for
17e0: 6d 61 74 3b 20 2a 66 70 20 21 3d 20 27 5c 30 27  mat; *fp != '\0'
17f0: 20 26 26 20 21 73 74 61 74 5f 61 6c 6c 3b 20 66   && !stat_all; f
1800: 70 2b 2b 29 20 7b 0a 09 69 66 20 28 2a 66 70 20  p++) {..if (*fp 
1810: 21 3d 20 27 25 27 29 20 7b 0a 09 20 20 20 20 63  != '%') {..    c
1820: 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 0a 09 2b 2b  ontinue;..}...++
1830: 66 70 3b 0a 0a 09 73 77 69 74 63 68 20 28 2a 66  fp;...switch (*f
1840: 70 29 20 7b 0a 09 63 61 73 65 20 27 5c 30 27 3a  p) {..case '\0':
1850: 0a 09 20 20 20 20 65 72 72 6f 72 28 22 66 6f 72  ..    error("for
1860: 6d 61 74 20 63 68 61 72 61 63 74 65 72 20 6d 69  mat character mi
1870: 73 73 69 6e 67 20 61 66 74 65 72 20 27 25 25 27  ssing after '%%'
1880: 22 29 3b 0a 09 20 20 20 20 2f 2a 4e 4f 54 52 45  ");..    /*NOTRE
1890: 41 43 48 45 44 2a 2f 0a 09 20 20 20 20 0a 09 63  ACHED*/..    ..c
18a0: 61 73 65 20 27 61 27 3a 0a 23 69 66 20 42 53 44  ase 'a':.#if BSD
18b0: 0a 09 63 61 73 65 20 27 62 27 3a 0a 09 63 61 73  ..case 'b':..cas
18c0: 65 20 27 42 27 3a 0a 23 65 6e 64 69 66 0a 09 63  e 'B':.#endif..c
18d0: 61 73 65 20 27 63 27 3a 0a 09 63 61 73 65 20 27  ase 'c':..case '
18e0: 67 27 3a 0a 09 63 61 73 65 20 27 47 27 3a 0a 09  g':..case 'G':..
18f0: 63 61 73 65 20 27 69 27 3a 0a 09 63 61 73 65 20  case 'i':..case 
1900: 27 6c 27 3a 0a 09 63 61 73 65 20 27 6d 27 3a 0a  'l':..case 'm':.
1910: 09 63 61 73 65 20 27 70 27 3a 0a 09 63 61 73 65  .case 'p':..case
1920: 20 27 50 27 3a 0a 09 63 61 73 65 20 27 72 27 3a   'P':..case 'r':
1930: 0a 09 63 61 73 65 20 27 52 27 3a 0a 09 63 61 73  ..case 'R':..cas
1940: 65 20 27 75 27 3a 0a 09 63 61 73 65 20 27 55 27  e 'u':..case 'U'
1950: 3a 0a 09 63 61 73 65 20 27 77 27 3a 0a 09 63 61  :..case 'w':..ca
1960: 73 65 20 27 57 27 3a 0a 09 63 61 73 65 20 27 79  se 'W':..case 'y
1970: 27 3a 0a 09 63 61 73 65 20 27 7a 27 3a 0a 09 20  ':..case 'z':.. 
1980: 20 20 20 73 74 61 74 5f 61 6c 6c 20 3d 20 54 52     stat_all = TR
1990: 55 45 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  UE;..    break;.
19a0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  .}.    }..    re
19b0: 74 75 72 6e 20 73 74 61 74 5f 61 6c 6c 3b 0a 7d  turn stat_all;.}
19c0: 0a 0c 0a 2f 2a 0a 20 2a 20 70 72 6f 67 5f 72 65  .../*. * prog_re
19d0: 71 5f 73 74 61 74 3a 0a 20 2a 09 53 63 61 6e 20  q_stat:. *.Scan 
19e0: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 70 72 6f  the compiled pro
19f0: 67 72 61 6d 20 66 6f 72 20 61 6e 79 20 62 75 69  gram for any bui
1a00: 6c 74 69 6e 20 66 75 6e 63 74 69 6f 6e 73 0a 20  ltin functions. 
1a10: 2a 09 74 68 61 74 20 72 65 71 75 69 72 65 20 61  *.that require a
1a20: 20 73 74 61 74 28 29 20 63 61 6c 6c 20 74 6f 20   stat() call to 
1a30: 62 65 20 6d 61 64 65 2e 0a 20 2a 09 52 65 74 75  be made.. *.Retu
1a40: 72 6e 20 54 52 55 45 20 69 66 20 73 74 61 74 28  rn TRUE if stat(
1a50: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 72 20 46  ) is needed or F
1a60: 41 4c 53 45 20 69 66 20 69 74 20 69 73 6e 27 74  ALSE if it isn't
1a70: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  .. */..static in
1a80: 74 20 70 72 6f 67 5f 72 65 71 5f 73 74 61 74 28  t prog_req_stat(
1a90: 69 6e 74 20 70 63 29 0a 7b 0a 20 20 20 20 63 6f  int pc).{.    co
1aa0: 6e 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nst instruction 
1ab0: 2a 09 69 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20  *.ip;.    const 
1ac0: 73 79 6d 62 6f 6c 20 2a 09 73 79 6d 3b 0a 0a 20  symbol *.sym;.. 
1ad0: 20 20 20 69 66 20 28 53 74 61 63 6b 50 72 6f 67     if (StackProg
1ae0: 72 61 6d 5b 70 63 5d 2e 66 75 6e 63 20 3d 3d 20  ram[pc].func == 
1af0: 45 4e 44 5f 4f 46 5f 50 52 4f 47 29 20 7b 0a 09  END_OF_PROG) {..
1b00: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1b10: 0a 0a 20 20 20 20 66 6f 72 20 28 69 70 20 3d 20  ..    for (ip = 
1b20: 26 53 74 61 63 6b 50 72 6f 67 72 61 6d 5b 70 63  &StackProgram[pc
1b30: 5d 3b 20 69 70 2d 3e 66 75 6e 63 20 21 3d 20 4e  ]; ip->func != N
1b40: 55 4c 4c 5f 49 4e 53 54 52 3b 20 69 70 2b 2b 2c  ULL_INSTR; ip++,
1b50: 20 70 63 2b 2b 29 20 7b 0a 09 66 6f 72 20 28 73   pc++) {..for (s
1b60: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 74 61 62 6c  ym = Symbol_tabl
1b70: 65 3b 20 73 79 6d 20 21 3d 20 28 73 79 6d 62 6f  e; sym != (symbo
1b80: 6c 20 2a 29 20 4e 55 4c 4c 3b 20 73 79 6d 20 3d  l *) NULL; sym =
1b90: 20 73 79 6d 2d 3e 6e 65 78 74 29 20 7b 0a 09 20   sym->next) {.. 
1ba0: 20 20 20 69 66 20 28 69 70 2d 3e 66 75 6e 63 20     if (ip->func 
1bb0: 3d 3d 20 73 79 6d 2d 3e 66 75 6e 63 29 20 7b 0a  == sym->func) {.
1bc0: 09 09 69 66 20 28 73 79 6d 2d 3e 72 65 71 5f 73  ..if (sym->req_s
1bd0: 74 61 74 29 20 7b 0a 09 09 20 20 20 20 72 65 74  tat) {...    ret
1be0: 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 09 62 72 65  urn 1;...}...bre
1bf0: 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09  ak;..    }..}...
1c00: 69 66 20 28 69 70 2d 3e 66 75 6e 63 20 3d 3d 20  if (ip->func == 
1c10: 63 5f 66 75 6e 63 29 20 7b 0a 09 20 20 20 20 69  c_func) {..    i
1c20: 66 20 28 61 63 74 69 76 61 74 65 28 69 70 2d 3e  f (activate(ip->
1c30: 76 61 6c 75 65 2e 70 63 29 29 20 7b 0a 09 09 69  value.pc)) {...i
1c40: 66 20 28 70 72 6f 67 5f 72 65 71 5f 73 74 61 74  f (prog_req_stat
1c50: 28 28 69 6e 74 29 20 69 70 2d 3e 76 61 6c 75 65  ((int) ip->value
1c60: 2e 70 63 29 29 20 7b 0a 09 09 20 20 20 20 64 65  .pc)) {...    de
1c70: 61 63 74 69 76 61 74 65 28 69 70 2d 3e 76 61 6c  activate(ip->val
1c80: 75 65 2e 70 63 29 3b 0a 09 09 20 20 20 20 72 65  ue.pc);...    re
1c90: 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 09 64 65  turn 1;...}...de
1ca0: 61 63 74 69 76 61 74 65 28 69 70 2d 3e 76 61 6c  activate(ip->val
1cb0: 75 65 2e 70 63 29 3b 0a 09 20 20 20 20 7d 0a 09  ue.pc);..    }..
1cc0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  }.    }..    ret
1cd0: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  urn 0;.}.../*. *
1ce0: 20 65 78 65 63 75 74 65 3a 0a 20 2a 09 45 78 65   execute:. *.Exe
1cf0: 63 75 74 65 20 74 68 65 20 70 72 6f 67 72 61 6d  cute the program
1d00: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1d10: 65 20 53 74 61 63 6b 50 72 6f 67 72 61 6d 5b 5d  e StackProgram[]
1d20: 20 61 72 72 61 79 2e 0a 20 2a 09 45 61 63 68 20   array.. *.Each 
1d30: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 53  element of the S
1d40: 74 61 63 6b 50 72 6f 67 72 61 6d 5b 5d 20 61 72  tackProgram[] ar
1d50: 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ray contains a p
1d60: 6f 69 6e 74 65 72 0a 20 2a 09 74 6f 20 61 20 43  ointer. *.to a C
1d70: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 09 50 72   function.. *.Pr
1d80: 6f 67 72 61 6d 73 20 61 72 65 20 4e 55 4c 4c 5f  ograms are NULL_
1d90: 49 4e 53 54 52 20 74 65 72 6d 69 6e 61 74 65 64  INSTR terminated
1da0: 2e 20 28 4e 55 4c 4c 5f 49 4e 53 54 52 20 69 73  . (NULL_INSTR is
1db0: 20 61 20 4e 55 4c 4c 0a 20 2a 09 66 75 6e 63 74   a NULL. *.funct
1dc0: 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 29 0a 20 2a  ion pointer.). *
1dd0: 09 52 65 74 75 72 6e 73 20 74 68 65 20 72 65 73  .Returns the res
1de0: 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
1df0: 73 73 69 6f 6e 2e 0a 20 2a 2f 0a 0a 73 74 61 74  ssion.. */..stat
1e00: 69 63 20 6c 6f 6e 67 20 65 78 65 63 75 74 65 28  ic long execute(
1e10: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 53 50 20 3d  void).{.    SP =
1e20: 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61   0;..    if (sta
1e30: 72 74 50 43 20 3d 3d 20 2d 31 29 20 7b 0a 09 72  rtPC == -1) {..r
1e40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1e50: 20 20 20 20 66 6f 72 20 28 50 43 20 3d 20 73 74      for (PC = st
1e60: 61 72 74 50 43 3b 20 53 74 61 63 6b 50 72 6f 67  artPC; StackProg
1e70: 72 61 6d 5b 50 43 5d 2e 66 75 6e 63 20 21 3d 20  ram[PC].func != 
1e80: 4e 55 4c 4c 5f 49 4e 53 54 52 3b 20 50 43 2b 2b  NULL_INSTR; PC++
1e90: 29 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ) {.#if defined(
1ea0: 44 45 42 55 47 29 0a 09 69 66 20 28 54 72 61 63  DEBUG)..if (Trac
1eb0: 65 29 20 7b 0a 09 20 20 20 20 64 75 6d 70 5f 69  e) {..    dump_i
1ec0: 6e 73 74 72 28 50 43 2c 20 26 53 74 61 63 6b 50  nstr(PC, &StackP
1ed0: 72 6f 67 72 61 6d 5b 50 43 5d 29 3b 0a 09 7d 0a  rogram[PC]);..}.
1ee0: 23 65 6e 64 69 66 0a 09 28 2a 53 74 61 63 6b 50  #endif..(*StackP
1ef0: 72 6f 67 72 61 6d 5b 50 43 5d 2e 66 75 6e 63 29  rogram[PC].func)
1f00: 28 26 53 74 61 63 6b 50 72 6f 67 72 61 6d 5b 50  (&StackProgram[P
1f10: 43 5d 2e 76 61 6c 75 65 29 3b 0a 09 69 66 20 28  C].value);..if (
1f20: 53 50 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 65  SP < 0) {..    e
1f30: 72 72 6f 72 28 22 64 61 74 61 20 73 74 61 63 6b  rror("data stack
1f40: 20 75 6e 64 65 72 66 6c 6f 77 22 29 3b 0a 09 7d   underflow");..}
1f50: 0a 09 65 6c 73 65 20 69 66 20 28 53 50 20 3e 3d  ..else if (SP >=
1f60: 20 4d 41 58 5f 53 54 41 43 4b 5f 4c 45 4e 29 20   MAX_STACK_LEN) 
1f70: 7b 0a 09 20 20 20 20 65 72 72 6f 72 28 22 64 61  {..    error("da
1f80: 74 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  ta stack overflo
1f90: 77 22 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 69  w");..}.    }.#i
1fa0: 66 20 64 65 66 69 6e 65 64 28 44 45 42 55 47 29  f defined(DEBUG)
1fb0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 50 20 3d  .    assert(SP =
1fc0: 3d 20 31 29 3b 0a 20 20 20 20 69 66 20 28 54 72  = 1);.    if (Tr
1fd0: 61 63 65 29 20 7b 0a 09 28 76 6f 69 64 29 20 66  ace) {..(void) f
1fe0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1ff0: 65 78 65 63 75 74 65 28 29 20 72 65 74 75 72 6e  execute() return
2000: 69 6e 67 20 25 6c 64 5c 6e 22 2c 20 53 74 61 63  ing %ld\n", Stac
2010: 6b 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  k[0]);.    }.#en
2020: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
2030: 74 61 63 6b 5b 30 5d 3b 0a 7d 0a 0c 0a 2f 2a 0a  tack[0];.}.../*.
2040: 20 2a 20 65 78 61 6d 31 3a 0a 20 2a 20 65 78 61   * exam1:. * exa
2050: 6d 32 3a 0a 20 2a 20 65 78 61 6d 33 3a 0a 20 2a  m2:. * exam3:. *
2060: 20 65 78 61 6d 34 3a 0a 20 2a 09 4f 6e 65 20 6f   exam4:. *.One o
2070: 66 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  f these function
2080: 73 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  s is called for 
2090: 65 76 65 72 79 20 66 69 6c 65 20 74 68 61 74 20  every file that 
20a0: 27 72 68 27 0a 20 2a 09 65 78 61 6d 69 6e 65 73  'rh'. *.examines
20b0: 2e 20 45 61 63 68 20 66 75 6e 63 74 69 6f 6e 20  . Each function 
20c0: 66 69 72 73 74 20 63 61 6c 6c 73 20 65 78 65 63  first calls exec
20d0: 75 74 65 28 29 20 74 6f 20 73 65 65 20 69 66 20  ute() to see if 
20e0: 74 68 65 0a 20 2a 09 65 78 70 72 65 73 73 69 6f  the. *.expressio
20f0: 6e 20 69 73 20 54 52 55 45 2e 20 49 66 20 74 68  n is TRUE. If th
2100: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
2110: 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a  TRUE (non-zero).
2120: 20 2a 09 74 68 65 6e 20 74 68 65 20 61 63 74 69   *.then the acti
2130: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 62 79 20  on specified by 
2140: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
2150: 20 6f 70 74 69 6f 6e 73 20 69 73 0a 20 2a 09 65   options is. *.e
2160: 78 65 63 75 74 65 64 2e 0a 20 2a 2f 0a 0a 2f 2a  xecuted.. */../*
2170: 20 70 72 69 6e 74 20 66 69 6c 65 20 6f 75 74 20   print file out 
2180: 62 79 20 69 74 73 65 6c 66 20 2a 2f 0a 0a 73 74  by itself */..st
2190: 61 74 69 63 20 76 6f 69 64 20 65 78 61 6d 31 28  atic void exam1(
21a0: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 69 66 20 28  void).{.    if (
21b0: 65 78 65 63 75 74 65 28 29 29 20 7b 0a 09 28 76  execute()) {..(v
21c0: 6f 69 64 29 20 70 72 69 6e 74 66 28 22 25 73 5c  oid) printf("%s\
21d0: 6e 22 2c 20 61 74 74 72 2e 67 72 61 70 68 69 63  n", attr.graphic
21e0: 20 3f 20 67 72 61 70 68 69 63 28 61 74 74 72 2e   ? graphic(attr.
21f0: 66 6e 61 6d 65 29 20 3a 20 61 74 74 72 2e 66 6e  fname) : attr.fn
2200: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2210: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 6c 6f  return;.}../* lo
2220: 6e 67 20 6f 75 74 70 75 74 20 6f 66 20 66 69 6c  ng output of fil
2230: 65 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  e */..static voi
2240: 64 20 65 78 61 6d 32 28 76 6f 69 64 29 0a 7b 0a  d exam2(void).{.
2250: 20 20 20 20 69 66 20 28 65 78 65 63 75 74 65 28      if (execute(
2260: 29 29 20 7b 0a 09 70 72 69 6e 74 65 6e 74 72 79  )) {..printentry
2270: 28 61 74 74 72 2e 76 65 72 62 6f 73 65 2c 20 61  (attr.verbose, a
2280: 74 74 72 2e 73 74 72 5f 6f 77 6e 65 72 2c 20 61  ttr.str_owner, a
2290: 74 74 72 2e 66 75 6c 6c 5f 64 61 74 65 2c 0a 09  ttr.full_date,..
22a0: 09 20 20 20 61 74 74 72 2e 62 75 66 2c 20 61 74  .   attr.buf, at
22b0: 74 72 2e 66 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  tr.fname);.    }
22c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
22d0: 2f 2a 20 66 6f 72 6d 61 74 74 65 64 20 6f 75 74  /* formatted out
22e0: 70 75 74 20 6f 66 20 66 69 6c 65 20 69 6e 66 6f  put of file info
22f0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 73 74 61 74  rmation */..stat
2300: 69 63 20 76 6f 69 64 20 65 78 61 6d 33 28 76 6f  ic void exam3(vo
2310: 69 64 29 0a 7b 0a 20 20 20 20 69 66 20 28 65 78  id).{.    if (ex
2320: 65 63 75 74 65 28 29 29 20 7b 0a 09 70 72 69 6e  ecute()) {..prin
2330: 74 66 6f 72 6d 61 74 28 61 74 74 72 2e 62 75 66  tformat(attr.buf
2340: 2c 20 61 74 74 72 2e 66 6e 61 6d 65 2c 20 61 74  , attr.fname, at
2350: 74 72 2e 64 65 70 74 68 29 3b 0a 20 20 20 20 7d  tr.depth);.    }
2360: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .    return;.}..
2370: 2f 2a 20 64 6f 20 61 20 73 79 73 74 65 6d 28 33  /* do a system(3
2380: 29 20 63 61 6c 6c 20 6f 66 20 64 65 73 69 72 65  ) call of desire
2390: 64 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 0a 73 74  d command */..st
23a0: 61 74 69 63 20 76 6f 69 64 20 65 78 61 6d 34 28  atic void exam4(
23b0: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 63 68 61 72  void).{.    char
23c0: 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 5b          command[
23d0: 4e 43 41 52 47 53 5d 3b 0a 20 20 20 20 63 68 61  NCARGS];.    cha
23e0: 72 20 2a 20 20 20 20 20 20 65 6e 64 3b 0a 20 20  r *      end;.  
23f0: 20 20 69 6e 74 20 20 20 20 20 20 20 20 20 66 5f    int         f_
2400: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 20 20 20  l;.    char *   
2410: 20 20 20 6e 3b 0a 20 20 20 20 69 6e 74 20 20 20     n;.    int   
2420: 20 20 20 20 20 20 6e 5f 6c 3b 0a 20 20 20 20 63        n_l;.    c
2430: 68 61 72 20 2a 20 20 20 20 20 20 70 3b 0a 20 20  har *      p;.  
2440: 20 20 63 68 61 72 20 2a 20 20 20 20 20 20 71 3b    char *      q;
2450: 0a 20 20 20 20 63 68 61 72 20 2a 20 20 20 20 20  .    char *     
2460: 20 72 3b 0a 20 20 20 20 69 6e 74 20 20 20 20 20   r;.    int     
2470: 20 20 20 20 72 76 3b 0a 20 20 20 20 0a 20 20 20      rv;.    .   
2480: 20 69 66 20 28 65 78 65 63 75 74 65 28 29 29 20   if (execute()) 
2490: 7b 0a 09 70 20 3d 20 63 6f 6d 6d 61 6e 64 3b 0a  {..p = command;.
24a0: 09 65 6e 64 20 3d 20 63 6f 6d 6d 61 6e 64 20 2b  .end = command +
24b0: 20 73 69 7a 65 6f 66 28 63 6f 6d 6d 61 6e 64 29   sizeof(command)
24c0: 3b 0a 09 6e 20 3d 20 28 63 68 61 72 20 2a 29 20  ;..n = (char *) 
24d0: 4e 55 4c 4c 3b 0a 09 71 20 3d 20 61 74 74 72 2e  NULL;..q = attr.
24e0: 63 6f 6d 6d 61 6e 64 3b 0a 09 66 5f 6c 20 3d 20  command;..f_l = 
24f0: 73 74 72 6c 65 6e 28 61 74 74 72 2e 66 6e 61 6d  strlen(attr.fnam
2500: 65 29 3b 0a 09 77 68 69 6c 65 20 28 2a 71 20 21  e);..while (*q !
2510: 3d 20 27 5c 30 27 29 20 7b 0a 09 20 20 20 20 69  = '\0') {..    i
2520: 66 20 28 2a 71 20 21 3d 20 27 25 27 29 20 7b 0a  f (*q != '%') {.
2530: 09 09 2a 70 2b 2b 20 3d 20 2a 71 2b 2b 3b 0a 09  ..*p++ = *q++;..
2540: 20 20 20 20 7d 0a 09 20 20 20 20 65 6c 73 65 20      }..    else 
2550: 7b 0a 09 09 2b 2b 71 3b 0a 09 09 69 66 20 28 2a  {...++q;...if (*
2560: 71 20 3d 3d 20 27 73 27 29 20 7b 0a 09 09 20 20  q == 's') {...  
2570: 20 20 69 66 20 28 28 70 20 2b 20 66 5f 6c 29 20    if ((p + f_l) 
2580: 3e 3d 20 65 6e 64 29 20 7b 0a 09 09 09 77 61 72  >= end) {....war
2590: 6e 69 6e 67 28 22 25 73 3a 20 6d 61 78 69 6d 75  ning("%s: maximu
25a0: 6d 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6c  m command line l
25b0: 65 6e 67 74 68 20 65 78 63 65 65 64 65 64 22 2c  ength exceeded",
25c0: 0a 09 09 09 09 61 74 74 72 2e 66 6e 61 6d 65 29  .....attr.fname)
25d0: 3b 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 20  ;....return;... 
25e0: 20 20 20 7d 0a 09 09 20 20 20 20 72 20 3d 20 61     }...    r = a
25f0: 74 74 72 2e 66 6e 61 6d 65 3b 0a 09 09 20 20 20  ttr.fname;...   
2600: 20 77 68 69 6c 65 20 28 28 2a 70 2b 2b 20 3d 20   while ((*p++ = 
2610: 2a 72 2b 2b 29 20 21 3d 20 27 5c 30 27 29 0a 09  *r++) != '\0')..
2620: 09 09 2f 2a 20 76 6f 69 64 20 2a 2f 20 3b 0a 09  ../* void */ ;..
2630: 09 20 20 20 20 70 2d 2d 3b 0a 09 09 7d 0a 09 09  .    p--;...}...
2640: 65 6c 73 65 20 69 66 20 28 2a 71 20 3d 3d 20 27  else if (*q == '
2650: 53 27 29 20 7b 0a 09 09 20 20 20 20 69 66 20 28  S') {...    if (
2660: 6e 20 3d 3d 20 28 63 68 61 72 20 2a 29 20 4e 55  n == (char *) NU
2670: 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 28 6e 20  LL) {....if ((n 
2680: 3d 20 73 74 72 72 63 68 72 28 61 74 74 72 2e 66  = strrchr(attr.f
2690: 6e 61 6d 65 2c 20 27 2f 27 29 29 20 3d 3d 20 28  name, '/')) == (
26a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a  char *) NULL) {.
26b0: 09 09 09 20 20 20 20 6e 20 3d 20 61 74 74 72 2e  ...    n = attr.
26c0: 66 6e 61 6d 65 3b 0a 09 09 09 7d 0a 09 09 09 65  fname;....}....e
26d0: 6c 73 65 20 7b 0a 09 09 09 20 20 20 20 2b 2b 6e  lse {....    ++n
26e0: 3b 0a 09 09 09 7d 0a 09 09 09 6e 5f 6c 20 3d 20  ;....}....n_l = 
26f0: 73 74 72 6c 65 6e 28 6e 29 3b 0a 09 09 20 20 20  strlen(n);...   
2700: 20 7d 0a 09 09 20 20 20 20 69 66 20 28 28 70 20   }...    if ((p 
2710: 2b 20 6e 5f 6c 29 20 3e 3d 20 65 6e 64 29 20 7b  + n_l) >= end) {
2720: 0a 09 09 09 77 61 72 6e 69 6e 67 28 22 25 73 3a  ....warning("%s:
2730: 20 6d 61 78 69 6d 75 6d 20 63 6f 6d 6d 61 6e 64   maximum command
2740: 20 6c 69 6e 65 20 6c 65 6e 67 74 68 20 65 78 63   line length exc
2750: 65 65 64 65 64 22 2c 0a 09 09 09 09 61 74 74 72  eeded",.....attr
2760: 2e 66 6e 61 6d 65 29 3b 0a 09 09 09 72 65 74 75  .fname);....retu
2770: 72 6e 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20  rn;...    }...  
2780: 20 20 72 20 3d 20 6e 3b 0a 09 09 20 20 20 20 77    r = n;...    w
2790: 68 69 6c 65 20 28 28 2a 70 2b 2b 20 3d 20 2a 72  hile ((*p++ = *r
27a0: 2b 2b 29 20 21 3d 20 27 5c 30 27 29 0a 09 09 09  ++) != '\0')....
27b0: 2f 2a 20 76 6f 69 64 20 2a 2f 20 3b 0a 09 09 20  /* void */ ;... 
27c0: 20 20 20 70 2d 2d 3b 0a 09 09 7d 0a 09 09 65 6c     p--;...}...el
27d0: 73 65 20 7b 0a 09 09 20 20 20 20 69 66 20 28 28  se {...    if ((
27e0: 70 20 2b 20 32 29 20 3e 3d 20 65 6e 64 29 20 7b  p + 2) >= end) {
27f0: 0a 09 09 09 77 61 72 6e 69 6e 67 28 22 25 73 3a  ....warning("%s:
2800: 20 6d 61 78 69 6d 75 6d 20 63 6f 6d 6d 61 6e 64   maximum command
2810: 20 6c 69 6e 65 20 6c 65 6e 67 74 68 20 65 78 63   line length exc
2820: 65 65 64 65 64 22 2c 0a 09 09 09 09 61 74 74 72  eeded",.....attr
2830: 2e 66 6e 61 6d 65 29 3b 0a 09 09 09 72 65 74 75  .fname);....retu
2840: 72 6e 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20  rn;...    }...  
2850: 20 20 2a 70 2b 2b 20 3d 20 27 25 27 3b 0a 09 09    *p++ = '%';...
2860: 20 20 20 20 2a 70 2b 2b 20 3d 20 2a 71 3b 0a 09      *p++ = *q;..
2870: 09 7d 0a 09 09 2b 2b 71 3b 0a 09 20 20 20 20 7d  .}...++q;..    }
2880: 0a 09 20 20 20 20 69 66 20 28 70 20 3d 3d 20 65  ..    if (p == e
2890: 6e 64 29 20 7b 0a 09 09 77 61 72 6e 69 6e 67 28  nd) {...warning(
28a0: 22 25 73 3a 20 6d 61 78 69 6d 75 6d 20 63 6f 6d  "%s: maximum com
28b0: 6d 61 6e 64 20 6c 69 6e 65 20 6c 65 6e 67 74 68  mand line length
28c0: 20 65 78 63 65 65 64 65 64 22 2c 0a 09 09 09 61   exceeded",....a
28d0: 74 74 72 2e 66 6e 61 6d 65 29 3b 0a 09 09 72 65  ttr.fname);...re
28e0: 74 75 72 6e 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  turn;..    }..}.
28f0: 09 2a 70 20 3d 20 27 5c 30 27 3b 0a 09 72 76 20  .*p = '\0';..rv 
2900: 3d 20 73 79 73 74 65 6d 28 63 6f 6d 6d 61 6e 64  = system(command
2910: 29 3b 0a 09 69 66 20 28 72 76 20 21 3d 20 30 29  );..if (rv != 0)
2920: 20 7b 0a 09 20 20 20 20 2b 2b 61 74 74 72 2e 6e   {..    ++attr.n
2930: 75 6d 5f 65 72 72 6f 72 73 3b 0a 09 7d 0a 09 69  um_errors;..}..i
2940: 66 20 28 61 74 74 72 2e 76 65 72 62 6f 73 65 29  f (attr.verbose)
2950: 20 7b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 70   {..    (void) p
2960: 72 69 6e 74 66 28 22 25 73 20 65 78 69 74 28 25  rintf("%s exit(%
2970: 64 29 5c 6e 22 2c 20 63 6f 6d 6d 61 6e 64 2c 20  d)\n", command, 
2980: 72 76 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  rv);..}.    }.  
2990: 20 20 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d    .    return;.}
29a0: 0a 0c 0a 2f 2a 0a 20 2a 20 67 65 74 5f 72 68 70  .../*. * get_rhp
29b0: 61 74 68 3a 0a 20 2a 09 52 65 74 75 72 6e 20 76  ath:. *.Return v
29c0: 61 6c 75 65 20 6f 66 20 52 48 50 41 54 48 20 65  alue of RHPATH e
29d0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
29e0: 62 6c 65 2e 0a 20 2a 09 49 66 20 52 48 50 41 54  ble.. *.If RHPAT
29f0: 48 20 69 73 20 6e 6f 74 20 73 65 74 20 74 68 65  H is not set the
2a00: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 74  n attempt to ret
2a10: 75 72 6e 0a 20 2a 09 74 68 65 20 75 73 65 72 27  urn. *.the user'
2a20: 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  s home directory
2a30: 2e 0a 20 2a 0a 20 2a 09 54 68 65 20 76 61 6c 75  .. *. *.The valu
2a40: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
2a50: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
2a60: 79 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63  y.. */..static c
2a70: 68 61 72 20 2a 67 65 74 5f 72 68 70 61 74 68 28  har *get_rhpath(
2a80: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 63 6f 6e 73  void).{.    cons
2a90: 74 20 63 68 61 72 20 2a 09 68 6f 6d 65 3b 0a 20  t char *.home;. 
2aa0: 20 20 20 63 68 61 72 20 2a 09 09 72 68 70 61 74     char *..rhpat
2ab0: 68 3b 0a 0a 20 20 20 20 72 68 70 61 74 68 20 3d  h;..    rhpath =
2ac0: 20 67 65 74 65 6e 76 28 52 48 50 41 54 48 5f 45   getenv(RHPATH_E
2ad0: 4e 56 29 3b 0a 20 20 20 20 69 66 20 28 72 68 70  NV);.    if (rhp
2ae0: 61 74 68 20 3d 3d 20 28 63 68 61 72 20 2a 29 20  ath == (char *) 
2af0: 4e 55 4c 4c 29 20 7b 0a 09 68 6f 6d 65 20 3d 20  NULL) {..home = 
2b00: 67 65 74 65 6e 76 28 48 4f 4d 45 5f 45 4e 56 29  getenv(HOME_ENV)
2b10: 3b 0a 09 69 66 20 28 68 6f 6d 65 20 3d 3d 20 28  ;..if (home == (
2b20: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a  char *) NULL) {.
2b30: 09 20 20 20 20 73 74 72 75 63 74 20 70 61 73 73  .    struct pass
2b40: 77 64 20 2a 09 69 6e 66 6f 3b 0a 09 20 20 20 20  wd *.info;..    
2b50: 0a 09 20 20 20 20 69 6e 66 6f 20 3d 20 67 65 74  ..    info = get
2b60: 70 77 75 69 64 28 67 65 74 75 69 64 28 29 29 3b  pwuid(getuid());
2b70: 0a 09 20 20 20 20 69 66 20 28 69 6e 66 6f 20 3d  ..    if (info =
2b80: 3d 20 28 73 74 72 75 63 74 20 70 61 73 73 77 64  = (struct passwd
2b90: 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 68   *) NULL) {...rh
2ba0: 70 61 74 68 20 3d 20 53 41 56 45 53 54 52 28 22  path = SAVESTR("
2bb0: 2e 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  .");..    }..   
2bc0: 20 65 6c 73 65 20 7b 0a 09 09 72 68 70 61 74 68   else {...rhpath
2bd0: 20 3d 20 41 4c 4c 4f 43 41 54 45 28 73 74 72 6c   = ALLOCATE(strl
2be0: 65 6e 28 69 6e 66 6f 2d 3e 70 77 5f 64 69 72 29  en(info->pw_dir)
2bf0: 20 2b 20 33 29 3b 0a 09 09 28 76 6f 69 64 29 20   + 3);...(void) 
2c00: 73 70 72 69 6e 74 66 28 72 68 70 61 74 68 2c 20  sprintf(rhpath, 
2c10: 22 2e 3a 25 73 22 2c 20 69 6e 66 6f 2d 3e 70 77  ".:%s", info->pw
2c20: 5f 64 69 72 29 3b 0a 09 20 20 20 20 7d 0a 09 7d  _dir);..    }..}
2c30: 0a 09 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 68  ..else {..    rh
2c40: 70 61 74 68 20 3d 20 41 4c 4c 4f 43 41 54 45 28  path = ALLOCATE(
2c50: 73 74 72 6c 65 6e 28 68 6f 6d 65 29 20 2b 20 33  strlen(home) + 3
2c60: 29 3b 0a 09 20 20 20 20 28 76 6f 69 64 29 20 73  );..    (void) s
2c70: 70 72 69 6e 74 66 28 72 68 70 61 74 68 2c 20 22  printf(rhpath, "
2c80: 2e 3a 25 73 22 2c 20 68 6f 6d 65 29 3b 0a 09 7d  .:%s", home);..}
2c90: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
2ca0: 7b 0a 09 72 68 70 61 74 68 20 3d 20 53 41 56 45  {..rhpath = SAVE
2cb0: 53 54 52 28 72 68 70 61 74 68 29 3b 0a 20 20 20  STR(rhpath);.   
2cc0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72   }..    return r
2cd0: 68 70 61 74 68 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  hpath;.}.../*. *
2ce0: 20 67 65 74 5f 66 75 6e 63 3a 0a 20 2a 09 52 65   get_func:. *.Re
2cf0: 74 75 72 6e 73 20 74 68 65 20 73 79 6d 62 6f 6c  turns the symbol
2d00: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 6f 72   table entry for
2d10: 20 61 6e 20 72 68 0a 20 2a 09 6c 61 6e 67 75 61   an rh. *.langua
2d20: 67 65 20 66 75 6e 63 74 69 6f 6e 20 67 69 76 65  ge function give
2d30: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
2d40: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 2f 0a  e function.. */.
2d50: 0a 73 79 6d 62 6f 6c 20 2a 67 65 74 5f 66 75 6e  .symbol *get_fun
2d60: 63 28 63 68 61 72 20 2a 66 75 6e 63 5f 6e 61 6d  c(char *func_nam
2d70: 65 29 0a 7b 0a 20 20 20 20 73 79 6d 62 6f 6c 20  e).{.    symbol 
2d80: 2a 09 73 79 6d 3b 0a 0a 20 20 20 20 66 6f 72 20  *.sym;..    for 
2d90: 28 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 74 61  (sym = Symbol_ta
2da0: 62 6c 65 3b 20 73 79 6d 20 21 3d 20 28 73 79 6d  ble; sym != (sym
2db0: 62 6f 6c 20 2a 29 20 4e 55 4c 4c 3b 20 73 79 6d  bol *) NULL; sym
2dc0: 20 3d 20 73 79 6d 2d 3e 6e 65 78 74 29 20 7b 0a   = sym->next) {.
2dd0: 09 69 66 20 28 73 79 6d 2d 3e 74 79 70 65 20 3d  .if (sym->type =
2de0: 3d 20 46 55 4e 43 54 49 4f 4e 20 26 26 20 73 74  = FUNCTION && st
2df0: 72 63 6d 70 28 73 79 6d 2d 3e 6e 61 6d 65 2c 20  rcmp(sym->name, 
2e00: 66 75 6e 63 5f 6e 61 6d 65 29 20 3d 3d 20 30 29  func_name) == 0)
2e10: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 73   {..    return s
2e20: 79 6d 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  ym;..}.    }.   
2e30: 20 0a 20 20 20 20 65 72 72 6f 72 28 22 66 75 6e   .    error("fun
2e40: 63 74 69 6f 6e 20 27 25 73 27 20 6c 6f 6f 6b 75  ction '%s' looku
2e50: 70 20 66 61 69 6c 75 72 65 22 2c 20 66 75 6e 63  p failure", func
2e60: 5f 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 4e  _name);..    /*N
2e70: 4f 54 52 45 41 43 48 45 44 2a 2f 0a 7d 0a 0c 0a  OTREACHED*/.}...
2e80: 2f 2a 0a 20 2a 20 70 75 73 68 5f 69 6e 73 74 72  /*. * push_instr
2e90: 3a 0a 20 2a 09 50 75 73 68 65 73 20 61 6e 20 69  :. *.Pushes an i
2ea0: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 74 6f  nstruction on to
2eb0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 61   the program sta
2ec0: 63 6b 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ck.. */..static 
2ed0: 76 6f 69 64 20 70 75 73 68 5f 69 6e 73 74 72 28  void push_instr(
2ee0: 76 6f 69 64 09 20 20 20 20 20 20 28 2a 66 75 6e  void.      (*fun
2ef0: 63 29 28 69 6e 73 74 72 5f 76 61 6c 75 65 20 2a  c)(instr_value *
2f00: 29 2c 0a 09 09 20 20 20 20 20 20 20 69 6e 73 74  ),...       inst
2f10: 72 5f 76 61 6c 75 65 20 2a 09 76 61 6c 75 65 29  r_value *.value)
2f20: 0a 7b 0a 20 20 20 20 69 66 20 28 50 43 20 3e 3d  .{.    if (PC >=
2f30: 20 4d 41 58 5f 50 52 4f 47 5f 4c 45 4e 29 20 7b   MAX_PROG_LEN) {
2f40: 0a 09 65 72 72 6f 72 28 22 70 72 6f 67 72 61 6d  ..error("program
2f50: 20 69 73 20 74 6f 6f 20 62 69 67 22 29 3b 0a 20   is too big");. 
2f60: 20 20 20 7d 0a 20 20 20 20 53 74 61 63 6b 50 72     }.    StackPr
2f70: 6f 67 72 61 6d 5b 50 43 5d 2e 66 75 6e 63 20 3d  ogram[PC].func =
2f80: 20 66 75 6e 63 3b 0a 20 20 20 20 53 74 61 63 6b   func;.    Stack
2f90: 50 72 6f 67 72 61 6d 5b 50 43 2b 2b 5d 2e 76 61  Program[PC++].va
2fa0: 6c 75 65 20 3d 20 2a 76 61 6c 75 65 3b 0a 20 20  lue = *value;.  
2fb0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0c 0a 2f 2a    return;.}.../*
2fc0: 0a 20 2a 20 77 72 69 74 65 5f 74 72 65 65 3a 0a  . * write_tree:.
2fd0: 20 2a 09 43 6f 6d 70 69 6c 65 73 20 61 6e 20 65   *.Compiles an e
2fe0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 6f  xpression tree o
2ff0: 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  n the program st
3000: 61 63 6b 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ack.. */..static
3010: 20 76 6f 69 64 20 77 72 69 74 65 5f 74 72 65 65   void write_tree
3020: 28 74 72 65 65 29 0a 6e 6f 64 65 20 2a 09 74 72  (tree).node *.tr
3030: 65 65 3b 0a 7b 0a 20 20 20 20 69 6e 73 74 72 5f  ee;.{.    instr_
3040: 76 61 6c 75 65 09 76 61 6c 75 65 3b 0a 0a 20 20  value.value;..  
3050: 20 20 69 66 20 28 74 72 65 65 20 3d 3d 20 28 6e    if (tree == (n
3060: 6f 64 65 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  ode *) NULL) {..
3070: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
3080: 20 20 20 69 66 20 28 74 72 65 65 2d 3e 63 6f 64     if (tree->cod
3090: 65 2e 66 75 6e 63 20 3d 3d 20 55 4e 52 45 53 5f  e.func == UNRES_
30a0: 46 55 4e 43 29 20 7b 0a 09 73 79 6d 62 6f 6c 20  FUNC) {..symbol 
30b0: 2a 73 79 6d 20 3d 20 67 65 74 5f 66 75 6e 63 28  *sym = get_func(
30c0: 74 72 65 65 2d 3e 63 6f 64 65 2e 76 61 6c 75 65  tree->code.value
30d0: 2e 66 75 6e 63 5f 6e 61 6d 65 29 3b 0a 09 69 66  .func_name);..if
30e0: 20 28 74 72 65 65 2d 3e 63 6f 75 6e 74 20 3e 20   (tree->count > 
30f0: 30 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 69 3b  0) {..    int i;
3100: 0a 09 20 20 20 20 0a 09 20 20 20 20 66 6f 72 20  ..    ..    for 
3110: 28 69 20 3d 20 30 3b 20 69 20 3c 20 74 72 65 65  (i = 0; i < tree
3120: 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a  ->count; i++) {.
3130: 09 09 77 72 69 74 65 5f 74 72 65 65 28 74 72 65  ..write_tree(tre
3140: 65 2d 3e 74 72 65 65 73 5b 69 5d 29 3b 0a 09 20  e->trees[i]);.. 
3150: 20 20 20 7d 0a 09 20 20 20 20 66 72 65 65 28 28     }..    free((
3160: 63 68 61 72 20 2a 29 20 74 72 65 65 2d 3e 74 72  char *) tree->tr
3170: 65 65 73 29 3b 0a 09 7d 0a 09 74 72 65 65 2d 3e  ees);..}..tree->
3180: 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 69 66 20 28  count = 0;..if (
3190: 73 79 6d 2d 3e 76 61 6c 75 65 20 3d 3d 20 2d 31  sym->value == -1
31a0: 29 20 7b 0a 09 20 20 20 20 70 75 73 68 5f 69 6e  ) {..    push_in
31b0: 73 74 72 28 55 4e 52 45 53 5f 46 55 4e 43 2c 20  str(UNRES_FUNC, 
31c0: 26 74 72 65 65 2d 3e 63 6f 64 65 2e 76 61 6c 75  &tree->code.valu
31d0: 65 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 7b 0a 09  e);..}..else {..
31e0: 20 20 20 20 76 61 6c 75 65 2e 70 63 20 3d 20 73      value.pc = s
31f0: 79 6d 2d 3e 76 61 6c 75 65 3b 0a 09 20 20 20 20  ym->value;..    
3200: 70 75 73 68 5f 69 6e 73 74 72 28 63 5f 66 75 6e  push_instr(c_fun
3210: 63 2c 20 26 76 61 6c 75 65 29 3b 0a 09 7d 0a 20  c, &value);..}. 
3220: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
3230: 20 28 74 72 65 65 2d 3e 63 6f 64 65 2e 66 75 6e   (tree->code.fun
3240: 63 20 3d 3d 20 54 45 52 54 49 41 52 59 29 20 7b  c == TERTIARY) {
3250: 0a 09 69 6e 74 20 63 6f 6c 6f 6e 5f 70 63 3b 0a  ..int colon_pc;.
3260: 09 69 6e 74 20 71 6d 5f 70 63 3b 0a 0a 09 77 72  .int qm_pc;...wr
3270: 69 74 65 5f 74 72 65 65 28 74 72 65 65 2d 3e 6c  ite_tree(tree->l
3280: 65 66 74 29 3b 0a 09 71 6d 5f 70 63 20 3d 20 50  eft);..qm_pc = P
3290: 43 3b 0a 09 76 61 6c 75 65 2e 70 63 20 3d 20 30  C;..value.pc = 0
32a0: 3b 0a 09 70 75 73 68 5f 69 6e 73 74 72 28 63 5f  ;..push_instr(c_
32b0: 71 6d 2c 20 26 76 61 6c 75 65 29 3b 0a 09 77 72  qm, &value);..wr
32c0: 69 74 65 5f 74 72 65 65 28 74 72 65 65 2d 3e 6d  ite_tree(tree->m
32d0: 69 64 64 6c 65 29 3b 0a 09 63 6f 6c 6f 6e 5f 70  iddle);..colon_p
32e0: 63 20 3d 20 50 43 3b 0a 09 70 75 73 68 5f 69 6e  c = PC;..push_in
32f0: 73 74 72 28 63 5f 63 6f 6c 6f 6e 2c 20 26 76 61  str(c_colon, &va
3300: 6c 75 65 29 3b 0a 09 77 72 69 74 65 5f 74 72 65  lue);..write_tre
3310: 65 28 74 72 65 65 2d 3e 72 69 67 68 74 29 3b 0a  e(tree->right);.
3320: 09 53 74 61 63 6b 50 72 6f 67 72 61 6d 5b 71 6d  .StackProgram[qm
3330: 5f 70 63 5d 2e 76 61 6c 75 65 2e 70 63 20 3d 20  _pc].value.pc = 
3340: 63 6f 6c 6f 6e 5f 70 63 3b 0a 09 53 74 61 63 6b  colon_pc;..Stack
3350: 50 72 6f 67 72 61 6d 5b 63 6f 6c 6f 6e 5f 70 63  Program[colon_pc
3360: 5d 2e 76 61 6c 75 65 2e 70 63 20 3d 20 50 43 20  ].value.pc = PC 
3370: 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  - 1;.    }.    e
3380: 6c 73 65 20 69 66 20 28 74 72 65 65 2d 3e 63 6f  lse if (tree->co
3390: 64 65 2e 66 75 6e 63 20 3d 3d 20 63 5f 73 79 73  de.func == c_sys
33a0: 63 61 6c 6c 29 20 7b 0a 09 69 66 20 28 74 72 65  call) {..if (tre
33b0: 65 2d 3e 63 6f 75 6e 74 20 3e 20 30 29 20 7b 0a  e->count > 0) {.
33c0: 09 20 20 20 20 69 6e 74 20 69 3b 0a 09 20 20 20  .    int i;..   
33d0: 20 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20   ..    for (i = 
33e0: 30 3b 20 69 20 3c 20 74 72 65 65 2d 3e 63 6f 75  0; i < tree->cou
33f0: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 09 77 72 69  nt; i++) {...wri
3400: 74 65 5f 74 72 65 65 28 74 72 65 65 2d 3e 74 72  te_tree(tree->tr
3410: 65 65 73 5b 69 5d 29 3b 0a 09 20 20 20 20 7d 0a  ees[i]);..    }.
3420: 09 20 20 20 20 66 72 65 65 28 28 63 68 61 72 20  .    free((char 
3430: 2a 29 20 74 72 65 65 2d 3e 74 72 65 65 73 29 3b  *) tree->trees);
3440: 0a 09 7d 0a 09 74 72 65 65 2d 3e 63 6f 75 6e 74  ..}..tree->count
3450: 20 3d 20 30 3b 0a 09 70 75 73 68 5f 69 6e 73 74   = 0;..push_inst
3460: 72 28 63 5f 73 79 73 63 61 6c 6c 2c 20 26 74 72  r(c_syscall, &tr
3470: 65 65 2d 3e 63 6f 64 65 2e 76 61 6c 75 65 29 3b  ee->code.value);
3480: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
3490: 7b 0a 09 77 72 69 74 65 5f 74 72 65 65 28 74 72  {..write_tree(tr
34a0: 65 65 2d 3e 6c 65 66 74 29 3b 0a 09 77 72 69 74  ee->left);..writ
34b0: 65 5f 74 72 65 65 28 74 72 65 65 2d 3e 72 69 67  e_tree(tree->rig
34c0: 68 74 29 3b 0a 09 70 75 73 68 5f 69 6e 73 74 72  ht);..push_instr
34d0: 28 74 72 65 65 2d 3e 63 6f 64 65 2e 66 75 6e 63  (tree->code.func
34e0: 2c 20 26 74 72 65 65 2d 3e 63 6f 64 65 2e 76 61  , &tree->code.va
34f0: 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  lue);.    }..   
3500: 20 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 74   free((char *) t
3510: 72 65 65 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ree);..    retur
3520: 6e 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 77 72 69  n;.}.../*. * wri
3530: 74 65 5f 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 2a  te_functions:. *
3540: 09 43 6f 6d 70 69 6c 65 73 20 61 6c 6c 20 72 68  .Compiles all rh
3550: 20 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 74 69   language functi
3560: 6f 6e 73 20 6f 6e 20 74 6f 20 74 68 65 20 70 72  ons on to the pr
3570: 6f 67 72 61 6d 20 73 74 61 63 6b 2e 0a 20 2a 2f  ogram stack.. */
3580: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72  ..static void wr
3590: 69 74 65 5f 66 75 6e 63 74 69 6f 6e 73 28 76 6f  ite_functions(vo
35a0: 69 64 29 0a 7b 0a 20 20 20 20 69 6e 73 74 72 75  id).{.    instru
35b0: 63 74 69 6f 6e 20 2a 09 69 70 3b 0a 20 20 20 20  ction *.ip;.    
35c0: 73 79 6d 62 6f 6c 20 2a 09 09 73 79 6d 3b 0a 20  symbol *..sym;. 
35d0: 20 20 20 69 6e 73 74 72 5f 76 61 6c 75 65 09 09     instr_value..
35e0: 76 61 6c 75 65 3b 0a 0a 20 20 20 20 66 6f 72 20  value;..    for 
35f0: 28 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 74 61  (sym = Symbol_ta
3600: 62 6c 65 3b 20 73 79 6d 20 21 3d 20 28 73 79 6d  ble; sym != (sym
3610: 62 6f 6c 20 2a 29 20 4e 55 4c 4c 3b 20 73 79 6d  bol *) NULL; sym
3620: 20 3d 20 73 79 6d 2d 3e 6e 65 78 74 29 20 7b 0a   = sym->next) {.
3630: 09 69 66 20 28 73 79 6d 2d 3e 74 79 70 65 20 3d  .if (sym->type =
3640: 3d 20 46 55 4e 43 54 49 4f 4e 29 20 7b 0a 09 20  = FUNCTION) {.. 
3650: 20 20 20 73 79 6d 2d 3e 76 61 6c 75 65 20 3d 20     sym->value = 
3660: 50 43 3b 0a 0a 09 20 20 20 20 76 61 6c 75 65 2e  PC;...    value.
3670: 6e 75 6d 5f 70 61 72 61 6d 73 20 3d 20 73 79 6d  num_params = sym
3680: 2d 3e 6e 75 6d 5f 70 61 72 61 6d 73 3b 0a 09 20  ->num_params;.. 
3690: 20 20 20 70 75 73 68 5f 69 6e 73 74 72 28 4e 55     push_instr(NU
36a0: 4d 5f 50 41 52 41 4d 53 2c 20 26 76 61 6c 75 65  M_PARAMS, &value
36b0: 29 3b 0a 0a 09 20 20 20 20 77 72 69 74 65 5f 74  );...    write_t
36c0: 72 65 65 28 73 79 6d 2d 3e 74 72 65 65 29 3b 0a  ree(sym->tree);.
36d0: 0a 09 20 20 20 20 76 61 6c 75 65 2e 6e 75 6d 5f  ..    value.num_
36e0: 70 61 72 61 6d 73 20 3d 20 73 79 6d 2d 3e 6e 75  params = sym->nu
36f0: 6d 5f 70 61 72 61 6d 73 3b 0a 09 20 20 20 20 70  m_params;..    p
3700: 75 73 68 5f 69 6e 73 74 72 28 63 5f 72 65 74 75  ush_instr(c_retu
3710: 72 6e 2c 20 26 76 61 6c 75 65 29 3b 0a 0a 09 20  rn, &value);... 
3720: 20 20 20 76 61 6c 75 65 2e 6c 20 3d 20 30 4c 3b     value.l = 0L;
3730: 0a 09 20 20 20 20 70 75 73 68 5f 69 6e 73 74 72  ..    push_instr
3740: 28 4e 55 4c 4c 5f 49 4e 53 54 52 2c 20 26 76 61  (NULL_INSTR, &va
3750: 6c 75 65 29 3b 0a 0a 09 20 20 20 20 73 79 6d 2d  lue);...    sym-
3760: 3e 74 72 65 65 20 3d 20 28 6e 6f 64 65 20 2a 29  >tree = (node *)
3770: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a   NULL;..}.    }.
3780: 0a 20 20 20 20 76 61 6c 75 65 2e 6c 20 3d 20 30  .    value.l = 0
3790: 4c 3b 0a 20 20 20 20 70 75 73 68 5f 69 6e 73 74  L;.    push_inst
37a0: 72 28 4e 55 4c 4c 5f 49 4e 53 54 52 2c 20 26 76  r(NULL_INSTR, &v
37b0: 61 6c 75 65 29 3b 0a 20 20 20 20 70 75 73 68 5f  alue);.    push_
37c0: 69 6e 73 74 72 28 45 4e 44 5f 4f 46 5f 50 52 4f  instr(END_OF_PRO
37d0: 47 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  G, &value);.    
37e0: 50 43 2d 2d 3b 0a 0a 20 20 20 20 66 6f 72 20 28  PC--;..    for (
37f0: 69 70 20 3d 20 53 74 61 63 6b 50 72 6f 67 72 61  ip = StackProgra
3800: 6d 3b 20 69 70 2d 3e 66 75 6e 63 20 21 3d 20 45  m; ip->func != E
3810: 4e 44 5f 4f 46 5f 50 52 4f 47 3b 20 69 70 2b 2b  ND_OF_PROG; ip++
3820: 29 20 7b 0a 09 69 66 20 28 69 70 2d 3e 66 75 6e  ) {..if (ip->fun
3830: 63 20 3d 3d 20 55 4e 52 45 53 5f 46 55 4e 43 29  c == UNRES_FUNC)
3840: 20 7b 0a 09 20 20 20 20 69 70 2d 3e 66 75 6e 63   {..    ip->func
3850: 20 3d 20 63 5f 66 75 6e 63 3b 0a 09 20 20 20 20   = c_func;..    
3860: 73 79 6d 20 3d 20 67 65 74 5f 66 75 6e 63 28 69  sym = get_func(i
3870: 70 2d 3e 76 61 6c 75 65 2e 66 75 6e 63 5f 6e 61  p->value.func_na
3880: 6d 65 29 3b 0a 09 20 20 20 20 69 70 2d 3e 76 61  me);..    ip->va
3890: 6c 75 65 2e 70 63 20 3d 20 73 79 6d 2d 3e 76 61  lue.pc = sym->va
38a0: 6c 75 65 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  lue;..}.    }.. 
38b0: 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0c 0a 2f     return;.}.../
38c0: 2a 0a 20 2a 20 6d 61 69 6e 3a 0a 20 2a 09 50 61  *. * main:. *.Pa
38d0: 72 73 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  rse arguments.. 
38e0: 2a 09 20 20 2d 62 2c 20 2d 63 2c 20 2d 44 2c 20  *.  -b, -c, -D, 
38f0: 2d 64 2c 20 2d 46 2c 20 2d 69 2c 20 2d 4c 2c 20  -d, -F, -i, -L, 
3900: 2d 6c 2c 20 2d 71 2c 20 2d 72 2c 20 2d 73 2c 20  -l, -q, -r, -s, 
3910: 2d 74 2c 20 61 6e 64 20 2d 77 20 73 77 69 74 63  -t, and -w switc
3920: 68 65 73 0a 20 2a 09 20 20 63 61 6e 20 6f 63 63  hes. *.  can occ
3930: 75 72 20 61 73 20 6f 66 74 65 6e 20 61 73 20 64  ur as often as d
3940: 65 73 69 72 65 64 20 65 76 65 6e 20 74 68 6f 75  esired even thou
3950: 67 68 20 6f 6e 6c 79 20 6f 6e 65 20 6f 63 63 75  gh only one occu
3960: 72 65 6e 63 65 0a 20 2a 09 20 20 69 73 20 6e 65  rence. *.  is ne
3970: 63 65 73 73 61 74 79 2e 0a 20 2a 0a 20 2a 09 20  cessaty.. *. *. 
3980: 20 2d 65 20 61 6e 64 20 2d 66 20 63 61 6e 20 6f   -e and -f can o
3990: 63 63 75 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ccur one or more
39a0: 20 74 69 6d 65 73 20 61 6e 64 20 65 61 63 68 20   times and each 
39b0: 6f 63 63 75 72 65 6e 63 65 20 6d 75 73 74 0a 20  occurence must. 
39c0: 2a 09 20 20 68 61 76 65 20 61 6e 20 61 73 73 6f  *.  have an asso
39d0: 63 69 61 74 65 64 20 61 72 67 75 6d 65 6e 74 2e  ciated argument.
39e0: 0a 20 2a 0a 20 2a 09 20 20 46 69 72 73 74 20 6f  . *. *.  First o
39f0: 63 63 75 72 65 6e 63 65 20 6f 66 20 2d 68 20 6f  ccurence of -h o
3a00: 72 20 2d 56 20 63 61 75 73 65 73 20 61 20 6d 65  r -V causes a me
3a10: 73 73 61 67 65 20 74 6f 20 62 65 20 6f 75 74 70  ssage to be outp
3a20: 75 74 20 74 68 65 6e 0a 20 2a 09 20 20 72 68 20  ut then. *.  rh 
3a30: 65 78 69 74 73 2e 0a 20 2a 0a 20 2a 09 20 20 2d  exits.. *. *.  -
3a40: 70 20 61 6e 64 20 2d 78 20 63 61 6e 20 6f 63 63  p and -x can occ
3a50: 75 72 20 6f 6e 6c 79 20 6f 6e 63 65 20 61 6e 64  ur only once and
3a60: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 61 73   must have an as
3a70: 73 6f 63 69 61 74 65 64 20 61 72 67 75 6d 65 6e  sociated argumen
3a80: 74 2e 0a 20 2a 0a 20 2a 09 20 20 2d 54 2c 20 2d  t.. *. *.  -T, -
3a90: 57 2c 20 2d 58 2c 20 2d 59 2c 20 61 6e 64 20 2d  W, -X, -Y, and -
3aa0: 5a 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  Z are only avail
3ab0: 61 62 6c 65 20 69 66 20 72 68 20 69 73 20 63 6f  able if rh is co
3ac0: 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 2a 09 20  mpiled with. *. 
3ad0: 20 64 65 62 75 67 20 74 75 72 6e 65 64 20 6f 6e   debug turned on
3ae0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 20 50 61 72  .. *. *      Par
3af0: 73 65 20 61 6e 79 20 52 48 52 43 20 66 69 6c 65  se any RHRC file
3b00: 2e 0a 20 2a 09 50 61 72 73 65 20 61 6e 79 20 2d  .. *.Parse any -
3b10: 66 20 66 69 6c 65 6e 61 6d 65 73 2e 0a 20 2a 09  f filenames.. *.
3b20: 50 61 72 73 65 20 61 6e 79 20 2d 65 20 65 78 70  Parse any -e exp
3b30: 72 65 73 73 69 6f 6e 73 2e 0a 20 2a 09 49 66 20  ressions.. *.If 
3b40: 74 68 65 72 65 20 69 73 20 61 20 73 74 61 72 74  there is a start
3b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 65 6e   expression then
3b60: 20 63 6f 6d 70 69 6c 65 20 69 74 20 61 6e 64 20   compile it and 
3b70: 61 6c 6c 20 72 68 20 6c 61 6e 67 75 61 67 65 0a  all rh language.
3b80: 20 2a 09 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a   *.functions.. *
3b90: 09 50 65 72 66 6f 72 6d 20 74 68 65 20 72 65 63  .Perform the rec
3ba0: 75 72 73 69 76 65 20 68 75 6e 74 20 6f 6e 20 72  ursive hunt on r
3bb0: 65 6d 61 69 6e 69 6e 67 20 61 72 67 75 6d 65 6e  emaining argumen
3bc0: 74 73 2e 0a 20 2a 2f 0a 0a 76 6f 69 64 20 6d 61  ts.. */..void ma
3bd0: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
3be0: 72 20 2a 61 72 67 76 5b 5d 29 0a 7b 0a 20 20 20  r *argv[]).{.   
3bf0: 20 65 78 74 65 72 6e 20 69 6e 74 09 09 67 65 74   extern int..get
3c00: 6f 70 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72  opt();.    exter
3c10: 6e 20 63 68 61 72 20 2a 09 6f 70 74 61 72 67 3b  n char *.optarg;
3c20: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 09  .    extern int.
3c30: 09 6f 70 74 65 72 72 3b 0a 20 20 20 20 65 78 74  .opterr;.    ext
3c40: 65 72 6e 20 69 6e 74 09 09 6f 70 74 69 6e 64 3b  ern int..optind;
3c50: 0a 20 20 20 20 65 78 74 65 72 6e 20 63 68 61 72  .    extern char
3c60: 20 2a 09 72 65 73 6f 6c 76 65 5f 6e 61 6d 65 28   *.resolve_name(
3c70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
3c80: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  s, const char *n
3c90: 61 6d 65 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  ame);.    extern
3ca0: 20 76 6f 69 64 09 09 79 79 72 65 73 74 61 72 74   void..yyrestart
3cb0: 28 29 3b 0a 0a 20 20 20 20 63 68 61 72 20 2a 2a  ();..    char **
3cc0: 09 09 63 6c 5f 65 78 70 72 73 20 3d 20 28 63 68  ..cl_exprs = (ch
3cd0: 61 72 20 2a 2a 29 20 4e 55 4c 4c 3b 0a 20 20 20  ar **) NULL;.   
3ce0: 20 63 68 61 72 20 2a 2a 09 09 63 6c 5f 66 6e 61   char **..cl_fna
3cf0: 6d 65 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 20  mes = (char **) 
3d00: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 09 09 09  NULL;.    int...
3d10: 63 6f 6c 6f 6e 5f 70 63 3b 0a 20 20 20 20 69 6e  colon_pc;.    in
3d20: 74 09 09 09 64 61 73 68 62 20 3d 20 46 41 4c 53  t...dashb = FALS
3d30: 45 3b 0a 20 20 20 20 69 6e 74 09 09 09 64 61 73  E;.    int...das
3d40: 68 6c 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  hl = FALSE;.    
3d50: 69 6e 74 09 09 09 64 61 73 68 72 20 3d 20 54 52  int...dashr = TR
3d60: 55 45 3b 0a 20 20 20 20 69 6e 74 09 09 09 64 65  UE;.    int...de
3d70: 70 74 68 3b 0a 20 20 20 20 69 6e 74 09 09 09 64  pth;.    int...d
3d80: 6f 6e 74 5f 63 72 6f 73 73 5f 66 69 6c 65 73 79  ont_cross_filesy
3d90: 73 74 65 6d 73 20 3d 20 46 41 4c 53 45 3b 0a 20  stems = FALSE;. 
3da0: 20 20 20 76 6f 69 64 09 20 20 20 20 20 20 28 2a     void.      (*
3db0: 65 78 61 6d 70 74 72 29 28 76 6f 69 64 29 20 3d  examptr)(void) =
3dc0: 20 65 78 61 6d 31 3b 09 2f 2a 20 64 65 66 61 75   exam1;./* defau
3dd0: 6c 74 20 6f 75 74 70 75 74 20 66 75 6e 63 74 69  lt output functi
3de0: 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 09  on */.    int...
3df0: 66 69 72 73 74 5f 70 61 72 73 65 20 3d 20 54 52  first_parse = TR
3e00: 55 45 3b 0a 20 20 20 20 69 6e 74 09 09 09 69 3b  UE;.    int...i;
3e10: 0a 20 20 20 20 69 6e 74 09 09 09 6e 75 6d 5f 63  .    int...num_c
3e20: 6c 5f 65 78 70 72 73 20 3d 20 30 3b 0a 20 20 20  l_exprs = 0;.   
3e30: 20 69 6e 74 09 09 09 6e 75 6d 5f 63 6c 5f 66 6e   int...num_cl_fn
3e40: 61 6d 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ames = 0;.    in
3e50: 74 09 09 09 71 6d 5f 70 63 3b 0a 20 20 20 20 69  t...qm_pc;.    i
3e60: 6e 74 09 09 09 72 65 61 64 5f 72 68 72 63 20 3d  nt...read_rhrc =
3e70: 20 54 52 55 45 3b 0a 20 20 20 20 63 68 61 72 20   TRUE;.    char 
3e80: 2a 09 09 72 68 70 61 74 68 20 3d 20 28 63 68 61  *..rhpath = (cha
3e90: 72 20 2a 29 20 4e 55 4c 4c 3b 09 2f 2a 20 52 48  r *) NULL;./* RH
3ea0: 50 41 54 48 20 65 6e 76 2e 20 76 61 72 69 61 62  PATH env. variab
3eb0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 09 09 09  le */.    int...
3ec0: 73 61 6d 65 66 73 50 43 20 3d 20 2d 31 3b 0a 20  samefsPC = -1;. 
3ed0: 20 20 20 69 6e 73 74 72 5f 76 61 6c 75 65 09 09     instr_value..
3ee0: 76 61 6c 75 65 3b 0a 0a 23 69 66 20 64 65 66 69  value;..#if defi
3ef0: 6e 65 64 28 44 45 42 55 47 29 0a 20 20 20 20 69  ned(DEBUG).    i
3f00: 6e 74 09 09 09 64 75 6d 70 5f 61 6c 6c 3b 0a 20  nt...dump_all;. 
3f10: 20 20 20 69 6e 74 09 09 09 64 75 6d 70 5f 65 78     int...dump_ex
3f20: 65 63 3b 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20  ec;.#endif...   
3f30: 20 50 72 6f 67 72 61 6d 5f 6e 61 6d 65 20 3d 20   Program_name = 
3f40: 73 74 72 72 63 68 72 28 61 72 67 76 5b 30 5d 2c  strrchr(argv[0],
3f50: 20 27 2f 27 29 3b 0a 20 20 20 20 50 72 6f 67 72   '/');.    Progr
3f60: 61 6d 5f 6e 61 6d 65 20 3d 20 28 50 72 6f 67 72  am_name = (Progr
3f70: 61 6d 5f 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29  am_name == NULL)
3f80: 20 3f 20 61 72 67 76 5b 30 5d 20 3a 20 28 50 72   ? argv[0] : (Pr
3f90: 6f 67 72 61 6d 5f 6e 61 6d 65 20 2b 20 31 29 3b  ogram_name + 1);
3fa0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 44 45  ..#if defined(DE
3fb0: 42 55 47 29 0a 20 20 20 20 64 75 6d 70 5f 61 6c  BUG).    dump_al
3fc0: 6c 20 3d 20 64 75 6d 70 5f 65 78 65 63 20 3d 20  l = dump_exec = 
3fd0: 67 64 5f 64 65 62 75 67 20 3d 20 72 68 5f 64 65  gd_debug = rh_de
3fe0: 62 75 67 20 3d 20 79 79 5f 66 6c 65 78 5f 64 65  bug = yy_flex_de
3ff0: 62 75 67 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  bug = 0;.#endif.
4000: 0a 20 20 20 20 61 74 74 72 2e 63 6f 6d 6d 61 6e  .    attr.comman
4010: 64 20 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d = (char *) NUL
4020: 4c 3b 09 2f 2a 20 2d 78 20 6f 70 74 69 6f 6e 20  L;./* -x option 
4030: 2a 2f 0a 20 20 20 20 61 74 74 72 2e 66 6f 72 6d  */.    attr.form
4040: 61 74 20 3d 20 28 63 68 61 72 20 2a 29 20 4e 55  at = (char *) NU
4050: 4c 4c 3b 09 2f 2a 20 2d 70 20 6f 70 74 69 6f 6e  LL;./* -p option
4060: 20 2a 2f 0a 20 20 20 20 61 74 74 72 2e 64 6f 74   */.    attr.dot
4070: 5f 73 70 65 63 69 61 6c 20 3d 20 54 52 55 45 3b  _special = TRUE;
4080: 09 09 2f 2a 20 2d 64 20 6f 70 74 69 6f 6e 20 2a  ../* -d option *
4090: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 5f  /.#if defined(S_
40a0: 49 46 4c 4e 4b 29 0a 20 20 20 20 61 74 74 72 2e  IFLNK).    attr.
40b0: 66 6f 6c 6c 6f 77 5f 64 69 72 20 3d 20 46 41 4c  follow_dir = FAL
40c0: 53 45 3b 09 09 2f 2a 20 2d 44 20 26 20 2d 4c 20  SE;../* -D & -L 
40d0: 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 61  options */.    a
40e0: 74 74 72 2e 66 6f 6c 6c 6f 77 5f 66 69 6c 65 20  ttr.follow_file 
40f0: 3d 20 46 41 4c 53 45 3b 09 09 2f 2a 20 2d 46 20  = FALSE;../* -F 
4100: 26 20 2d 4c 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  & -L options */.
4110: 23 65 6e 64 69 66 0a 20 20 20 20 61 74 74 72 2e  #endif.    attr.
4120: 67 72 61 70 68 69 63 20 3d 20 46 41 4c 53 45 3b  graphic = FALSE;
4130: 09 09 2f 2a 20 2d 71 20 6f 70 74 69 6f 6e 20 2a  ../* -q option *
4140: 2f 0a 20 20 20 20 61 74 74 72 2e 69 67 6e 6f 72  /.    attr.ignor
4150: 65 5f 63 61 73 65 20 3d 20 46 41 4c 53 45 3b 09  e_case = FALSE;.
4160: 09 2f 2a 20 2d 69 20 6f 70 74 69 6f 6e 20 2a 2f  ./* -i option */
4170: 0a 20 20 20 20 61 74 74 72 2e 70 72 75 6e 65 20  .    attr.prune 
4180: 3d 20 46 41 4c 53 45 3b 09 09 09 2f 2a 20 70 72  = FALSE;.../* pr
4190: 75 6e 65 20 28 6f 62 76 69 6f 75 73 6c 79 20 3a  une (obviously :
41a0: 2d 29 20 2a 2f 0a 20 20 20 20 61 74 74 72 2e 73  -) */.    attr.s
41b0: 74 61 74 5f 61 6c 6c 20 3d 20 46 41 4c 53 45 3b  tat_all = FALSE;
41c0: 09 09 2f 2a 20 64 6f 6e 27 74 20 6e 65 65 64 20  ../* don't need 
41d0: 74 6f 20 73 74 61 74 20 65 76 65 72 79 74 68 69  to stat everythi
41e0: 6e 67 20 2a 2f 0a 20 20 20 20 61 74 74 72 2e 73  ng */.    attr.s
41f0: 74 72 5f 6f 77 6e 65 72 20 3d 20 46 41 4c 53 45  tr_owner = FALSE
4200: 3b 09 09 2f 2a 20 2d 75 20 6f 70 74 69 6f 6e 20  ;../* -u option 
4210: 2a 2f 0a 20 20 20 20 61 74 74 72 2e 76 65 72 62  */.    attr.verb
4220: 6f 73 65 20 3d 20 46 41 4c 53 45 3b 09 09 2f 2a  ose = FALSE;../*
4230: 20 2d 76 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20   -v option */.  
4240: 20 20 61 74 74 72 2e 66 75 6c 6c 5f 64 61 74 65    attr.full_date
4250: 20 3d 20 46 41 4c 53 45 3b 09 09 2f 2a 20 2d 74   = FALSE;../* -t
4260: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 61   option */.    a
4270: 74 74 72 2e 6e 75 6d 5f 65 72 72 6f 72 73 20 3d  ttr.num_errors =
4280: 20 30 3b 09 09 2f 2a 20 6e 6f 20 65 72 72 6f 72   0;../* no error
4290: 73 20 79 65 74 20 2a 2f 0a 0a 0a 20 20 20 20 72  s yet */...    r
42a0: 68 69 6e 69 74 28 29 3b 0a 0a 20 20 20 20 6f 70  hinit();..    op
42b0: 74 65 72 72 20 3d 20 31 3b 0a 0a 20 20 20 20 77  terr = 1;..    w
42c0: 68 69 6c 65 20 28 28 69 20 3d 20 67 65 74 6f 70  hile ((i = getop
42d0: 74 28 61 72 67 63 2c 20 61 72 67 76 2c 20 53 57  t(argc, argv, SW
42e0: 49 54 43 48 45 53 29 29 20 21 3d 20 45 4f 46 29  ITCHES)) != EOF)
42f0: 20 7b 0a 0a 09 73 77 69 74 63 68 20 28 69 29 20   {...switch (i) 
4300: 7b 0a 09 20 20 20 20 0a 09 63 61 73 65 20 27 62  {..    ..case 'b
4310: 27 3a 0a 09 20 20 20 20 64 61 73 68 62 20 3d 20  ':..    dashb = 
4320: 54 52 55 45 3b 0a 09 20 20 20 20 62 72 65 61 6b  TRUE;..    break
4330: 3b 0a 09 20 20 20 20 0a 09 63 61 73 65 20 27 43  ;..    ..case 'C
4340: 27 3a 0a 09 20 20 20 20 64 6f 6e 74 5f 63 72 6f  ':..    dont_cro
4350: 73 73 5f 66 69 6c 65 73 79 73 74 65 6d 73 20 3d  ss_filesystems =
4360: 20 54 52 55 45 3b 0a 09 20 20 20 20 61 74 74 72   TRUE;..    attr
4370: 2e 73 74 61 74 5f 61 6c 6c 20 3d 20 54 52 55 45  .stat_all = TRUE
4380: 3b 09 2f 2a 20 3c 3c 3c 20 69 73 20 74 68 69 73  ;./* <<< is this
4390: 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f 0a 09   necessary? */..
43a0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
43b0: 65 20 27 63 27 3a 0a 09 20 20 20 20 72 65 61 64  e 'c':..    read
43c0: 5f 72 68 72 63 20 3d 20 46 41 4c 53 45 3b 0a 09  _rhrc = FALSE;..
43d0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 20      break;..#if 
43e0: 64 65 66 69 6e 65 64 28 53 5f 49 46 4c 4e 4b 29  defined(S_IFLNK)
43f0: 0a 09 63 61 73 65 20 27 44 27 3a 0a 09 20 20 20  ..case 'D':..   
4400: 20 61 74 74 72 2e 66 6f 6c 6c 6f 77 5f 64 69 72   attr.follow_dir
4410: 20 3d 20 54 52 55 45 3b 0a 09 20 20 20 20 61 74   = TRUE;..    at
4420: 74 72 2e 73 74 61 74 5f 61 6c 6c 20 3d 20 54 52  tr.stat_all = TR
4430: 55 45 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  UE;..    break;.
4440: 23 65 6e 64 69 66 0a 09 20 20 20 20 0a 09 63 61  #endif..    ..ca
4450: 73 65 20 27 64 27 3a 0a 09 20 20 20 20 61 74 74  se 'd':..    att
4460: 72 2e 64 6f 74 5f 73 70 65 63 69 61 6c 20 3d 20  r.dot_special = 
4470: 46 41 4c 53 45 3b 0a 09 20 20 20 20 62 72 65 61  FALSE;..    brea
4480: 6b 3b 0a 09 20 20 20 20 0a 09 63 61 73 65 20 27  k;..    ..case '
4490: 65 27 3a 0a 09 20 20 20 20 63 6c 5f 65 78 70 72  e':..    cl_expr
44a0: 73 20 3d 0a 09 09 52 45 41 4c 4c 4f 43 41 54 45  s =...REALLOCATE
44b0: 28 63 6c 5f 65 78 70 72 73 2c 20 73 69 7a 65 6f  (cl_exprs, sizeo
44c0: 66 28 63 68 61 72 20 2a 29 20 2a 20 28 6e 75 6d  f(char *) * (num
44d0: 5f 63 6c 5f 65 78 70 72 73 20 2b 20 31 29 29 3b  _cl_exprs + 1));
44e0: 0a 09 20 20 20 20 63 6c 5f 65 78 70 72 73 5b 6e  ..    cl_exprs[n
44f0: 75 6d 5f 63 6c 5f 65 78 70 72 73 2b 2b 5d 20 3d  um_cl_exprs++] =
4500: 20 6f 70 74 61 72 67 3b 0a 09 20 20 20 20 62 72   optarg;..    br
4510: 65 61 6b 3b 0a 09 20 20 20 20 0a 23 69 66 20 64  eak;..    .#if d
4520: 65 66 69 6e 65 64 28 53 5f 49 46 4c 4e 4b 29 0a  efined(S_IFLNK).
4530: 09 63 61 73 65 20 27 46 27 3a 0a 09 20 20 20 20  .case 'F':..    
4540: 61 74 74 72 2e 66 6f 6c 6c 6f 77 5f 66 69 6c 65  attr.follow_file
4550: 20 3d 20 54 52 55 45 3b 0a 09 20 20 20 20 61 74   = TRUE;..    at
4560: 74 72 2e 73 74 61 74 5f 61 6c 6c 20 3d 20 54 52  tr.stat_all = TR
4570: 55 45 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  UE;..    break;.
4580: 23 65 6e 64 69 66 0a 09 20 20 20 20 0a 09 63 61  #endif..    ..ca
4590: 73 65 20 27 66 27 3a 0a 09 20 20 20 20 63 6c 5f  se 'f':..    cl_
45a0: 66 6e 61 6d 65 73 20 3d 0a 09 09 52 45 41 4c 4c  fnames =...REALL
45b0: 4f 43 41 54 45 28 63 6c 5f 66 6e 61 6d 65 73 2c  OCATE(cl_fnames,
45c0: 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 20   sizeof(char *) 
45d0: 2a 20 28 6e 75 6d 5f 63 6c 5f 66 6e 61 6d 65 73  * (num_cl_fnames
45e0: 20 2b 20 31 29 29 3b 0a 09 20 20 20 20 63 6c 5f   + 1));..    cl_
45f0: 66 6e 61 6d 65 73 5b 6e 75 6d 5f 63 6c 5f 66 6e  fnames[num_cl_fn
4600: 61 6d 65 73 2b 2b 5d 20 3d 20 6f 70 74 61 72 67  ames++] = optarg
4610: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 20  ;..    break;.. 
4620: 20 20 20 0a 09 63 61 73 65 20 27 68 27 3a 0a 09     ..case 'h':..
4630: 20 20 20 20 70 72 69 6e 74 68 65 6c 70 28 61 72      printhelp(ar
4640: 67 76 5b 30 5d 29 3b 0a 09 20 20 20 20 2f 2a 4e  gv[0]);..    /*N
4650: 4f 54 52 45 41 43 48 45 44 2a 2f 0a 09 20 20 20  OTREACHED*/..   
4660: 20 0a 09 63 61 73 65 20 27 69 27 3a 0a 09 20 20   ..case 'i':..  
4670: 20 20 61 74 74 72 2e 69 67 6e 6f 72 65 5f 63 61    attr.ignore_ca
4680: 73 65 20 3d 20 54 52 55 45 3b 0a 09 20 20 20 20  se = TRUE;..    
4690: 62 72 65 61 6b 3b 0a 09 20 20 20 20 0a 23 69 66  break;..    .#if
46a0: 20 64 65 66 69 6e 65 64 28 53 5f 49 46 4c 4e 4b   defined(S_IFLNK
46b0: 29 0a 09 63 61 73 65 20 27 4c 27 3a 0a 09 20 20  )..case 'L':..  
46c0: 20 20 61 74 74 72 2e 66 6f 6c 6c 6f 77 5f 64 69    attr.follow_di
46d0: 72 20 3d 20 54 52 55 45 3b 0a 09 20 20 20 20 61  r = TRUE;..    a
46e0: 74 74 72 2e 66 6f 6c 6c 6f 77 5f 66 69 6c 65 20  ttr.follow_file 
46f0: 3d 20 54 52 55 45 3b 0a 09 20 20 20 20 61 74 74  = TRUE;..    att
4700: 72 2e 73 74 61 74 5f 61 6c 6c 20 3d 20 54 52 55  r.stat_all = TRU
4710: 45 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  E;..    break;.#
4720: 65 6e 64 69 66 0a 09 20 20 20 20 0a 09 63 61 73  endif..    ..cas
4730: 65 20 27 6c 27 3a 0a 09 20 20 20 20 65 78 61 6d  e 'l':..    exam
4740: 70 74 72 20 3d 20 65 78 61 6d 32 3b 0a 09 20 20  ptr = exam2;..  
4750: 20 20 64 61 73 68 6c 20 3d 20 54 52 55 45 3b 0a    dashl = TRUE;.
4760: 09 20 20 20 20 61 74 74 72 2e 73 74 61 74 5f 61  .    attr.stat_a
4770: 6c 6c 20 3d 20 54 52 55 45 3b 0a 09 20 20 20 20  ll = TRUE;..    
4780: 62 72 65 61 6b 3b 0a 09 20 20 20 20 0a 09 63 61  break;..    ..ca
4790: 73 65 20 27 70 27 3a 0a 09 20 20 20 20 69 66 20  se 'p':..    if 
47a0: 28 61 74 74 72 2e 66 6f 72 6d 61 74 20 21 3d 20  (attr.format != 
47b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 20 7b  (char *) NULL) {
47c0: 0a 09 09 65 72 72 6f 72 28 22 6f 6e 6c 79 20 6f  ...error("only o
47d0: 6e 65 20 2d 70 20 6f 70 74 69 6f 6e 20 69 73 20  ne -p option is 
47e0: 61 6c 6c 6f 77 65 64 22 29 3b 0a 09 20 20 20 20  allowed");..    
47f0: 7d 0a 09 20 20 20 20 61 74 74 72 2e 66 6f 72 6d  }..    attr.form
4800: 61 74 20 3d 20 6f 70 74 61 72 67 3b 0a 09 20 20  at = optarg;..  
4810: 20 20 65 78 61 6d 70 74 72 20 3d 20 65 78 61 6d    examptr = exam
4820: 33 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  3;..    break;..
4830: 20 20 20 20 0a 09 63 61 73 65 20 27 71 27 3a 0a      ..case 'q':.
4840: 09 20 20 20 20 61 74 74 72 2e 67 72 61 70 68 69  .    attr.graphi
4850: 63 20 3d 20 54 52 55 45 3b 0a 09 20 20 20 20 62  c = TRUE;..    b
4860: 72 65 61 6b 3b 0a 09 20 20 20 20 0a 09 63 61 73  reak;..    ..cas
4870: 65 20 27 72 27 3a 0a 09 20 20 20 20 64 61 73 68  e 'r':..    dash
4880: 72 20 3d 20 46 41 4c 53 45 3b 0a 09 20 20 20 20  r = FALSE;..    
4890: 62 72 65 61 6b 3b 0a 09 20 20 20 20 0a 09 63 61  break;..    ..ca
48a0: 73 65 20 27 73 27 3a 0a 09 20 20 20 20 61 74 74  se 's':..    att
48b0: 72 2e 73 74 72 5f 6f 77 6e 65 72 20 3d 20 54 52  r.str_owner = TR
48c0: 55 45 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  UE;..    break;.
48d0: 09 20 20 20 20 0a 09 63 61 73 65 20 27 74 27 3a  .    ..case 't':
48e0: 0a 09 20 20 20 20 61 74 74 72 2e 66 75 6c 6c 5f  ..    attr.full_
48f0: 64 61 74 65 20 3d 20 54 52 55 45 3b 0a 09 20 20  date = TRUE;..  
4900: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
4910: 27 56 27 3a 0a 09 20 20 20 20 65 72 72 6f 72 28  'V':..    error(
4920: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 2f  VERSION);..    /
4930: 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 09 20  *NOTREACHED*/.. 
4940: 20 20 20 0a 09 63 61 73 65 20 27 76 27 3a 0a 09     ..case 'v':..
4950: 20 20 20 20 61 74 74 72 2e 76 65 72 62 6f 73 65      attr.verbose
4960: 20 3d 20 54 52 55 45 3b 0a 09 20 20 20 20 62 72   = TRUE;..    br
4970: 65 61 6b 3b 0a 09 20 20 20 20 0a 09 63 61 73 65  eak;..    ..case
4980: 20 27 77 27 3a 0a 09 20 20 20 20 49 73 73 75 65   'w':..    Issue
4990: 5f 77 61 72 6e 69 6e 67 73 20 3d 20 54 52 55 45  _warnings = TRUE
49a0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
49b0: 63 61 73 65 20 27 78 27 3a 20 0a 09 20 20 20 20  case 'x': ..    
49c0: 69 66 20 28 61 74 74 72 2e 63 6f 6d 6d 61 6e 64  if (attr.command
49d0: 20 21 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c   != (char *) NUL
49e0: 4c 29 20 7b 0a 09 09 65 72 72 6f 72 28 22 6f 6e  L) {...error("on
49f0: 6c 79 20 6f 6e 65 20 2d 78 20 6f 70 74 69 6f 6e  ly one -x option
4a00: 20 69 73 20 61 6c 6c 6f 77 65 64 22 29 3b 0a 09   is allowed");..
4a10: 20 20 20 20 7d 0a 09 20 20 20 20 65 78 61 6d 70      }..    examp
4a20: 74 72 20 3d 20 65 78 61 6d 34 3b 0a 09 20 20 20  tr = exam4;..   
4a30: 20 61 74 74 72 2e 63 6f 6d 6d 61 6e 64 20 3d 20   attr.command = 
4a40: 6f 70 74 61 72 67 3b 0a 09 20 20 20 20 62 72 65  optarg;..    bre
4a50: 61 6b 3b 0a 09 20 20 20 20 0a 23 69 66 20 64 65  ak;..    .#if de
4a60: 66 69 6e 65 64 28 44 45 42 55 47 29 0a 09 63 61  fined(DEBUG)..ca
4a70: 73 65 20 27 54 27 3a 0a 09 20 20 20 20 2b 2b 54  se 'T':..    ++T
4a80: 72 61 63 65 3b 0a 09 20 20 20 20 62 72 65 61 6b  race;..    break
4a90: 3b 0a 0a 09 63 61 73 65 20 27 55 27 3a 0a 09 20  ;...case 'U':.. 
4aa0: 20 20 20 2b 2b 64 75 6d 70 5f 61 6c 6c 3b 0a 09     ++dump_all;..
4ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
4ac0: 65 20 27 57 27 3a 0a 09 20 20 20 20 2b 2b 64 75  e 'W':..    ++du
4ad0: 6d 70 5f 65 78 65 63 3b 0a 09 20 20 20 20 62 72  mp_exec;..    br
4ae0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 27 58 27 3a  eak;...case 'X':
4af0: 0a 09 20 20 20 20 2b 2b 67 64 5f 64 65 62 75 67  ..    ++gd_debug
4b00: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  ;..    break;...
4b10: 63 61 73 65 20 27 59 27 3a 0a 09 20 20 20 20 2b  case 'Y':..    +
4b20: 2b 72 68 5f 64 65 62 75 67 3b 0a 09 20 20 20 20  +rh_debug;..    
4b30: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 27 5a  break;...case 'Z
4b40: 27 3a 0a 09 20 20 20 20 2b 2b 79 79 5f 66 6c 65  ':..    ++yy_fle
4b50: 78 5f 64 65 62 75 67 3b 0a 09 20 20 20 20 62 72  x_debug;..    br
4b60: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 09 64 65  eak;.#endif...de
4b70: 66 61 75 6c 74 3a 0a 09 20 20 20 20 77 61 72 6e  fault:..    warn
4b80: 69 6e 67 28 22 75 73 65 20 2d 68 20 66 6f 72 20  ing("use -h for 
4b90: 68 65 6c 70 22 29 3b 0a 09 20 20 20 20 65 78 69  help");..    exi
4ba0: 74 28 31 29 3b 0a 09 7d 0a 09 0a 20 20 20 20 7d  t(1);..}...    }
4bb0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 70 65 72  .    .    /* per
4bc0: 66 6f 72 6d 20 61 20 6c 69 74 74 6c 65 20 62 69  form a little bi
4bd0: 74 20 6f 66 20 73 61 6e 69 74 79 20 63 68 65 63  t of sanity chec
4be0: 6b 69 6e 67 20 6f 6e 20 73 77 69 74 63 68 20 63  king on switch c
4bf0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 2a 2f 0a 0a  ombinations */..
4c00: 20 20 20 20 69 66 20 28 61 74 74 72 2e 63 6f 6d      if (attr.com
4c10: 6d 61 6e 64 20 21 3d 20 28 63 68 61 72 20 2a 29  mand != (char *)
4c20: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 64 61   NULL) {..if (da
4c30: 73 68 6c 29 20 7b 0a 09 20 20 20 20 65 72 72 6f  shl) {..    erro
4c40: 72 28 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  r("cannot have b
4c50: 6f 74 68 20 2d 78 20 61 6e 64 20 2d 6c 20 6f 70  oth -x and -l op
4c60: 74 69 6f 6e 73 22 29 3b 0a 09 7d 0a 09 65 6c 73  tions");..}..els
4c70: 65 20 69 66 20 28 61 74 74 72 2e 66 6f 72 6d 61  e if (attr.forma
4c80: 74 20 21 3d 20 28 63 68 61 72 20 2a 29 20 4e 55  t != (char *) NU
4c90: 4c 4c 29 20 7b 0a 09 20 20 20 20 77 61 72 6e 69  LL) {..    warni
4ca0: 6e 67 28 22 2d 78 20 6f 76 65 72 72 69 64 65 73  ng("-x overrides
4cb0: 20 2d 70 2c 20 2d 70 20 69 67 6e 6f 72 65 64 22   -p, -p ignored"
4cc0: 29 3b 0a 09 20 20 20 20 61 74 74 72 2e 66 6f 72  );..    attr.for
4cd0: 6d 61 74 20 3d 20 28 63 68 61 72 20 2a 29 20 4e  mat = (char *) N
4ce0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  ULL;..}.    }.  
4cf0: 20 20 65 6c 73 65 20 69 66 20 28 61 74 74 72 2e    else if (attr.
4d00: 66 6f 72 6d 61 74 20 21 3d 20 28 63 68 61 72 20  format != (char 
4d10: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  *) NULL) {..if (
4d20: 64 61 73 68 6c 29 20 7b 0a 09 20 20 20 20 77 61  dashl) {..    wa
4d30: 72 6e 69 6e 67 28 22 2d 70 20 6f 76 65 72 72 69  rning("-p overri
4d40: 64 65 73 20 2d 6c 2c 20 2d 6c 20 69 67 6e 6f 72  des -l, -l ignor
4d50: 65 64 22 29 3b 0a 09 20 20 20 20 64 61 73 68 6c  ed");..    dashl
4d60: 20 3d 20 46 41 4c 53 45 3b 0a 09 7d 0a 09 69 66   = FALSE;..}..if
4d70: 20 28 61 74 74 72 2e 76 65 72 62 6f 73 65 29 20   (attr.verbose) 
4d80: 7b 0a 09 20 20 20 20 77 61 72 6e 69 6e 67 28 22  {..    warning("
4d90: 2d 70 20 6f 76 65 72 72 69 64 65 73 20 2d 76 2c  -p overrides -v,
4da0: 20 2d 76 20 69 67 6e 6f 72 65 64 22 29 3b 0a 09   -v ignored");..
4db0: 20 20 20 20 61 74 74 72 2e 76 65 72 62 6f 73 65      attr.verbose
4dc0: 20 3d 20 46 41 4c 53 45 3b 0a 09 7d 0a 20 20 20   = FALSE;..}.   
4dd0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
4de0: 2a 20 41 6c 77 61 79 73 20 64 69 73 70 6c 61 79  * Always display
4df0: 20 63 6f 6e 74 72 6f 6c 20 63 68 61 72 61 63 74   control charact
4e00: 65 72 73 20 69 6e 20 66 69 6c 65 20 6e 61 6d 65  ers in file name
4e10: 73 20 61 73 20 61 20 27 3f 27 0a 20 20 20 20 20  s as a '?'.     
4e20: 2a 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  * if the output 
4e30: 69 73 20 61 20 74 65 72 6d 69 6e 61 6c 2e 0a 20  is a terminal.. 
4e40: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
4e50: 69 73 61 74 74 79 28 66 69 6c 65 6e 6f 28 73 74  isatty(fileno(st
4e60: 64 6f 75 74 29 29 29 20 7b 0a 09 61 74 74 72 2e  dout))) {..attr.
4e70: 67 72 61 70 68 69 63 20 3d 20 54 52 55 45 3b 0a  graphic = TRUE;.
4e80: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
4e90: 2a 0a 20 20 20 20 20 2a 20 52 65 61 64 20 61 6e  *.     * Read an
4ea0: 64 20 70 61 72 73 65 20 66 75 6e 63 74 69 6f 6e  d parse function
4eb0: 73 2f 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  s/expression in 
4ec0: 66 69 6c 65 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a  files..     */..
4ed0: 20 20 20 20 73 74 61 72 74 50 43 20 3d 20 2d 31      startPC = -1
4ee0: 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 72  ;.    .    if (r
4ef0: 65 61 64 5f 72 68 72 63 20 7c 7c 20 6e 75 6d 5f  ead_rhrc || num_
4f00: 63 6c 5f 66 6e 61 6d 65 73 29 20 7b 0a 09 72 68  cl_fnames) {..rh
4f10: 70 61 74 68 20 3d 20 67 65 74 5f 72 68 70 61 74  path = get_rhpat
4f20: 68 28 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72  h();..if (read_r
4f30: 68 72 63 29 20 7b 0a 09 20 20 20 20 63 68 61 72  hrc) {..    char
4f40: 20 2a 72 68 72 63 20 3d 20 67 65 74 65 6e 76 28   *rhrc = getenv(
4f50: 52 48 52 43 5f 45 4e 56 29 3b 0a 09 20 20 20 20  RHRC_ENV);..    
4f60: 69 66 20 28 72 68 72 63 20 3d 3d 20 28 63 68 61  if (rhrc == (cha
4f70: 72 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  r *) NULL) {...r
4f80: 68 72 63 20 3d 20 52 48 52 43 3b 0a 09 20 20 20  hrc = RHRC;..   
4f90: 20 7d 0a 09 20 20 20 20 49 6e 70 75 74 5f 6e 61   }..    Input_na
4fa0: 6d 65 20 3d 20 72 65 73 6f 6c 76 65 5f 6e 61 6d  me = resolve_nam
4fb0: 65 28 72 68 70 61 74 68 2c 20 72 68 72 63 29 3b  e(rhpath, rhrc);
4fc0: 0a 09 20 20 20 20 49 6e 70 75 74 5f 66 69 6c 65  ..    Input_file
4fd0: 20 3d 20 6f 70 65 6e 28 49 6e 70 75 74 5f 6e 61   = open(Input_na
4fe0: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  me, O_RDONLY, 0)
4ff0: 3b 0a 09 20 20 20 20 69 66 20 28 49 6e 70 75 74  ;..    if (Input
5000: 5f 66 69 6c 65 20 21 3d 20 2d 31 29 20 7b 0a 09  _file != -1) {..
5010: 09 69 66 20 28 72 68 5f 70 61 72 73 65 28 29 29  .if (rh_parse())
5020: 20 7b 0a 09 09 20 20 20 20 65 78 69 74 28 31 29   {...    exit(1)
5030: 3b 0a 09 09 7d 0a 09 09 66 69 72 73 74 5f 70 61  ;...}...first_pa
5040: 72 73 65 20 3d 20 46 41 4c 53 45 3b 0a 09 09 28  rse = FALSE;...(
5050: 76 6f 69 64 29 20 63 6c 6f 73 65 28 49 6e 70 75  void) close(Inpu
5060: 74 5f 66 69 6c 65 29 3b 0a 09 20 20 20 20 7d 0a  t_file);..    }.
5070: 09 20 20 20 20 66 72 65 65 28 49 6e 70 75 74 5f  .    free(Input_
5080: 6e 61 6d 65 29 3b 0a 09 7d 0a 09 69 66 20 28 6e  name);..}..if (n
5090: 75 6d 5f 63 6c 5f 66 6e 61 6d 65 73 29 20 7b 0a  um_cl_fnames) {.
50a0: 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
50b0: 20 69 20 3c 20 6e 75 6d 5f 63 6c 5f 66 6e 61 6d   i < num_cl_fnam
50c0: 65 73 3b 20 69 2b 2b 29 20 7b 0a 09 09 69 66 20  es; i++) {...if 
50d0: 28 21 66 69 72 73 74 5f 70 61 72 73 65 29 20 7b  (!first_parse) {
50e0: 0a 09 09 20 20 20 20 79 79 72 65 73 74 61 72 74  ...    yyrestart
50f0: 28 73 74 64 69 6e 29 3b 0a 09 09 7d 0a 09 09 69  (stdin);...}...i
5100: 66 20 28 73 74 72 63 6d 70 28 63 6c 5f 66 6e 61  f (strcmp(cl_fna
5110: 6d 65 73 5b 69 5d 2c 20 22 2d 22 29 20 3d 3d 20  mes[i], "-") == 
5120: 30 29 20 7b 0a 09 09 20 20 20 20 49 6e 70 75 74  0) {...    Input
5130: 5f 6e 61 6d 65 20 3d 20 22 73 74 64 69 6e 22 3b  _name = "stdin";
5140: 0a 09 09 20 20 20 20 69 66 20 28 66 65 6f 66 28  ...    if (feof(
5150: 73 74 64 69 6e 29 29 20 7b 0a 09 09 09 49 6e 70  stdin)) {....Inp
5160: 75 74 5f 66 69 6c 65 20 3d 20 6f 70 65 6e 28 22  ut_file = open("
5170: 2f 64 65 76 2f 74 74 79 22 2c 20 4f 5f 52 44 4f  /dev/tty", O_RDO
5180: 4e 4c 59 2c 20 30 29 3b 0a 09 09 09 69 66 20 28  NLY, 0);....if (
5190: 49 6e 70 75 74 5f 66 69 6c 65 20 3d 3d 20 2d 31  Input_file == -1
51a0: 29 20 20 7b 0a 09 09 09 20 20 20 20 65 72 72 6f  )  {....    erro
51b0: 72 28 22 63 61 6e 27 74 20 72 65 6f 70 65 6e 20  r("can't reopen 
51c0: 73 74 64 69 6e 20 3a 20 25 6d 22 29 3b 0a 09 09  stdin : %m");...
51d0: 09 7d 0a 09 09 09 69 66 20 28 72 68 5f 70 61 72  .}....if (rh_par
51e0: 73 65 28 29 29 20 7b 0a 09 09 09 20 20 20 20 65  se()) {....    e
51f0: 78 69 74 28 31 29 3b 0a 09 09 09 7d 0a 09 09 09  xit(1);....}....
5200: 28 76 6f 69 64 29 20 63 6c 6f 73 65 28 49 6e 70  (void) close(Inp
5210: 75 74 5f 66 69 6c 65 29 3b 0a 09 09 20 20 20 20  ut_file);...    
5220: 7d 0a 09 09 20 20 20 20 65 6c 73 65 20 7b 0a 09  }...    else {..
5230: 09 09 49 6e 70 75 74 5f 66 69 6c 65 20 3d 20 66  ..Input_file = f
5240: 69 6c 65 6e 6f 28 73 74 64 69 6e 29 3b 0a 09 09  ileno(stdin);...
5250: 09 69 66 20 28 72 68 5f 70 61 72 73 65 28 29 29  .if (rh_parse())
5260: 20 7b 0a 09 09 09 20 20 20 20 65 78 69 74 28 31   {....    exit(1
5270: 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 0a  );....}...    }.
5280: 09 09 7d 0a 09 09 65 6c 73 65 20 7b 0a 09 09 20  ..}...else {... 
5290: 20 20 20 49 6e 70 75 74 5f 6e 61 6d 65 20 3d 20     Input_name = 
52a0: 72 65 73 6f 6c 76 65 5f 6e 61 6d 65 28 72 68 70  resolve_name(rhp
52b0: 61 74 68 2c 20 63 6c 5f 66 6e 61 6d 65 73 5b 69  ath, cl_fnames[i
52c0: 5d 29 3b 0a 09 09 20 20 20 20 49 6e 70 75 74 5f  ]);...    Input_
52d0: 66 69 6c 65 20 3d 20 6f 70 65 6e 28 49 6e 70 75  file = open(Inpu
52e0: 74 5f 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  t_name, O_RDONLY
52f0: 2c 20 30 29 3b 0a 09 09 20 20 20 20 69 66 20 28  , 0);...    if (
5300: 49 6e 70 75 74 5f 66 69 6c 65 20 3d 3d 20 2d 31  Input_file == -1
5310: 29 20 7b 0a 09 09 09 65 72 72 6f 72 28 22 63 61  ) {....error("ca
5320: 6e 27 74 20 6f 70 65 6e 20 25 73 20 3a 20 25 6d  n't open %s : %m
5330: 22 2c 20 49 6e 70 75 74 5f 6e 61 6d 65 29 3b 0a  ", Input_name);.
5340: 09 09 20 20 20 20 7d 0a 09 09 20 20 20 20 69 66  ..    }...    if
5350: 20 28 72 68 5f 70 61 72 73 65 28 29 29 20 7b 0a   (rh_parse()) {.
5360: 09 09 09 65 78 69 74 28 31 29 3b 0a 09 09 20 20  ...exit(1);...  
5370: 20 20 7d 0a 09 09 20 20 20 20 28 76 6f 69 64 29    }...    (void)
5380: 20 63 6c 6f 73 65 28 49 6e 70 75 74 5f 66 69 6c   close(Input_fil
5390: 65 29 3b 0a 09 09 20 20 20 20 66 72 65 65 28 49  e);...    free(I
53a0: 6e 70 75 74 5f 6e 61 6d 65 29 3b 0a 09 09 7d 0a  nput_name);...}.
53b0: 09 09 66 69 72 73 74 5f 70 61 72 73 65 20 3d 20  ..first_parse = 
53c0: 46 41 4c 53 45 3b 0a 09 20 20 20 20 7d 0a 09 20  FALSE;..    }.. 
53d0: 20 20 20 66 72 65 65 28 28 63 68 61 72 20 2a 29     free((char *)
53e0: 20 63 6c 5f 66 6e 61 6d 65 73 29 3b 0a 09 7d 0a   cl_fnames);..}.
53f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 72      }..    if (r
5400: 68 70 61 74 68 20 21 3d 20 28 63 68 61 72 20 2a  hpath != (char *
5410: 29 20 4e 55 4c 4c 29 20 7b 0a 09 66 72 65 65 28  ) NULL) {..free(
5420: 72 68 70 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  rhpath);.    }. 
5430: 20 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20     .    /*.     
5440: 2a 20 50 61 72 73 65 20 65 78 70 72 65 73 73 69  * Parse expressi
5450: 6f 6e 73 20 66 72 6f 6d 20 2d 65 20 73 77 69 74  ons from -e swit
5460: 63 68 65 73 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ches.     */..  
5470: 20 20 69 66 20 28 6e 75 6d 5f 63 6c 5f 65 78 70    if (num_cl_exp
5480: 72 73 29 20 7b 0a 09 49 6e 70 75 74 5f 66 69 6c  rs) {..Input_fil
5490: 65 20 3d 20 2d 31 3b 0a 09 49 6e 70 75 74 5f 6e  e = -1;..Input_n
54a0: 61 6d 65 20 3d 20 22 63 6d 64 20 6c 69 6e 65 22  ame = "cmd line"
54b0: 3b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  ;..for (i = 0; i
54c0: 20 3c 20 6e 75 6d 5f 63 6c 5f 65 78 70 72 73 3b   < num_cl_exprs;
54d0: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 49 6e 70   i++) {..    Inp
54e0: 75 74 5f 65 78 70 72 5f 70 74 72 20 3d 20 63 6c  ut_expr_ptr = cl
54f0: 5f 65 78 70 72 73 5b 69 5d 3b 0a 09 20 20 20 20  _exprs[i];..    
5500: 49 6e 70 75 74 5f 65 78 70 72 5f 65 6e 64 20 3d  Input_expr_end =
5510: 20 49 6e 70 75 74 5f 65 78 70 72 5f 70 74 72 20   Input_expr_ptr 
5520: 2b 20 73 74 72 6c 65 6e 28 49 6e 70 75 74 5f 65  + strlen(Input_e
5530: 78 70 72 5f 70 74 72 29 3b 0a 09 20 20 20 20 69  xpr_ptr);..    i
5540: 66 20 28 21 66 69 72 73 74 5f 70 61 72 73 65 29  f (!first_parse)
5550: 20 7b 0a 09 09 79 79 72 65 73 74 61 72 74 28 73   {...yyrestart(s
5560: 74 64 69 6e 29 3b 0a 09 20 20 20 20 7d 0a 09 20  tdin);..    }.. 
5570: 20 20 20 69 66 20 28 72 68 5f 70 61 72 73 65 28     if (rh_parse(
5580: 29 29 20 7b 0a 09 09 65 78 69 74 28 31 29 3b 0a  )) {...exit(1);.
5590: 09 20 20 20 20 7d 0a 09 20 20 20 20 66 69 72 73  .    }..    firs
55a0: 74 5f 70 61 72 73 65 20 3d 20 46 41 4c 53 45 3b  t_parse = FALSE;
55b0: 0a 09 7d 0a 09 66 72 65 65 28 28 63 68 61 72 20  ..}..free((char 
55c0: 2a 29 20 63 6c 5f 65 78 70 72 73 29 3b 0a 20 20  *) cl_exprs);.  
55d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
55e0: 20 2a 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 70   * Compile the p
55f0: 61 72 73 65 20 74 72 65 65 20 69 66 20 61 20 73  arse tree if a s
5600: 74 61 72 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tart expression 
5610: 77 61 73 20 73 70 65 63 69 66 69 65 64 2e 0a 20  was specified.. 
5620: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
5630: 53 74 61 72 74 5f 65 78 70 72 20 3d 3d 20 28 6e  Start_expr == (n
5640: 6f 64 65 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09  ode *) NULL) {..
5650: 69 66 20 28 49 73 73 75 65 5f 77 61 72 6e 69 6e  if (Issue_warnin
5660: 67 73 29 20 7b 0a 09 20 20 20 20 77 61 72 6e 69  gs) {..    warni
5670: 6e 67 28 22 6e 6f 20 73 74 61 72 74 20 65 78 70  ng("no start exp
5680: 72 65 73 73 69 6f 6e 20 73 70 65 63 69 66 69 65  ression specifie
5690: 64 22 29 3b 0a 09 7d 0a 09 69 66 20 28 64 6f 6e  d");..}..if (don
56a0: 74 5f 63 72 6f 73 73 5f 66 69 6c 65 73 79 73 74  t_cross_filesyst
56b0: 65 6d 73 29 20 7b 0a 09 20 20 20 20 73 61 6d 65  ems) {..    same
56c0: 66 73 50 43 20 3d 20 73 74 61 72 74 50 43 20 3d  fsPC = startPC =
56d0: 20 50 43 20 3d 20 30 3b 0a 0a 09 20 20 20 20 76   PC = 0;...    v
56e0: 61 6c 75 65 2e 64 65 76 20 3d 20 28 64 65 76 5f  alue.dev = (dev_
56f0: 74 29 20 30 3b 0a 09 20 20 20 20 70 75 73 68 5f  t) 0;..    push_
5700: 69 6e 73 74 72 28 63 5f 73 61 6d 65 66 73 2c 20  instr(c_samefs, 
5710: 26 76 61 6c 75 65 29 3b 0a 0a 09 20 20 20 20 71  &value);...    q
5720: 6d 5f 70 63 20 3d 20 50 43 3b 0a 09 20 20 20 20  m_pc = PC;..    
5730: 76 61 6c 75 65 2e 70 63 20 3d 20 30 3b 0a 09 20  value.pc = 0;.. 
5740: 20 20 20 70 75 73 68 5f 69 6e 73 74 72 28 63 5f     push_instr(c_
5750: 71 6d 2c 20 26 76 61 6c 75 65 29 3b 0a 0a 09 20  qm, &value);... 
5760: 20 20 20 76 61 6c 75 65 2e 6c 20 3d 20 31 4c 3b     value.l = 1L;
5770: 0a 09 20 20 20 20 70 75 73 68 5f 69 6e 73 74 72  ..    push_instr
5780: 28 63 5f 6e 75 6d 62 65 72 2c 20 26 76 61 6c 75  (c_number, &valu
5790: 65 29 3b 0a 0a 09 20 20 20 20 63 6f 6c 6f 6e 5f  e);...    colon_
57a0: 70 63 20 3d 20 50 43 3b 0a 09 20 20 20 20 76 61  pc = PC;..    va
57b0: 6c 75 65 2e 70 63 20 3d 20 30 3b 0a 09 20 20 20  lue.pc = 0;..   
57c0: 20 70 75 73 68 5f 69 6e 73 74 72 28 63 5f 63 6f   push_instr(c_co
57d0: 6c 6f 6e 2c 20 26 76 61 6c 75 65 29 3b 0a 0a 09  lon, &value);...
57e0: 20 20 20 20 76 61 6c 75 65 2e 6c 20 3d 20 30 4c      value.l = 0L
57f0: 3b 0a 09 20 20 20 20 70 75 73 68 5f 69 6e 73 74  ;..    push_inst
5800: 72 28 63 5f 70 72 75 6e 65 2c 20 26 76 61 6c 75  r(c_prune, &valu
5810: 65 29 3b 0a 0a 09 20 20 20 20 53 74 61 63 6b 50  e);...    StackP
5820: 72 6f 67 72 61 6d 5b 71 6d 5f 70 63 5d 2e 76 61  rogram[qm_pc].va
5830: 6c 75 65 2e 70 63 20 3d 20 63 6f 6c 6f 6e 5f 70  lue.pc = colon_p
5840: 63 3b 0a 09 20 20 20 20 53 74 61 63 6b 50 72 6f  c;..    StackPro
5850: 67 72 61 6d 5b 63 6f 6c 6f 6e 5f 70 63 5d 2e 76  gram[colon_pc].v
5860: 61 6c 75 65 2e 70 63 20 3d 20 50 43 20 2d 20 31  alue.pc = PC - 1
5870: 3b 0a 0a 09 20 20 20 20 76 61 6c 75 65 2e 6c 20  ;...    value.l 
5880: 3d 20 30 4c 3b 0a 09 20 20 20 20 70 75 73 68 5f  = 0L;..    push_
5890: 69 6e 73 74 72 28 4e 55 4c 4c 5f 49 4e 53 54 52  instr(NULL_INSTR
58a0: 2c 20 26 76 61 6c 75 65 29 3b 0a 09 20 20 20 20  , &value);..    
58b0: 70 75 73 68 5f 69 6e 73 74 72 28 45 4e 44 5f 4f  push_instr(END_O
58c0: 46 5f 50 52 4f 47 2c 20 26 76 61 6c 75 65 29 3b  F_PROG, &value);
58d0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  ..}.    }.    el
58e0: 73 65 20 7b 0a 09 50 43 20 3d 20 30 3b 0a 09 77  se {..PC = 0;..w
58f0: 72 69 74 65 5f 66 75 6e 63 74 69 6f 6e 73 28 29  rite_functions()
5900: 3b 0a 09 73 74 61 72 74 50 43 20 3d 20 50 43 3b  ;..startPC = PC;
5910: 0a 09 69 66 20 28 64 6f 6e 74 5f 63 72 6f 73 73  ..if (dont_cross
5920: 5f 66 69 6c 65 73 79 73 74 65 6d 73 29 20 7b 0a  _filesystems) {.
5930: 09 20 20 20 20 73 61 6d 65 66 73 50 43 20 3d 20  .    samefsPC = 
5940: 50 43 3b 0a 09 20 20 20 20 76 61 6c 75 65 2e 64  PC;..    value.d
5950: 65 76 20 3d 20 28 64 65 76 5f 74 29 20 30 3b 0a  ev = (dev_t) 0;.
5960: 09 20 20 20 20 70 75 73 68 5f 69 6e 73 74 72 28  .    push_instr(
5970: 63 5f 73 61 6d 65 66 73 2c 20 26 76 61 6c 75 65  c_samefs, &value
5980: 29 3b 0a 0a 09 20 20 20 20 71 6d 5f 70 63 20 3d  );...    qm_pc =
5990: 20 50 43 3b 0a 09 20 20 20 20 76 61 6c 75 65 2e   PC;..    value.
59a0: 70 63 20 3d 20 30 3b 0a 09 20 20 20 20 70 75 73  pc = 0;..    pus
59b0: 68 5f 69 6e 73 74 72 28 63 5f 71 6d 2c 20 26 76  h_instr(c_qm, &v
59c0: 61 6c 75 65 29 3b 0a 09 7d 0a 09 77 72 69 74 65  alue);..}..write
59d0: 5f 74 72 65 65 28 53 74 61 72 74 5f 65 78 70 72  _tree(Start_expr
59e0: 29 3b 0a 09 69 66 20 28 64 6f 6e 74 5f 63 72 6f  );..if (dont_cro
59f0: 73 73 5f 66 69 6c 65 73 79 73 74 65 6d 73 29 20  ss_filesystems) 
5a00: 7b 0a 09 20 20 20 20 63 6f 6c 6f 6e 5f 70 63 20  {..    colon_pc 
5a10: 3d 20 50 43 3b 0a 09 20 20 20 20 76 61 6c 75 65  = PC;..    value
5a20: 2e 70 63 20 3d 20 30 3b 0a 09 20 20 20 20 70 75  .pc = 0;..    pu
5a30: 73 68 5f 69 6e 73 74 72 28 63 5f 63 6f 6c 6f 6e  sh_instr(c_colon
5a40: 2c 20 26 76 61 6c 75 65 29 3b 0a 0a 09 20 20 20  , &value);...   
5a50: 20 76 61 6c 75 65 2e 6c 20 3d 20 30 4c 3b 0a 09   value.l = 0L;..
5a60: 20 20 20 20 70 75 73 68 5f 69 6e 73 74 72 28 63      push_instr(c
5a70: 5f 70 72 75 6e 65 2c 20 26 76 61 6c 75 65 29 3b  _prune, &value);
5a80: 0a 0a 09 20 20 20 20 53 74 61 63 6b 50 72 6f 67  ...    StackProg
5a90: 72 61 6d 5b 71 6d 5f 70 63 5d 2e 76 61 6c 75 65  ram[qm_pc].value
5aa0: 2e 70 63 20 3d 20 63 6f 6c 6f 6e 5f 70 63 3b 0a  .pc = colon_pc;.
5ab0: 09 20 20 20 20 53 74 61 63 6b 50 72 6f 67 72 61  .    StackProgra
5ac0: 6d 5b 63 6f 6c 6f 6e 5f 70 63 5d 2e 76 61 6c 75  m[colon_pc].valu
5ad0: 65 2e 70 63 20 3d 20 50 43 20 2d 20 31 3b 0a 09  e.pc = PC - 1;..
5ae0: 7d 0a 09 76 61 6c 75 65 2e 6c 20 3d 20 30 4c 3b  }..value.l = 0L;
5af0: 0a 09 70 75 73 68 5f 69 6e 73 74 72 28 4e 55 4c  ..push_instr(NUL
5b00: 4c 5f 49 4e 53 54 52 2c 20 26 76 61 6c 75 65 29  L_INSTR, &value)
5b10: 3b 0a 09 70 75 73 68 5f 69 6e 73 74 72 28 45 4e  ;..push_instr(EN
5b20: 44 5f 4f 46 5f 50 52 4f 47 2c 20 26 76 61 6c 75  D_OF_PROG, &valu
5b30: 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  e);.    }..#if d
5b40: 65 66 69 6e 65 64 28 44 45 42 55 47 29 0a 20 20  efined(DEBUG).  
5b50: 20 20 69 66 20 28 73 74 61 72 74 50 43 20 21 3d    if (startPC !=
5b60: 20 2d 31 29 20 7b 0a 09 69 66 20 28 64 75 6d 70   -1) {..if (dump
5b70: 5f 61 6c 6c 29 20 7b 0a 09 20 20 20 20 69 6e 74  _all) {..    int
5b80: 20 6f 70 63 20 3d 20 30 3b 0a 09 20 20 20 20 69   opc = 0;..    i
5b90: 6e 74 20 6e 70 63 3b 0a 0a 09 20 20 20 20 77 68  nt npc;...    wh
5ba0: 69 6c 65 20 28 28 6e 70 63 20 3d 20 64 75 6d 70  ile ((npc = dump
5bb0: 5f 70 72 6f 67 72 61 6d 28 6f 70 63 2c 20 30 29  _program(opc, 0)
5bc0: 29 20 21 3d 20 2d 31 29 20 7b 0a 09 09 6f 70 63  ) != -1) {...opc
5bd0: 20 3d 20 6e 70 63 3b 0a 09 20 20 20 20 7d 0a 09   = npc;..    }..
5be0: 7d 0a 09 65 6c 73 65 20 69 66 20 28 64 75 6d 70  }..else if (dump
5bf0: 5f 65 78 65 63 29 20 7b 0a 09 20 20 20 20 28 76  _exec) {..    (v
5c00: 6f 69 64 29 20 64 75 6d 70 5f 70 72 6f 67 72 61  oid) dump_progra
5c10: 6d 28 73 74 61 72 74 50 43 2c 20 31 29 3b 0a 09  m(startPC, 1);..
5c20: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
5c30: 20 20 20 20 72 68 66 69 6e 69 73 68 28 29 3b 0a      rhfinish();.
5c40: 20 20 20 20 0a 20 20 20 20 69 66 20 28 21 61 74      .    if (!at
5c50: 74 72 2e 73 74 61 74 5f 61 6c 6c 29 20 7b 0a 09  tr.stat_all) {..
5c60: 69 66 20 28 61 74 74 72 2e 66 6f 72 6d 61 74 20  if (attr.format 
5c70: 21 3d 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  != (char *) NULL
5c80: 29 20 7b 0a 09 20 20 20 20 61 74 74 72 2e 73 74  ) {..    attr.st
5c90: 61 74 5f 61 6c 6c 20 3d 20 66 6d 74 5f 72 65 71  at_all = fmt_req
5ca0: 5f 73 74 61 74 28 29 3b 0a 09 7d 0a 09 69 66 20  _stat();..}..if 
5cb0: 28 21 61 74 74 72 2e 73 74 61 74 5f 61 6c 6c 20  (!attr.stat_all 
5cc0: 26 26 20 73 74 61 72 74 50 43 20 21 3d 20 2d 31  && startPC != -1
5cd0: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 73 63 61 6e  ) {..    /* scan
5ce0: 20 70 72 6f 67 72 61 6d 20 66 6f 72 20 61 6e 79   program for any
5cf0: 74 68 69 6e 67 20 74 68 61 74 20 72 65 71 75 69  thing that requi
5d00: 72 65 73 20 61 20 73 74 61 74 28 29 20 63 61 6c  res a stat() cal
5d10: 6c 20 2a 2f 0a 09 20 20 20 20 61 74 74 72 2e 73  l */..    attr.s
5d20: 74 61 74 5f 61 6c 6c 20 3d 20 70 72 6f 67 5f 72  tat_all = prog_r
5d30: 65 71 5f 73 74 61 74 28 73 74 61 72 74 50 43 29  eq_stat(startPC)
5d40: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20  ;..}.    }..#if 
5d50: 64 65 66 69 6e 65 64 28 44 45 42 55 47 32 29 0a  defined(DEBUG2).
5d60: 20 20 20 20 28 76 6f 69 64 29 20 66 70 72 69 6e      (void) fprin
5d70: 74 66 28 73 74 64 65 72 72 2c 20 22 73 74 61 74  tf(stderr, "stat
5d80: 20 61 6c 6c 20 3d 20 25 73 22 2c 20 61 74 74 72   all = %s", attr
5d90: 2e 73 74 61 74 5f 61 6c 6c 20 3f 20 22 74 72 75  .stat_all ? "tru
5da0: 65 22 20 3a 20 22 66 61 6c 73 65 22 29 3b 0a 23  e" : "false");.#
5db0: 65 6e 64 69 66 0a 0a 20 20 20 20 64 65 70 74 68  endif..    depth
5dc0: 20 3d 20 64 61 73 68 72 20 3f 20 44 45 50 54 48   = dashr ? DEPTH
5dd0: 20 3a 20 31 3b 0a 20 20 20 20 0a 20 20 20 20 69   : 1;.    .    i
5de0: 66 20 28 6f 70 74 69 6e 64 20 3e 3d 20 61 72 67  f (optind >= arg
5df0: 63 29 20 7b 0a 09 66 74 72 77 28 64 61 73 68 62  c) {..ftrw(dashb
5e00: 20 3f 20 22 2e 22 20 3a 20 22 22 2c 20 65 78 61   ? "." : "", exa
5e10: 6d 70 74 72 2c 20 64 65 70 74 68 2c 20 64 61 73  mptr, depth, das
5e20: 68 72 2c 20 73 61 6d 65 66 73 50 43 29 3b 0a 20  hr, samefsPC);. 
5e30: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 0a     }.    else {.
5e40: 09 66 6f 72 20 28 2f 2a 20 76 6f 69 64 20 2a 2f  .for (/* void */
5e50: 3b 20 6f 70 74 69 6e 64 20 3c 20 61 72 67 63 3b  ; optind < argc;
5e60: 20 6f 70 74 69 6e 64 2b 2b 29 20 7b 0a 09 20 20   optind++) {..  
5e70: 20 20 69 66 20 28 73 61 6d 65 66 73 50 43 20 21    if (samefsPC !
5e80: 3d 20 2d 31 29 20 7b 0a 09 09 53 74 61 63 6b 50  = -1) {...StackP
5e90: 72 6f 67 72 61 6d 5b 73 61 6d 65 66 73 50 43 5d  rogram[samefsPC]
5ea0: 2e 76 61 6c 75 65 2e 64 65 76 20 3d 20 28 64 65  .value.dev = (de
5eb0: 76 5f 74 29 20 30 3b 0a 09 20 20 20 20 7d 0a 09  v_t) 0;..    }..
5ec0: 20 20 20 20 66 74 72 77 28 61 72 67 76 5b 6f 70      ftrw(argv[op
5ed0: 74 69 6e 64 5d 2c 20 65 78 61 6d 70 74 72 2c 20  tind], examptr, 
5ee0: 64 65 70 74 68 2c 20 64 61 73 68 72 2c 20 73 61  depth, dashr, sa
5ef0: 6d 65 66 73 50 43 29 3b 0a 09 7d 0a 20 20 20 20  mefsPC);..}.    
5f00: 7d 0a 20 20 20 20 0a 23 69 66 20 64 65 66 69 6e  }.    .#if defin
5f10: 65 64 28 44 45 42 55 47 29 0a 20 20 20 20 7b 0a  ed(DEBUG).    {.
5f20: 09 73 79 6d 62 6f 6c 20 2a 73 79 6d 3b 0a 0a 09  .symbol *sym;...
5f30: 77 68 69 6c 65 20 28 53 79 6d 62 6f 6c 5f 74 61  while (Symbol_ta
5f40: 62 6c 65 2d 3e 74 79 70 65 20 3d 3d 20 46 55 4e  ble->type == FUN
5f50: 43 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 73 79  CTION) {..    sy
5f60: 6d 20 3d 20 53 79 6d 62 6f 6c 5f 74 61 62 6c 65  m = Symbol_table
5f70: 3b 0a 09 20 20 20 20 53 79 6d 62 6f 6c 5f 74 61  ;..    Symbol_ta
5f80: 62 6c 65 20 3d 20 53 79 6d 62 6f 6c 5f 74 61 62  ble = Symbol_tab
5f90: 6c 65 2d 3e 6e 65 78 74 3b 0a 09 20 20 20 20 66  le->next;..    f
5fa0: 72 65 65 28 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a  ree(sym->name);.
5fb0: 09 20 20 20 20 66 72 65 65 28 28 63 68 61 72 20  .    free((char 
5fc0: 2a 29 20 73 79 6d 29 3b 0a 09 7d 0a 20 20 20 20  *) sym);..}.    
5fd0: 7d 0a 20 20 20 20 69 66 20 28 73 74 61 72 74 50  }.    if (startP
5fe0: 43 20 21 3d 20 2d 31 29 20 7b 0a 09 69 6e 74 20  C != -1) {..int 
5ff0: 70 63 3b 0a 0a 09 66 6f 72 20 28 70 63 20 3d 20  pc;...for (pc = 
6000: 30 3b 20 53 74 61 63 6b 50 72 6f 67 72 61 6d 5b  0; StackProgram[
6010: 70 63 5d 2e 66 75 6e 63 20 21 3d 20 45 4e 44 5f  pc].func != END_
6020: 4f 46 5f 50 52 4f 47 3b 20 2b 2b 70 63 29 20 7b  OF_PROG; ++pc) {
6030: 0a 09 20 20 20 20 69 66 20 28 53 74 61 63 6b 50  ..    if (StackP
6040: 72 6f 67 72 61 6d 5b 70 63 5d 2e 66 75 6e 63 20  rogram[pc].func 
6050: 3d 3d 20 63 5f 70 61 74 74 65 72 6e 0a 09 09 7c  == c_pattern...|
6060: 7c 20 53 74 61 63 6b 50 72 6f 67 72 61 6d 5b 70  | StackProgram[p
6070: 63 5d 2e 66 75 6e 63 20 3d 3d 20 63 5f 66 6e 63  c].func == c_fnc
6080: 61 73 65 0a 09 09 7c 7c 20 53 74 61 63 6b 50 72  ase...|| StackPr
6090: 6f 67 72 61 6d 5b 70 63 5d 2e 66 75 6e 63 20 3d  ogram[pc].func =
60a0: 3d 20 63 5f 66 6e 69 67 6e 63 61 73 65 29 20 7b  = c_fnigncase) {
60b0: 0a 09 09 66 72 65 65 28 53 74 61 63 6b 50 72 6f  ...free(StackPro
60c0: 67 72 61 6d 5b 70 63 5d 2e 76 61 6c 75 65 2e 70  gram[pc].value.p
60d0: 61 74 74 65 72 6e 29 3b 0a 09 20 20 20 20 7d 0a  attern);..    }.
60e0: 09 20 20 20 20 65 6c 73 65 20 69 66 20 28 53 74  .    else if (St
60f0: 61 63 6b 50 72 6f 67 72 61 6d 5b 70 63 5d 2e 66  ackProgram[pc].f
6100: 75 6e 63 20 3d 3d 20 63 5f 64 61 74 65 29 20 7b  unc == c_date) {
6110: 0a 09 09 66 72 65 65 28 28 63 68 61 72 20 2a 29  ...free((char *)
6120: 20 53 74 61 63 6b 50 72 6f 67 72 61 6d 5b 70 63   StackProgram[pc
6130: 5d 2e 76 61 6c 75 65 2e 64 69 29 3b 0a 09 20 20  ].value.di);..  
6140: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e    }..}.    }.#en
6150: 64 69 66 0a 0a 20 20 20 20 65 78 69 74 28 28 61  dif..    exit((a
6160: 74 74 72 2e 6e 75 6d 5f 65 72 72 6f 72 73 20 3d  ttr.num_errors =
6170: 3d 20 30 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20  = 0) ? 0 : 1);. 
6180: 20 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a     /*NOTREACHED*
6190: 2f 0a 7d 0a                                      /.}.