home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #20 / NN_1992_20.iso / spool / comp / sources / unix / 265 < prev    next >
Encoding:
Text File  |  1992-09-08  |  92.4 KB  |  2,892 lines

  1. Newsgroups: comp.sources.unix
  2. Path: sparky!uunet!decwrl!deccrl!news.crl.dec.com!pa.dec.com!vixie
  3. From: klin@iat.uni-paderborn.de (Peter Klingebiel)
  4. Subject: v26i066: utree - screen oriented filesystem utility (V3.03b-um), Part03/08
  5. Message-ID: <1992Sep7.214849.26764@PA.dec.com>
  6. Originator: vixie@cognition.pa.dec.com
  7. Sender: unix-sources-moderator@pa.dec.com
  8. Organization: DEC Palo Alto
  9. Date: Mon, 7 Sep 92 21:48:49 GMT
  10. Approved: vixie@pa.dec.com
  11. Lines: 2879
  12.  
  13. Submitted-By: klin@iat.uni-paderborn.de (Peter Klingebiel)
  14. Posting-Number: Volume 26, Issue 66
  15. Archive-Name: utree/part03
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 3 (of 8)."
  24. # Contents:  src/defs.h src/echo.c src/edit.c src/hist.c src/keys.h
  25. #   src/list.h src/stat.c src/util.c src/vars.h
  26. # Wrapped by vixie@cognition.pa.dec.com on Mon Sep  7 14:39:54 1992
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'src/defs.h' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'src/defs.h'\"
  30. else
  31. echo shar: Extracting \"'src/defs.h'\" \(11179 characters\)
  32. sed "s/^X//" >'src/defs.h' <<'END_OF_FILE'
  33. X/*
  34. X *      DEFS.H
  35. X *      UTREE global definitions.
  36. X *      3.01-um klin, Tue Jun  4 14:16:55 1991
  37. X *              klin, Tue Oct 15 14:01:57 1991, Handling of symlinks changed
  38. X *              klin, Sat Oct 26 15:27:40 1991, Some additions
  39. X *      3.02-um klin, Fri Nov  1 10:43:31 1991, Screen layout changed
  40. X *              klin, Sun Nov 24 19:30:43 1991, Cd to current directory before
  41. X *                                              executing some commands
  42. X *      3.03-um klin, Sat Jan 11 19:53:57 1992, Generic list glist added
  43. X *                                              List definitions to list.h
  44. X *                                              Line editor extended
  45. X *              klin, Sat Feb 15 19:18:06 1992, Display attributes added
  46. X *                                              Partinioning of directory and
  47. X *                                              file windows on tree screen
  48. X *                                              changed
  49. X *              klin, Sun Feb 23 18:16:24 1992, Key handlings and key bindings
  50. X *                                              changed
  51. X *
  52. X *      Copyright (c) 1991/92 by Peter Klingebiel & UNIX Magazin Muenchen.
  53. X *      For copying and distribution information see the file COPYRIGHT.
  54. X */
  55. X#if     defined(_MAIN_) && !defined(lint)
  56. static char sccsid_defs[] = "@(#) utree 3.03-um (klin) Feb 23 1992 defs.h";
  57. X#endif  /* _MAIN_ && !lint */
  58. X
  59. X/*
  60. X *      Global and local include files.
  61. X */
  62. X
  63. X#include "conf.h"               /* Configurable definitions             */
  64. X#include "cmds.h"               /* System commands definitions          */
  65. X
  66. X#include <stdio.h>
  67. X#include <signal.h>
  68. X#include <sys/param.h>
  69. X#include <sys/types.h>
  70. X#include <sys/stat.h>
  71. X#include <sys/ioctl.h>
  72. X#include <ctype.h>
  73. X#include <fcntl.h>
  74. X#include <errno.h>
  75. X#include <setjmp.h>
  76. X#ifdef  BSD
  77. X# include <sgtty.h>
  78. X# include <sys/dir.h>
  79. X#else   /* SYSV */
  80. X# include <sys/sysmacros.h>
  81. X# include <termio.h>
  82. X# ifdef NODIRENT
  83. X#  include <sys/dir.h>
  84. X# else  /* !NODIRENT */
  85. X#  include <dirent.h>
  86. X# endif /* NODIRENT */
  87. X#endif  /* BSD */
  88. X#include <pwd.h>
  89. X#include <grp.h>
  90. X#include <time.h>
  91. X#include <varargs.h>
  92. X
  93. X#ifdef  NULL                    /* Reset the standard NULL definition   */
  94. X# undef NULL
  95. X#endif  /* NULL */
  96. X#define NULL    ((char *) 0)    /* The string NIL pointer               */
  97. X
  98. X#ifdef  NOWINCHG
  99. X# undef SIGWINCH
  100. X# undef TIOCGWINSZ
  101. X#endif  /* NOWINCHG */
  102. X
  103. X/*
  104. X *      Definitions for utree which should not be changed.
  105. X */
  106. X
  107. X/* Buffer size definitions to avoid too often alloc() and free()        */
  108. X#define NBUFSZ  1024            /* Filename buffer size                 */
  109. X#define NFILES  64              /* Filename vector size (= NBUFSZ/16)   */
  110. X#define NBUFINC 512             /* Filename buffer increment            */
  111. X#define NFILINC 32              /* Filename vector incr (= NBUFINC/16)  */
  112. X
  113. X/* Other global definitions                                             */
  114. X#ifndef MAXPATHLEN
  115. X# define NAMELEN 256            /* Max length of pathnames              */
  116. X#else   /* !MAXPATHLEN */
  117. X# define NAMELEN MAXPATHLEN
  118. X#endif  /* MAXPATHLEN */
  119. X#define FILELEN 256             /* Max input length of filenames        */
  120. X#define INPLEN  256             /* Often used input buffer length       */
  121. X#define PATLEN  256             /* Search pattern length                */
  122. X#define FNAMSZ  16              /* Max filename length on screen        */
  123. X#define FWINSZ  20              /* Filename width in window             */
  124. X#define USERCMD 10              /* # of user defined commands           */
  125. X#define MININD  3               /* Minimal tree indention               */
  126. X#define MAXIND  9               /* Maximal tree indention               */
  127. X#define MINFIL  1               /* Minimal number of file lines         */
  128. X#define MAXFIL  9               /* Maximal number of file lines         */
  129. X#define DEFFIL  3               /* Default number of file lines         */
  130. X#define VMODE0  0               /* Minimal video mode: no attributes    */
  131. X#define VMODE1  1               /* Middle video mode: reverse+underline */
  132. X#define VMODE2  2               /* Maximal video mode: all attributes   */
  133. X#define HLEVEL  9999            /* Huge number for tree level           */
  134. X#define EXECLEN (2*NAMELEN)     /* Command buffer length                */
  135. X#define HLMIN   6               /* Minimal size of history list         */
  136. X#define HLMAX   99              /* Maximal size of history list         */
  137. X#define HLDEF   22              /* Default size of history list         */
  138. X
  139. X/* Return values for many functions                                     */
  140. X#define RV_OK   IN_OK           /* Work is done         (See keys.h)    */
  141. X#define RV_NUL  IN_NUL          /* No input             (See keys.h)    */
  142. X#define RV_INT  IN_INT          /* Break                (See keys.h)    */
  143. X#define RV_END  IN_EOF          /* EOF                  (See keys.h)    */
  144. X#define RV_HLP  IN_HLP          /* Help requested       (See keys.h)    */
  145. X#define RV_NXT  IN_NXT          /* Next requested       (See keys.h)    */
  146. X#define RV_PRV  IN_PRV          /* Prev requested       (See keys.h)    */
  147. X#define RV_SIZ  IN_SIZ          /* Screen size changed  (See keys.h)    */
  148. X#define RV_DIR  -11             /* Change directory                     */
  149. X#define RV_RET  -12             /* Return from file menu                */
  150. X#define RV_ERR  -13             /* Memory error                         */
  151. X
  152. X/*
  153. X *      Generic list type for scrolling in lists.
  154. X *      Is a component in many other list types.
  155. X */
  156. typedef struct _glist {
  157. X  char *string;                 /*  General used string                 */
  158. X  struct _glist *prev;          /*  Previous element in list            */
  159. X  struct _glist *next;          /*  Next element in list                */
  160. X} glist;
  161. X
  162. X#define GNULL   ((glist *) 0)   /* The glist NIL pointer                */
  163. X
  164. X/*
  165. X *      Access to items of glist record is done with macros
  166. X *      to hide this record and for abbreviation.
  167. X */
  168. X
  169. X#define GNAME(p)        ((p)->string)
  170. X#define GPREV(p)        ((p)->prev)
  171. X#define GNEXT(p)        ((p)->next)
  172. X
  173. X#include "list.h"               /* Directory/file list definitions      */
  174. X#include "hist.h"               /* History list definitons              */
  175. X#include "vars.h"               /* Variable/command definitions         */
  176. X#include "help.h"               /* Help page definitions                */
  177. X#include "term.h"               /* Terminal/screen definitions          */
  178. X#include "keys.h"               /* Key definitions                      */
  179. X
  180. X/*
  181. X *      Screen update flags.
  182. X */
  183. X
  184. X#define SF_TREE  0x0001         /* Update tree/file window              */
  185. X#define SF_LIST  0x0002         /* Update current list entry            */
  186. X#define SF_LAST  0x0004         /* Update last list entry               */
  187. X#define SF_SEPL  0x0008         /* Update separator line                */
  188. X#define SF_HELP  0x0010         /* Update help line                     */
  189. X#define SF_ECHO  0x0020         /* Update echo line                     */
  190. X#define SF_MOVE  0x0040         /* Update cursor position               */
  191. X#define SF_FILE  0x0080         /* Update file window on tree screen    */
  192. X#define SF_PBAR  0x0100         /* Update position bar                  */
  193. X#define SF_FULL  0xffff         /* Full update                          */
  194. X
  195. X/*
  196. X *      Display attribute flags.
  197. X */
  198. X#define DA_NONE         0       /* No attributes                        */
  199. X#define DA_NORMAL       0       /* Reset to normal state                */
  200. X#define DA_REVERSE      1       /* Reverse                              */
  201. X#define DA_BOLD         2       /* Highlight                            */
  202. X#define DA_HALF         3       /* Hide                                 */
  203. X#define DA_ERROR        4       /* Error                                */
  204. X#define DA_MARK         5       /* Special mark in menu line            */
  205. X#define DA_BOLDREV      6       /* Reverse highlight                    */
  206. X#define DA_HALFREV      7       /* Reverse hide                         */
  207. X#define DA_BLINKREV     8       /* Reverse blink                        */
  208. X
  209. X/*
  210. X *      Some other useful definitions and macros.
  211. X */
  212. X
  213. X#define GLOBL
  214. X#define LOCAL   static
  215. X#define EXTRN   extern
  216. X#ifdef  lint                    /* Don't disturb lint !                 */
  217. X# define VOID   int
  218. X#else   /* !lint */
  219. X# define VOID   void
  220. X#endif  /* lint */
  221. X
  222. X#define EQU(s1, s2)     (strcmp(s1, s2) == 0)
  223. X#define CMP(s1, s2)     (strcmp(s1, s2))
  224. X
  225. X/* Get type of file pointed to by struct stat s                         */
  226. X#define STFMT(s)        ((s)->st_mode & S_IFMT)
  227. X
  228. X/* Check if file f is a directory                                       */
  229. X#define ISDIR(f, s)     ((*statfun)(f, &s) == 0 && STFMT(&s) == S_IFDIR)
  230. X
  231. X/* Check if file f is a block special file                              */
  232. X#define ISBLK(f, s)     ((*statfun)(f, &s) == 0 && STFMT(&s) == S_IFBLK)
  233. X
  234. X/* Line is not empty and not a comment                                  */
  235. X#define VALID(c)        ( !(c=='\0' || c=='\n' || c=='#' || c==' ' || c=='\t'))
  236. X
  237. X/* Can we change to directory p?                                        */
  238. X#define CANCD(p)        (access(p, 01) == 0)
  239. X
  240. X/* Can we scroll a window and are we allowed to do this?                */
  241. X#define CANSCROLL       (scrollcap && VARSET(V_TS))
  242. X
  243. X/*
  244. X *      External system variables.
  245. X */
  246. X
  247. XEXTRN int errno;                /* System error code number             */
  248. X
  249. X/*
  250. X *      Global variables declared in main.c.
  251. X */
  252. X
  253. X#ifndef _MAIN_
  254. XEXTRN char *prgname, *home;
  255. XEXTRN int helpline, echoline;
  256. XEXTRN int firstdline, lastdline, ndlines;
  257. XEXTRN int firstfline, lastfline, nflines, maxnflines;
  258. XEXTRN int firstline, lastline;
  259. XEXTRN int indent, maxindent;
  260. XEXTRN int videomode, videoattr, graphattr;
  261. XEXTRN int maxlevel;
  262. XEXTRN int filecount, dircount;
  263. XEXTRN int treeflag, fileflag;
  264. XEXTRN int buildflag, writeflag;
  265. XEXTRN int sortbytime;
  266. XEXTRN int hiddendirs;
  267. XEXTRN int sizechange;
  268. XEXTRN dlist *droot, *cdlist, *cwlist;
  269. XEXTRN int fperpage, fperline;
  270. XEXTRN char rootdir[];
  271. XEXTRN char fpattern[], gpattern[], tpattern[];
  272. XEXTRN char utreemenu[], ufilemenu[];
  273. XEXTRN int (*statfun)();
  274. X# ifdef BSD
  275. XEXTRN jmp_buf winchjump;
  276. XEXTRN int atread;
  277. X# endif /* BSD */
  278. XEXTRN char *who, *hitkey;
  279. X#endif  /* !_MAIN_ */
  280. X
  281. X/*
  282. X *      Declaration of library and internal utree functions.
  283. X */
  284. X
  285. X#ifdef  S_IFLNK
  286. XEXTRN int stat(), lstat();
  287. X#else   /* ! S_IFLNK */
  288. X# define lstat  stat
  289. XEXTRN int stat();
  290. X#endif  /* S_IFLNK */
  291. X
  292. X#ifdef  BSD
  293. X# define getcwd(p, n)    getwd(p)
  294. X# define strchr(s, c)    index(s, c)
  295. X# define strrchr(s, c)   rindex(s, c)
  296. X# define memset(s, c, n) bzero(s, n)
  297. XEXTRN char *index(), *rindex();
  298. XEXTRN DIR *opendir();
  299. XEXTRN struct direct *readdir();
  300. X#else   /* SYSV */
  301. X# ifdef NODIRENT
  302. X#  define DIR           FILE
  303. X#  define opendir(n)    fopen(n, "r")
  304. X#  define closedir(p)   fclose(p)
  305. X#  define rewinddir(p)  rewind(p)
  306. X# else  /* !NODIRENT */
  307. XEXTRN DIR *opendir();
  308. XEXTRN struct dirent *readdir();
  309. X# endif /* NODIRENT */
  310. XEXTRN char *strchr(), *strrchr();
  311. X#endif  /* BSD */
  312. XEXTRN char *strcpy(), *getenv(), *fgets(), *ctime();
  313. XEXTRN time_t time();
  314. X
  315. XEXTRN dlist *newdlist();
  316. XEXTRN char *ualloc(), *basename(), *pathname(), *fileaccess(), *strsav();
  317. X
  318. END_OF_FILE
  319. if test 11179 -ne `wc -c <'src/defs.h'`; then
  320.     echo shar: \"'src/defs.h'\" unpacked with wrong size!
  321. fi
  322. # end of 'src/defs.h'
  323. fi
  324. if test -f 'src/echo.c' -a "${1}" != "-c" ; then 
  325.   echo shar: Will not clobber existing file \"'src/echo.c'\"
  326. else
  327. echo shar: Extracting \"'src/echo.c'\" \(10086 characters\)
  328. sed "s/^X//" >'src/echo.c' <<'END_OF_FILE'
  329. X/*
  330. X *      ECHO.C
  331. X *      UTREE input and output routines.
  332. X *      3.01-um klin, Wed May  1 15:37:35 1991
  333. X *              klin, Sat Oct 26 15:30:11 1991, putfile() changed
  334. X *      3.02-um klin, Fri Nov  1 13:40:54 1991, putfile() changed
  335. X *              klin, Sun Nov 24 15:30:35 1991, Video attributes changed
  336. X *      3.03-um klin, Tue Feb 11 19:39:09 1992, Generic list glist added
  337. X *                                              getline() and putfxy() changed
  338. X *                                              printf() no more needed
  339. X *              klin, Sun Feb 23 17:14:20 1992, Key handling and key bindings
  340. X *                                              changed
  341. X *
  342. X *      Copyright (c) 1991/92 by Peter Klingebiel & UNIX Magazin Muenchen.
  343. X *      For copying and distribution information see the file COPYRIGHT.
  344. X */
  345. X#ifndef lint
  346. static char sccsid[] = "@(#) utree 3.03-um (klin) Feb 23 1992 echo.c";
  347. X#endif  /* !lint */
  348. X
  349. X#include "defs.h"
  350. X
  351. X/* ---- Local variables and definitions ------------------------------- */
  352. X
  353. X#ifdef  BUFSIZ
  354. X# define FBUFLEN BUFSIZ         /* Format buffer length                 */
  355. X#else   /* !BUFSIZ */
  356. X# define FBUFLEN 512
  357. X#endif  /* BUFSIZ */
  358. X
  359. LOCAL char helpbuf[FBUFLEN];    /* Help line buffer                     */
  360. LOCAL char echobuf[FBUFLEN];    /* Echo line buffer                     */
  361. X
  362. X/* ---- Functions and procedures -------------------------------------- */
  363. X
  364. X/* Switch graphical character on/off */
  365. GLOBL int setgraphic(f)
  366. X  register int f;
  367. X{
  368. X  if(graphcap && VARSET(V_GC)) {
  369. X    graphattr = f;
  370. X    return(1);
  371. X  }
  372. X  return(0);
  373. X
  374. X} /* setgraphic() */
  375. X
  376. X/* Set video attributes from display attribute f */
  377. GLOBL VOID setvideo(f)
  378. X  register int f;
  379. X{
  380. X  if(videomode > 0) {
  381. X    switch(f) {
  382. X      case DA_NORMAL:           /* Reset attributes */
  383. X       videoattr = VA_NORMAL;
  384. X       break;
  385. X      case DA_REVERSE:          /* Invert */
  386. X       videoattr = VA_REVERSE;
  387. X       break;
  388. X      case DA_BOLD:             /* Highlight */
  389. X       if(videomode > 1)
  390. X         videoattr = VA_BOLD;
  391. X       break;
  392. X      case DA_HALF:             /* Hide */
  393. X       if(videomode > 1)
  394. X         videoattr = VA_HALF;
  395. X       break;
  396. X      case DA_ERROR:            /* Error */
  397. X       if(videomode > 1)
  398. X         videoattr = VA_BOLD|VA_BLINK;
  399. X       break;
  400. X      case DA_MARK:             /* Menu mark */
  401. X       videoattr = videomode > 1 ? VA_BOLD|VA_REVERSE : VA_UNDERLINE|VA_REVERSE;
  402. X       break;
  403. X      case DA_BOLDREV:          /* Reverse hightlight */
  404. X       videoattr = videomode > 1 ? VA_BOLD|VA_REVERSE : VA_REVERSE;
  405. X       break;
  406. X      case DA_HALFREV:          /* Reverse hide */
  407. X       videoattr = videomode > 1 ? VA_HALF|VA_REVERSE : VA_REVERSE;
  408. X       break;
  409. X      case DA_BLINKREV:         /* Reverse blink */
  410. X       videoattr = videomode > 1 ? VA_BLINK|VA_REVERSE : VA_REVERSE;
  411. X       break;
  412. X      default:
  413. X       break;
  414. X    }
  415. X  }
  416. X  else
  417. X    videoattr = VA_NORMAL;
  418. X
  419. X} /* setvideo() */
  420. X
  421. X/* Write character c to column x at line y */
  422. GLOBL VOID putcxy(x, y, c)
  423. X  register int x, y, c;
  424. X{
  425. X  if(cursorxy(x, y))
  426. X    (void) putchar(c);
  427. X
  428. X} /* putcxy() */
  429. X
  430. X/* Write string s to column x at line y. Return new column position */
  431. GLOBL int putsxy(x, y, s)
  432. X  int x, y;
  433. X  register char *s;
  434. X{
  435. X  (void) cursorxy(x, y);
  436. X  while(*s && *s != '\n' && putchar(*s))
  437. X    ++s;
  438. X  cursorpos(&x, &y);
  439. X  return(x);
  440. X
  441. X} /* putsxy() */
  442. X
  443. X/* Write formatted to column x at line y */
  444. X#if     !defined(BSD) || defined(HASVSPRINTF)
  445. X/*VARARGS3*/
  446. GLOBL int putfxy(x, y, c, va_alist)
  447. X  register int x, y, c;
  448. X  va_dcl
  449. X{
  450. X  va_list ap;
  451. X  char buf[FBUFLEN];
  452. X  register char *fmt;
  453. X  register int n;
  454. X
  455. X  va_start(ap);
  456. X  fmt = va_arg(ap, char *);
  457. X  (void) vsprintf(buf, fmt, ap);
  458. X  va_end(ap);
  459. X#else   /* BSD && !HASVSPRINTF */
  460. X/*VARARGS4*/
  461. GLOBL int putfxy(x, y, c, fmt, p1, p2, p3, p4, p5, p6)
  462. X  int x, y, c;
  463. X  char *fmt, *p1, *p2, *p3, *p4, *p5, *p6;
  464. X{
  465. X  char buf[FBUFLEN];
  466. X  register int n;
  467. X
  468. X  (void) sprintf(buf, fmt, p1, p2, p3, p4, p5, p6);
  469. X#endif  /* !BSD || HASVSPRINTF */
  470. X  n = putsxy(x, y, buf);
  471. X  if(n < columns && c)
  472. X    clearline();
  473. X  return(n);
  474. X
  475. X} /* putfxy() */
  476. X
  477. X/* Write formatted to echoline, return new column position */
  478. X#if     !defined(BSD) || defined(HASVSPRINTF)
  479. X/*VARARGS0*/
  480. GLOBL int putecho(va_alist)
  481. X  va_dcl
  482. X{
  483. X  va_list ap;
  484. X  register char *fmt;
  485. X  register int n;
  486. X
  487. X  va_start(ap);
  488. X  fmt = va_arg(ap, char *);
  489. X  (void) vsprintf(echobuf, fmt, ap);
  490. X  va_end(ap);
  491. X#else   /* BSD && !HASVSPRINTF */
  492. X/*VARARGS1*/
  493. GLOBL int putecho(fmt, p1, p2, p3, p4, p5, p6)
  494. X  char *fmt, *p1, *p2, *p3, *p4, *p5, *p6;
  495. X{
  496. X  register int n;
  497. X
  498. X  (void) sprintf(echobuf, fmt, p1, p2, p3, p4, p5, p6);
  499. X#endif  /* !BSD || HASVSPRINTF */
  500. X  if((n = putsxy(0, echoline, echobuf)) < columns) {
  501. X    (void) putchar(' ');
  502. X    ++n;
  503. X    clearline();
  504. X  }
  505. X  treeflag |= SF_ECHO;
  506. X  fileflag |= SF_ECHO;
  507. X  return(n);
  508. X
  509. X} /* putecho() */
  510. X
  511. X/* Write formatted to helpline */
  512. X#if     !defined(BSD) || defined(HASVSPRINTF)
  513. X/*VARARGS0*/
  514. GLOBL VOID puthelp(va_alist)
  515. X  va_dcl
  516. X{
  517. X  va_list ap;
  518. X  register char *fmt;
  519. X
  520. X  va_start(ap);
  521. X  fmt = va_arg(ap, char *);
  522. X  (void) vsprintf(helpbuf, fmt, ap);
  523. X  va_end(ap);
  524. X#else   /* BSD && !HASVSPRINTF */
  525. X/*VARARGS1*/
  526. GLOBL VOID puthelp(fmt, p1, p2, p3, p4, p5, p6)
  527. X  char *fmt, *p1, *p2, *p3, *p4, *p5, *p6;
  528. X{
  529. X  (void) sprintf(helpbuf, fmt, p1, p2, p3, p4, p5, p6);
  530. X#endif  /* !BSD || HASVSPRINTF */
  531. X  setvideo(DA_REVERSE);
  532. X  (void) putsxy(0, helpline, helpbuf);
  533. X  while(putchar(' '))
  534. X    ;
  535. X  setvideo(DA_NORMAL);
  536. X  treeflag |= SF_HELP;
  537. X  fileflag |= SF_HELP;
  538. X
  539. X} /* puthelp() */
  540. X
  541. X/* Write menu title t and commands line s to help line */
  542. GLOBL VOID putmenu(t, s)
  543. X  register char *t, *s;
  544. X{
  545. X  (void) cursorxy(0, helpline);
  546. X  setvideo(DA_REVERSE);
  547. X  while(*t && putchar(*t))      /* Title */
  548. X    ++t;
  549. X  while(*s && putchar(*s)) {    /* Menu line */
  550. X    if(*s == ' ' && *(s+1) && *(s+1) != ' ') {
  551. X      setvideo(DA_MARK);
  552. X      (void) putchar(*++s);
  553. X      setvideo(DA_REVERSE);
  554. X    }
  555. X    ++s;
  556. X  }
  557. X  while(putchar(' '))
  558. X    ;
  559. X  setvideo(DA_NORMAL);
  560. X  treeflag |= SF_HELP;
  561. X  fileflag |= SF_HELP;
  562. X
  563. X} /* putmenu() */
  564. X
  565. X/* Write filename and mode or tag flag */
  566. GLOBL VOID putfile(dp, f, fs)
  567. X  register dlist *dp;
  568. X  register int f, fs;
  569. X{
  570. X  register char *s;
  571. X  register int i;
  572. X
  573. X  /* File on file screen? */
  574. X  if(fs && FFROW(dp, f) >= firstline && FFROW(dp, f) <= lastline)
  575. X    (void) cursorxy(FFCOL(dp, f), FFROW(dp, f));
  576. X  /* Or file window on tree screen? */
  577. X  else if( !fs && FTROW(f) >= firstfline && FTROW(f) <= lastfline)
  578. X    (void) cursorxy(FTCOL(f), FTROW(f));
  579. X  /* Out of bounds */
  580. X  else
  581. X    return;
  582. X
  583. X  if(DNFIL(dp) > 0 && DFVEC(dp)) {
  584. X    if(ISTAG(dp, f) && setgraphic(GC_ON)) {
  585. X      (void) putchar(GC_TG);
  586. X      (void) setgraphic(GC_OFF);
  587. X    }
  588. X    else
  589. X      (void) putchar(FITAG(dp, f));
  590. X    /* Mark tagged or current file */
  591. X    if(fs) {
  592. X      if(fs == FF_MARK)
  593. X       setvideo(DA_BLINKREV);
  594. X      else if(f == DFCUR(dp))
  595. X       setvideo(DA_BOLDREV);
  596. X    }
  597. X    /* Write file mode and filename */
  598. X    (void) putchar(FMODE(dp, f));
  599. X    for(s = FFNAM(dp, f), i = 0; i < FNAMSZ && s[i]; i++)
  600. X      (void) putchar(s[i]);
  601. X    /* Cut off too long filenames */
  602. X    if(s[i])
  603. X      (void) putchar(s[i+1] ? '>' : s[i]);
  604. X    else
  605. X      while(i++ <= FNAMSZ && putchar(' '))
  606. X       ;
  607. X    if(fs)
  608. X      setvideo(DA_NORMAL);
  609. X  }
  610. X
  611. X} /* putfile() */
  612. X
  613. X/* Write message s to line l with videoattr v and get a key */
  614. X/*VARARGS1*/
  615. GLOBL int hitakey(s, l, v)
  616. X  register char *s;
  617. X  register int l, v;
  618. X{
  619. X  register int c;
  620. X
  621. X  if(s) {
  622. X    if(v)
  623. X      setvideo(v);
  624. X    if(l == echoline) {
  625. X      (void) putfxy(0, l, 1, "%s ", s);
  626. X      treeflag |= SF_ECHO;
  627. X      fileflag |= SF_ECHO;
  628. X    }
  629. X    else
  630. X      (void) putfxy(0, l, 1, " %s ", s);
  631. X    if(v)
  632. X      setvideo(DA_NORMAL);
  633. X  }
  634. X  cursorset(CF_VISIBLE);
  635. X  c = getkey();
  636. X  cursorset(CF_INVISIBLE);
  637. X  flushout();
  638. X  switch(c) {
  639. X    case K_BRK:                 /* Interrupt */
  640. X    case K_CANC:
  641. X      return(RV_INT);
  642. X    case K_SIZE:                /* Screen size changed */
  643. X      return(RV_SIZ);
  644. X    case K_EOF:                 /* EOF */
  645. X      return(RV_END);
  646. X    case K_SEL:                 /* CR or NL */
  647. X      return(K_SEL);
  648. X    default:                    /* Return lower character */
  649. X      return(isupper(c) ? tolower(c) : c);
  650. X  }
  651. X
  652. X} /* hitakey() */
  653. X
  654. X/* Write error message to echo line and get a key */
  655. GLOBL int errequest(fn, s)
  656. X  register char *fn, *s;
  657. X{
  658. X  bell(1);
  659. X  setvideo(DA_ERROR);
  660. X  (void) putecho("!! %s: %s", fn, s);
  661. X  setvideo(DA_NORMAL);
  662. X  return(hitakey(NULL));
  663. X
  664. X} /* errequest() */
  665. X
  666. X/* Read and edit a line */
  667. GLOBL int getline(buf, max, cur, hk, pre, rp, f)
  668. X  char *buf, *pre;
  669. X  register int max, cur, hk, f;
  670. X  glist *rp;
  671. X{
  672. X  char help[FBUFLEN], echo[FBUFLEN];
  673. X  int xmin, xpos;
  674. X  register int c;
  675. X
  676. X  (void) strcpy(help, helpbuf); /* Save current help and echo lines */
  677. X  (void) strcpy(echo, echobuf);
  678. X  xmin = xpos = 0;              /* Setup input buffer variables */
  679. X  if(pre)
  680. X    (void) strcpy(buf, pre);
  681. X  else
  682. X    buf[0] = '\0';
  683. X  while(1) {                    /* Edit line loop */
  684. X    cursorset(CF_VISIBLE);
  685. X    c = editline(buf, max, cur, &xmin, &xpos);
  686. X    cursorset(CF_INVISIBLE);
  687. X    flushout();
  688. X    switch(c) {
  689. X      case RV_HLP:              /* Help requested */
  690. X       if((c = showhelp(hk)) == RV_END)
  691. X         return(c);
  692. X       puthelp("%s", help);
  693. X       (void) putecho("%s", echo);
  694. X       break;
  695. X      case RV_PRV:              /* Previous in list */
  696. X       if(rp) {
  697. X         if(f)
  698. X           f = 0;
  699. X         else if(GPREV(rp))
  700. X           rp = GPREV(rp);
  701. X         else {
  702. X           while(GNEXT(rp))
  703. X             rp = GNEXT(rp);
  704. X           bell(1);
  705. X         }
  706. X         (void) strcpy(buf, GNAME(rp));
  707. X       }
  708. X       else
  709. X         bell(1);
  710. X       break;
  711. X      case RV_NXT:              /* Next in list */
  712. X       if(rp) {
  713. X         if(f)
  714. X           f = 0;
  715. X         else if(GNEXT(rp))
  716. X           rp = GNEXT(rp);
  717. X         else {
  718. X           while(GPREV(rp))
  719. X             rp = GPREV(rp);
  720. X           bell(1);
  721. X         }
  722. X         (void) strcpy(buf, GNAME(rp));
  723. X       }
  724. X       else
  725. X         bell(1);
  726. X       break;
  727. X      default:                  /* Others: return */
  728. X       return(c);
  729. X    }
  730. X  }
  731. X  /*NEVER REACHED*/
  732. X
  733. X} /* getline() */
  734. X
  735. END_OF_FILE
  736. if test 10086 -ne `wc -c <'src/echo.c'`; then
  737.     echo shar: \"'src/echo.c'\" unpacked with wrong size!
  738. fi
  739. # end of 'src/echo.c'
  740. fi
  741. if test -f 'src/edit.c' -a "${1}" != "-c" ; then 
  742.   echo shar: Will not clobber existing file \"'src/edit.c'\"
  743. else
  744. echo shar: Extracting \"'src/edit.c'\" \(8769 characters\)
  745. sed "s/^X//" >'src/edit.c' <<'END_OF_FILE'
  746. X/*
  747. X *      EDIT.C
  748. X *      UTREE simple line editor.
  749. X *      3.01-um klin, Wed May  1 16:13:20 1991
  750. X *      3.02-um klin, Sun Nov 24 15:28:27 1991, Video attributes changed
  751. X *      3.03-um klin, Tue Feb 11 19:39:09 1992, Line editor changed
  752. X *              klin, Sun Feb 23 17:15:13 1992, Key handling and key bindings
  753. X *                                              changed
  754. X *            b klin, Thu Mar 19 10:34:41 1992, Bug in editline() fixed
  755. X *
  756. X *      Copyright (c) 1991/92 by Peter Klingebiel & UNIX Magazin Muenchen.
  757. X *      For copying and distribution information see the file COPYRIGHT.
  758. X */
  759. X#ifndef lint
  760. static char sccsid[] = "@(#) utree 3.03b-um (klin) Mar 19 1992 edit.c";
  761. X#endif  /* !lint */
  762. X
  763. X#include "defs.h"
  764. X
  765. X/* ---- Local variables and definitions ------------------------------- */
  766. X
  767. LOCAL char *line;                       /* Line buffer                  */
  768. LOCAL int pos, len, xpos;               /* Lines position and length    */
  769. LOCAL int size, xmin, xmax, xdiff;      /* Window variables             */
  770. LOCAL int omode = 1;                    /* Insert/overwrite mode flag   */
  771. X
  772. X/* ---- Local/global functions and procedures ------------------------- */
  773. X
  774. X/*
  775. X *      INTERNAL USED ROUTINES
  776. X */
  777. X
  778. X/* Update/show line */
  779. LOCAL VOID putline(from, to, clear)
  780. X  register int from, to, clear;
  781. X{
  782. X  register int i;
  783. X
  784. X  for(i = from; line[i] && i < to && i <= xmax; i++)
  785. X    (void) putchar(line[i]);
  786. X  if(clear && i < xmax)
  787. X    clearline();
  788. X  (void) cursorxy(xpos + pos - xmin, echoline);
  789. X
  790. X} /* putline() */
  791. X
  792. X/* Scroll forward line */
  793. LOCAL VOID scrollforw(to)
  794. X  register int to;
  795. X{
  796. X  xmin += xdiff;
  797. X  xmax += xdiff;
  798. X  if(to) {
  799. X    (void) cursorxy(xpos, echoline);
  800. X    putline(xmin, to, 1);
  801. X  }
  802. X
  803. X} /* scrollforw() */
  804. X
  805. X/* Scroll backward line */
  806. LOCAL VOID scrollback(to)
  807. X  register int to;
  808. X{
  809. X  xmin -= xdiff;
  810. X  xmax -= xdiff;
  811. X  if(to) {
  812. X    (void) cursorxy(xpos, echoline);
  813. X    putline(xmin, to, 0);
  814. X  }
  815. X
  816. X} /* scrollback() */
  817. X
  818. X/* Move cursor one character forward */
  819. LOCAL VOID charforw()
  820. X{
  821. X  if(xmax < len && pos == xmax)
  822. X    scrollforw(len);
  823. X  (void) putchar(line[pos++]);
  824. X
  825. X} /* charforw() */
  826. X
  827. X/* Move cursor one character backward */
  828. LOCAL VOID charback()
  829. X{
  830. X  if(xmin > 0 && pos == xmin)
  831. X    scrollback(len);
  832. X  --pos;
  833. X  backspace();
  834. X
  835. X} /* charback() */
  836. X
  837. X/* Show insert/overwrite mode setting at end of helpline */
  838. LOCAL VOID showmode()
  839. X{
  840. X  setvideo(DA_REVERSE);
  841. X  (void) putsxy(-11, helpline, omode ? "[OVERWRITE]" : "   [INSERT]");
  842. X  setvideo(DA_NORMAL);
  843. X  (void) cursorxy(xpos + pos - xmin, echoline);
  844. X
  845. X} /* showmode() */
  846. X
  847. X/*
  848. X *      LINE EDITOR
  849. X*/
  850. X
  851. X/* Read and edit a line */
  852. GLOBL int editline(buf, max, cur, xm, xp)
  853. X  char *buf;
  854. X  register int max, cur;
  855. X  register int *xm, *xp;
  856. X{
  857. X  register int rv, maxc, mark, c, oc, i, j;
  858. X
  859. X  /* Adjust to at least 32 columns window size */
  860. X  if((columns - cur) < 32) {
  861. X    xpos = columns - 32;
  862. X    (void) cursorxy(xpos-2, echoline);
  863. X    clearline();
  864. X    (void) putchar(':');
  865. X    (void) putchar(' ');
  866. X    flushout();
  867. X  }
  868. X  else
  869. X    xpos = cur;
  870. X
  871. X  /* Calculate window sizes for scrolling */
  872. X  maxc = columns - xpos;
  873. X  size = max < maxc ? max : maxc;
  874. X  --max;
  875. X  --size;
  876. X
  877. X  /* Calculate scrolling sizes */
  878. X  xdiff = size / 4;
  879. X  xmin = *xm;
  880. X  xmax = xmin + size;
  881. X
  882. X  /* Setup input buffer variables */
  883. X  line = buf;
  884. X  pos  = *xp;
  885. X  len  = strlen(buf);
  886. X  mark = 0;
  887. X  rv   = IN_OK + 99;
  888. X
  889. X  /* Set up mode string */
  890. X  showmode();
  891. X
  892. X  /* Display input buffer if not empty */
  893. X  if(len > 0) {
  894. X    (void) cursorxy(xpos, echoline);
  895. X    putline(xmin, xmax, 1);
  896. X  }
  897. X
  898. X  /* Line editor loop */
  899. X  do {
  900. X    switch(c = getkey()){
  901. X      case K_EOF:               /* EOF */
  902. X       line[0] = '\0';
  903. X       rv = IN_EOF;
  904. X       break;
  905. X      case K_BRK:               /* Interrupt */
  906. X       line[0] = '\0';
  907. X       rv = IN_INT;
  908. X       break;
  909. X      case K_SIZE:              /* Screen size changed */
  910. X       line[0] = '\0';
  911. X       rv = IN_SIZ;
  912. X       break;
  913. X      case K_HELP:              /* Help */
  914. X       line[len] = '\0';
  915. X       rv = IN_HLP;
  916. X       break;
  917. X      case K_PREV:              /* Previous */
  918. X       line[len] = '\0';
  919. X       rv = IN_PRV;
  920. X       break;
  921. X      case K_NEXT:              /* Next */
  922. X       line[len] = '\0';
  923. X       rv = IN_NXT;
  924. X       break;
  925. X      case K_SEL:               /* End edit and accept line */
  926. X       while(len > 0 && line[len-1] <= ' ')
  927. X         line[--len] = '\0';
  928. X       if(line[0] == ' ') {
  929. X         for(i = 0; line[i] && line[i] == ' '; i++)
  930. X           --len;
  931. X         for(j = 0; j <= len; j++, i++)
  932. X           line[j] = line[i];
  933. X       }
  934. X       rv = len > 0 ? IN_OK : IN_NUL;
  935. X       break;
  936. X      case K_INS:               /* Switch insert/overwrite mode */
  937. X       omode = !omode;
  938. X       showmode();
  939. X       break;
  940. X      case K_CANC:              /* Cancel line */
  941. X       len = pos = 0;
  942. X       line[len] = '\0';
  943. X       xmin = 0;
  944. X       xmax = size;
  945. X       mark = 0;
  946. X      case K_REFR:              /* Refresh line */
  947. X       (void) cursorxy(xpos, echoline);
  948. X       putline(xmin, xmax, 1);
  949. X       break;
  950. X      case K_KILL:              /* Kill rest of line */
  951. X       line[len = pos] = '\0';
  952. X       clearline();
  953. X       mark = 0;
  954. X       break;
  955. X      case K_MARK:              /* Set mark */
  956. X       mark = pos;
  957. X       break;
  958. X      case K_GOTO:              /* Goto mark */
  959. X       i = mark;
  960. X       mark = pos;
  961. X       if(pos < i)
  962. X         while(pos < len && pos < i)
  963. X           charforw();
  964. X       else if(pos > i)
  965. X         while(pos > 0 && pos > i)
  966. X           charback();
  967. X       break;
  968. X      case K_TAG:               /* Transpose characters */
  969. X       if(pos > 0 && pos < len) {
  970. X         oc = buf[pos];
  971. X         buf[pos] = buf[pos-1];
  972. X         buf[pos-1] = oc;
  973. X         charback();
  974. X         charforw();
  975. X         charforw();
  976. X       }
  977. X       break;
  978. X      case K_FORW:              /* Cursor forward */
  979. X       if(pos < len)
  980. X         charforw();
  981. X       break;
  982. X      case K_BACK:              /* Cursor backward */
  983. X       if(pos > 0)
  984. X         charback();
  985. X       break;
  986. X      case K_HOME:              /* Cursor to beginning of line */
  987. X       mark = pos;
  988. X       if(pos > 0) {
  989. X         pos = 0;
  990. X         (void) cursorxy(xpos, echoline);
  991. X         if(xmin > 0) {
  992. X           xmin = 0;
  993. X           xmax = size;
  994. X           putline(pos, len, 1);
  995. X         }
  996. X       }
  997. X       break;
  998. X      case K_END:               /* Cursor to end of line */
  999. X       mark = pos;
  1000. X       if(pos < len) {
  1001. X         pos = len;
  1002. X         if(xmax > len)
  1003. X           (void) cursorxy(xpos + pos - xmin, echoline);
  1004. X         else {
  1005. X           do {
  1006. X             xmin += xdiff;
  1007. X             xmax += xdiff;
  1008. X           } while(xmax < len);
  1009. X           (void) cursorxy(xpos, echoline);
  1010. X           putline(xmin, len, 1);
  1011. X         }
  1012. X       }
  1013. X       break;
  1014. X      case K_NPAG:              /* Scroll line forward */
  1015. X       if(xmax < len) {
  1016. X         if((pos - xdiff) < (xmin + xdiff))
  1017. X           pos += xdiff;
  1018. X         scrollforw(len);
  1019. X       }
  1020. X       else
  1021. X         for(i = 0; pos < len && i < xdiff; i++)
  1022. X           charforw();
  1023. X       break;
  1024. X      case K_PPAG:              /* Scroll line backward */
  1025. X       if(xmin > 0) {
  1026. X         if((pos + xdiff) > (xmax - xdiff))
  1027. X           pos -= xdiff;
  1028. X         scrollback(len);
  1029. X       }
  1030. X       else
  1031. X         for(i = 0; pos > 0 && i < xdiff; i++)
  1032. X           charback();
  1033. X       break;
  1034. X      case K_DEL:               /* Delete char left from cursor */
  1035. X       if(pos <= 0)
  1036. X         break;
  1037. X       --pos;
  1038. X       if(xmin > 0 && pos == xmin)
  1039. X         scrollback(pos);
  1040. X       else
  1041. X         backspace();
  1042. X      case K_DOWN:              /* Delete character under cursor */
  1043. X       if(pos == len || len == 0)
  1044. X         break;
  1045. X       --len;
  1046. X       for(i = pos; i < len; i++)
  1047. X         line[i] = line[i+1];
  1048. X       line[len] = '\0';
  1049. X       if(xmax < len || !deletechar())
  1050. X         putline(pos, len, 1);
  1051. X     break;
  1052. X      case K_UP:                /* Not handled symbols */
  1053. X      case K_STR:
  1054. X      case K_INV:
  1055. X       bell(1);
  1056. X       break;
  1057. X      default:                  /* Insert character */
  1058. X       if( !(len < max && isprint(c))) {
  1059. X         bell(1);
  1060. X         break;
  1061. X       }
  1062. X       if(pos == len || omode) {
  1063. X         if(pos == xmax)
  1064. X           scrollforw(len);
  1065. X         line[pos] = c;
  1066. X         (void) putchar(c);
  1067. X         if(pos == len)
  1068. X           buf[++len] = '\0';
  1069. X         ++pos;
  1070. X       }
  1071. X       else {
  1072. X         for(i = pos; i <= len; i++) {
  1073. X           oc = line[i];
  1074. X           line[i] = c;
  1075. X           c = oc;
  1076. X         }
  1077. X         line[++len] = '\0';
  1078. X         if(pos == xmax) {
  1079. X           scrollforw(len);
  1080. X           (void) putchar(line[pos++]);
  1081. X         }
  1082. X         else if(insertchar())
  1083. X           (void) putchar(line[pos++]);
  1084. X         else {
  1085. X           (void) putchar(line[pos++]);
  1086. X           putline(pos, len, 1);
  1087. X         }
  1088. X       }
  1089. X       break;
  1090. X    }
  1091. X  } while(rv > IN_OK);
  1092. X
  1093. X  *xm = xmin;
  1094. X  *xp = pos;
  1095. X  return(rv);
  1096. X
  1097. X} /* editline() */
  1098. X
  1099. END_OF_FILE
  1100. if test 8769 -ne `wc -c <'src/edit.c'`; then
  1101.     echo shar: \"'src/edit.c'\" unpacked with wrong size!
  1102. fi
  1103. # end of 'src/edit.c'
  1104. fi
  1105. if test -f 'src/hist.c' -a "${1}" != "-c" ; then 
  1106.   echo shar: Will not clobber existing file \"'src/hist.c'\"
  1107. else
  1108. echo shar: Extracting \"'src/hist.c'\" \(11853 characters\)
  1109. sed "s/^X//" >'src/hist.c' <<'END_OF_FILE'
  1110. X/*
  1111. X *      HIST.C
  1112. X *      UTREE shell escape, shell execution and command history.
  1113. X *      3.03-um klin, Tue Feb 11 22:35:55 1992, Derived from comm.c and
  1114. X *                                              shell command history added
  1115. X *              klin, Sat Feb 15 14:44:52 1992, Video handling changed
  1116. X *              klin, Sun Feb 23 18:45:19 1992, Keybindings and variable
  1117. X *                                              AUTOSAVE added
  1118. X *              klin, Fri Mar  6 07:24:57 1992, Minor changes
  1119. X *            a klin, Sun Mar 15 19:08:25 1992, Search in history list added
  1120. X *
  1121. X *      Copyright (c) 1991/92 by Peter Klingebiel & UNIX Magazin Muenchen.
  1122. X *      For copying and distribution information see the file COPYRIGHT.
  1123. X */
  1124. X#ifndef lint
  1125. static char sccsid[] = "@(#) utree 3.03a-um (klin) Mar 15 1992 hist.c";
  1126. X#endif  /* !lint */
  1127. X
  1128. X#include "defs.h"
  1129. X
  1130. X/* ---- Local variables and definitions ------------------------------- */
  1131. X
  1132. LOCAL jmp_buf intrjump;         /* Buffer for longjump                  */
  1133. LOCAL clist *chcurr = CHNULL;   /* Current entry in history list        */
  1134. LOCAL int chsiz = 0;            /* Size of history list                 */
  1135. LOCAL int chmax = HLDEF;        /* Max size of history list             */
  1136. LOCAL int chnum = 0;            /* Event number                         */
  1137. LOCAL int hlchg = 0;            /* History list changed                 */
  1138. X
  1139. X/* ---- External variables and functions ------------------------------ */
  1140. X
  1141. XEXTRN char *getversion();
  1142. X
  1143. X/* ---- Functions and procedures -------------------------------------- */
  1144. X
  1145. X/*
  1146. X *      INTERNAL USED ROUTINES
  1147. X */
  1148. X
  1149. X/* Catch signals SIGINT and SIGQUIT */
  1150. LOCAL int oninterrupt()
  1151. X{
  1152. X  (void) signal(SIGINT,  SIG_IGN);
  1153. X  (void) signal(SIGQUIT, SIG_IGN);
  1154. X  longjmp(intrjump, RV_INT);
  1155. X  /*NOTREACHED*/
  1156. X
  1157. X} /* oninterrupt() */
  1158. X
  1159. X/* Insert command cmd into history list */
  1160. LOCAL clist *inserthistory(cmd, f)
  1161. X  register char *cmd;
  1162. X  register int f;
  1163. X{
  1164. X  register clist *cp, *p;
  1165. X
  1166. X  /* Check if command is already in history list */
  1167. X  if(cp = chcurr) {
  1168. X    do {
  1169. X      if(EQU(cmd, CHCMD(cp))) {
  1170. X       ++CHCNT(cp);
  1171. X       if(cp != chcurr) {
  1172. X         p = (clist *) CHPRV(cp);
  1173. X         CHNXT(p) = CHNXT(cp);
  1174. X         p = (clist *) CHNXT(cp);
  1175. X         CHPRV(p) = CHPRV(cp);
  1176. X         p = (clist *) CHNXT(chcurr);
  1177. X         CHPRV(p) = CHNXT(chcurr) = (glist *) cp;
  1178. X         CHPRV(cp) = (glist *) chcurr;
  1179. X         CHNXT(cp) = (glist *) p;
  1180. X         chcurr = cp;
  1181. X       }
  1182. X       return(cp);
  1183. X      }
  1184. X      cp = (clist *) CHNXT(cp);
  1185. X    } while(cp != chcurr);
  1186. X  }
  1187. X
  1188. X  /* Create root of history list */
  1189. X  if(chsiz == 0) {
  1190. X    chcurr = (clist *) ualloc(1, sizeof(clist));
  1191. X    CHCMD(chcurr) = strsav(cmd);
  1192. X    CHLEN(chcurr) = strlen(cmd);
  1193. X    CHPRV(chcurr) = CHNXT(chcurr) = (glist *) chcurr;
  1194. X    CHNUM(chcurr) = ++chnum;
  1195. X    CHCNT(chcurr) = f ? 1 : 0;
  1196. X    ++chsiz;
  1197. X  }
  1198. X  /* Create new entry in history list */
  1199. X  else if(chsiz < chmax) {
  1200. X    cp = (clist *) ualloc(1, sizeof(clist));
  1201. X    CHCMD(cp) = strsav(cmd);
  1202. X    CHLEN(cp) = strlen(cmd);
  1203. X    CHNUM(cp) = ++chnum;
  1204. X    CHCNT(cp) = f ? 1 : 0;
  1205. X    CHPRV(cp) = (glist *) chcurr;
  1206. X    CHNXT(cp) = CHNXT(chcurr);
  1207. X    p = (clist *) CHNXT(chcurr);
  1208. X    CHPRV(p) = (glist *) cp;
  1209. X    CHNXT(chcurr) = (glist *) cp;
  1210. X    chcurr = cp;
  1211. X    ++chsiz;
  1212. X  }
  1213. X  /* Overwrite existing entry = the next in the chain */
  1214. X  else {
  1215. X    chcurr = (clist *) CHNXT(chcurr);
  1216. X    if(CHLEN(chcurr) < strlen(cmd)) {
  1217. X      ufree(CHCMD(chcurr));
  1218. X      CHCMD(chcurr) = strsav(cmd);
  1219. X      CHLEN(chcurr) = strlen(cmd);
  1220. X    }
  1221. X    else
  1222. X      (void) strcpy(CHCMD(chcurr), cmd);
  1223. X    CHNUM(chcurr) = ++chnum;
  1224. X    CHCNT(chcurr) = f ? 1 : 0;
  1225. X  }
  1226. X
  1227. X  /* Update changed flag and return */
  1228. X  if(f)
  1229. X    hlchg = 1;
  1230. X  return(chcurr);
  1231. X
  1232. X} /* inserthistory() */
  1233. X
  1234. X/* Display history list */
  1235. LOCAL int showhistory()
  1236. X{
  1237. X  register clist *cp;
  1238. X  register int l, c, n;
  1239. X
  1240. X  l = firstline;
  1241. X  c = RV_OK;
  1242. X  clearwindow(firstline, lastline);
  1243. X  cp = chcurr;
  1244. X  do {
  1245. X    n = putfxy(0, l, 0, "%-6d %s", CHNUM(cp), CHCMD(cp));
  1246. X    (void) putfxy(n > columns/2 ? n : columns/2, l, 0, "#%d", CHCNT(cp));
  1247. X    cp = (clist *) CHNXT(cp);
  1248. X    if(++l > lastline && cp != chcurr) {
  1249. X      puthelp("COMMAND HISTORY (CR:continue  Q:quit  ELSE:give command)");
  1250. X      c = hitakey("More commands ?", echoline, DA_NONE);
  1251. X      if( !(c == ' ' || c == '\n'))
  1252. X       break;
  1253. X      clearwindow(firstline, lastline);
  1254. X      l = firstline;
  1255. X    }
  1256. X  } while(cp != chcurr);
  1257. X
  1258. X  treeflag = fileflag = SF_FULL;
  1259. X  return(c);
  1260. X
  1261. X} /* showhistory() */
  1262. X
  1263. X/* Execute a shell command */
  1264. LOCAL int callcommand(w)
  1265. X  register int w;
  1266. X{
  1267. X  char buf[EXECLEN];
  1268. X  register clist *cp;
  1269. X  register int c, rv, f;
  1270. X
  1271. X  who = "SHELL";
  1272. X  if(chcurr)
  1273. X    puthelp("%s: Give command line or select from history (CR:quit)", who);
  1274. X  else
  1275. X    puthelp("%s: Give command line (CR:quit)", who);
  1276. X  /* Get command loop. Handle command given by history number */
  1277. X  f = 1;
  1278. X  buf[0] = '\0';
  1279. X  while(1) {
  1280. X    c = putecho("Command:");
  1281. X    c = getline(buf, sizeof(buf), c, 'l', buf, chcurr ? CHLST(chcurr) : GNULL, f);
  1282. X    if(c == RV_OK && buf[0] == '!') {
  1283. X      if(cp = chcurr) {
  1284. X     if(buf[1] == '!' && chcurr) {                   /* Recall last command */
  1285. X       (void) strcpy(buf, CHCMD(chcurr));
  1286. X       continue;
  1287. X     }
  1288. X     else if(buf[1] >= '1' && buf[1] <= '9') {       /* Search for number */
  1289. X       c = atoi(&buf[1]);
  1290. X       do {
  1291. X         if(CHNUM(cp) == c) {                        /* Found */
  1292. X           (void) strcpy(buf, CHCMD(cp));
  1293. X           chcurr = cp;
  1294. X           f = 0;
  1295. X           break;
  1296. X         }
  1297. X         cp = (clist *) CHNXT(cp);
  1298. X       } while(cp != chcurr);
  1299. X       continue;
  1300. X     }
  1301. X     else {                                          /* Search for string */
  1302. X       (void) strcat(buf, "*");
  1303. X       do {
  1304. X         if(match(CHCMD(cp), &buf[1])) {             /* Found */
  1305. X           (void) strcpy(buf, CHCMD(cp));
  1306. X           chcurr = cp;
  1307. X           f = 0;
  1308. X           break;
  1309. X         }
  1310. X         cp = (clist *) CHNXT(cp);
  1311. X       } while(cp != chcurr);
  1312. X       continue;
  1313. X     }
  1314. X      }
  1315. X      continue;
  1316. X    }
  1317. X    else
  1318. X      break;
  1319. X  }
  1320. X
  1321. X  /* Command given: insert into history list and execute */
  1322. X  if(c == RV_OK) {
  1323. X    cp = inserthistory(buf, 1);
  1324. X    if(strchr(buf, '%')) {
  1325. X      c = userformat(buf, CHCMD(cp), w, "SHELL");
  1326. X      if(c == RV_NUL) {
  1327. X       puthelp("%s %s", who, hitkey);
  1328. X       return(errequest("SHELL", "Bad format"));
  1329. X      }
  1330. X      else if(c != RV_OK)
  1331. X       return(c);
  1332. X    }
  1333. X    puthelp("%s: %s", who, buf);
  1334. X    rv = callsystem(buf, 1, 0);
  1335. X    treeflag = fileflag = SF_FULL;
  1336. X  }
  1337. X  else
  1338. X    return(c);
  1339. X
  1340. X  if(rv == RV_INT)
  1341. X    return(errequest("Shell escape", "Interrupted"));
  1342. X  return(hitakey("Return from shell (Hit a key)", lines-1, DA_REVERSE));
  1343. X
  1344. X} /* callcommand() */
  1345. X
  1346. X/* Call shell interactively */
  1347. LOCAL int callshell()
  1348. X{
  1349. X  register int pid, rpid;
  1350. X  int status;
  1351. X
  1352. X  /* Ignore signals SIGINT and SIGQUIT */
  1353. X  (void) signal(SIGINT,  SIG_IGN);
  1354. X  (void) signal(SIGQUIT, SIG_IGN);
  1355. X  /* Clear screen and reset terminal to cooked mode */
  1356. X  clearscreen();
  1357. X  setvideo(DA_REVERSE);
  1358. X#define LINE \
  1359. X"SHELL ESCAPE: Hit \'EOF character\' or \'exit\' to return to utree"
  1360. X  bell(VARSET(V_BL));
  1361. X  (void) putsxy(0, 0, LINE);
  1362. X  while(putchar(' '))
  1363. X    ;
  1364. X#undef  LINE
  1365. X  setvideo(DA_NORMAL);
  1366. X  cursorset(CF_VISIBLE);
  1367. X  terminalreset(0);
  1368. X  /* Fork child process */
  1369. X#if     defined(BSD) || defined(HASVFORK)
  1370. X  if((pid = vfork()) < 0) {
  1371. X#else   /* SYSV && !HASVFORK */
  1372. X  if((pid = fork()) < 0) {
  1373. X#endif  /* BSD || HASVFORK */
  1374. X    (void) errequest(prgname, "Cannot fork");
  1375. X    status = 0;
  1376. X  }
  1377. X  /* Start the shell in child process */
  1378. X  else if(pid == 0) {
  1379. X    /* Reset signal interrupt and quit */
  1380. X    (void) signal(SIGINT,  SIG_DFL);
  1381. X    (void) signal(SIGQUIT, SIG_DFL);
  1382. X    /* Execute interactive shell */
  1383. X    (void) execlp(VARVAL(V_SH), VARVAL(V_SH), "-i", NULL);
  1384. X    _exit(1);
  1385. X  }
  1386. X  /* Parent: wait for return from shell */
  1387. X  else {
  1388. X    while((rpid = wait(&status)) != -1 && rpid != pid)
  1389. X      ;
  1390. X    status >>= 8;
  1391. X  }
  1392. X  /* Reset terminal to raw mode und set screen flags */
  1393. X  cursorset(CF_INVISIBLE);
  1394. X  terminalraw(0);
  1395. X  treeflag = fileflag = SF_FULL;
  1396. X
  1397. X  return(status);
  1398. X
  1399. X} /* callshell() */
  1400. X
  1401. X/*
  1402. X *      COMMON USED COMMAND EXECUTION
  1403. X */
  1404. X
  1405. X/* Execute a command, return exit code */
  1406. GLOBL int callsystem(cmd, c, s)
  1407. X  register char *cmd;
  1408. X  register int c, s;
  1409. X{
  1410. X  register int pid, rpid, rv;
  1411. X  int status;
  1412. X
  1413. X  if(c) {
  1414. X    /* Reset terminal to cooked mode */
  1415. X    if(s)
  1416. X      clearscreen();
  1417. X    else
  1418. X      clearwindow(helpline + 1, lines - 1);
  1419. X    cursorset(CF_VISIBLE);
  1420. X    terminalreset(0);
  1421. X  }
  1422. X  else
  1423. X    /* Turn on signal handling */
  1424. X    enablesignals();
  1425. X  flushout();
  1426. X  /* Fork child process */
  1427. X#if     defined(BSD) || defined(HASVFORK)
  1428. X  if((pid = vfork()) < 0) {
  1429. X#else   /* SYSV && !HASVFORK */
  1430. X  if((pid = fork()) < 0) {
  1431. X#endif  /* BSD || HASVFORK */
  1432. X    (void) errequest(prgname, "Cannot fork");
  1433. X    status = 0;
  1434. X  }
  1435. X  /* Child process */
  1436. X  else if(pid == 0) {
  1437. X    /* Reset signals interrupt and quit for child */
  1438. X    (void) signal(SIGINT,  SIG_DFL);
  1439. X    (void) signal(SIGQUIT, SIG_DFL);
  1440. X    if( !c) {
  1441. X      (void) close(0);          /* Close stdin  */
  1442. X      (void) close(1);          /*       stdout */
  1443. X      (void) close(2);          /*   and stderr */
  1444. X    }
  1445. X    /* Let the shell execute the command line */
  1446. X    (void) execlp(SHELL, SHELL, "-c", cmd, NULL);
  1447. X    _exit(1);
  1448. X  }
  1449. X  /* Parent: wait for termination of child */
  1450. X  else {
  1451. X    /* Set up here if an interrupt was catched */
  1452. X    if( !(rv = setjmp(intrjump))) {
  1453. X      /* Catch signals interrupt and quit */
  1454. X      (void) signal(SIGINT,  oninterrupt);
  1455. X      (void) signal(SIGQUIT, oninterrupt);
  1456. X    }
  1457. X    while((rpid = wait(&status)) != -1 && rpid != pid)
  1458. X      ;
  1459. X    if(rv != RV_INT)
  1460. X      rv = status >> 8 ? RV_NUL : RV_OK;
  1461. X  }
  1462. X  if(c) {
  1463. X    /* Set terminal to raw mode and set screen flags */
  1464. X    terminalraw(0);
  1465. X    treeflag = fileflag = SF_FULL;
  1466. X  }
  1467. X  else
  1468. X    /* Turn off signal handling */
  1469. X    disablesignals();
  1470. X
  1471. X  cursorset(CF_INVISIBLE);
  1472. X  flushout();
  1473. X  return(rv);
  1474. X
  1475. X} /* callsystem() */
  1476. X
  1477. X/*
  1478. X *      COMMAND HISTORY
  1479. X */
  1480. X
  1481. X/* Set size of history list */
  1482. GLOBL int sethistorysize(n)
  1483. X  register int n;
  1484. X{
  1485. X  static char buf[4];
  1486. X
  1487. X  if(n < HLMIN || n > HLMAX)
  1488. X    return(1);
  1489. X  chmax = n;
  1490. X  (void) sprintf(buf, "%d", n);
  1491. X  VARDEF(V_HS) = VARVAL(V_HS) = buf;
  1492. X  return(0);
  1493. X
  1494. X} /* sethistorysize() */
  1495. X
  1496. X/* Init history list */
  1497. GLOBL VOID inithistory()
  1498. X{
  1499. X#ifdef  UTHIST
  1500. X  char name[NAMELEN], cmd[INPLEN];
  1501. X  register FILE *fp;
  1502. X  register int l;
  1503. X
  1504. X  (void) strcpy(name, pathname(UTHIST, home));
  1505. X  if(fp = fopen(name, "r")) {
  1506. X    while(fgets(cmd, sizeof(cmd), fp)) {
  1507. X      if(VALID(cmd[0])) {
  1508. X       l = strlen(cmd) - 1;
  1509. X       if(cmd[l] == '\n')
  1510. X         cmd[l] = '\0';
  1511. X       (void) inserthistory(cmd, 0);
  1512. X      }
  1513. X    }
  1514. X    (void) fclose(fp);
  1515. X  }
  1516. X#endif  /* UTHIST */
  1517. X
  1518. X} /* inithistory() */
  1519. X
  1520. X/* Save history list to history file in $HOME */
  1521. GLOBL VOID savehistory()
  1522. X{
  1523. X#ifdef  UTHIST
  1524. X  char name[NAMELEN];
  1525. X  register FILE *fp;
  1526. X  register clist *cp;
  1527. X  time_t t;
  1528. X
  1529. X  if(VARVAL(V_AS) && chcurr && hlchg) {
  1530. X    (void) strcpy(name, pathname(UTHIST, home));
  1531. X    if(fp = fopen(name, "w")) {
  1532. X      t  = time((time_t *) 0);
  1533. X      (void) fprintf(fp, "# %s: ~/%s, %s", getversion(), UTHIST, ctime(&t));
  1534. X      cp = (clist *) CHNXT(chcurr);
  1535. X      do {
  1536. X       (void) fprintf(fp, "%s\n", CHCMD(cp));
  1537. X        cp = (clist *) CHNXT(cp);
  1538. X      } while(cp != (clist *) CHNXT(chcurr));
  1539. X      (void) fclose(fp);
  1540. X    }
  1541. X  }
  1542. X#endif  /* UTHIST */
  1543. X
  1544. X} /* savehistory() */
  1545. X
  1546. X/* Display history list, execute shell or command  */
  1547. GLOBL int history(c, w)
  1548. X  register int c, w;
  1549. X{
  1550. X  if(c == '$')                  /* Execute interactive shell */
  1551. X    return(callshell());
  1552. X
  1553. X  do {                          /* Sehll command loop */
  1554. X    if(chcurr) {                /* Display history list */
  1555. X      if((c = showhistory()) < RV_NUL || c == 'q')
  1556. X       break;
  1557. X    }
  1558. X    c = callcommand(w);         /* Execute command */
  1559. X  } while(c > RV_NUL);
  1560. X  return(c);
  1561. X
  1562. X} /* history() */
  1563. X
  1564. X
  1565. END_OF_FILE
  1566. if test 11853 -ne `wc -c <'src/hist.c'`; then
  1567.     echo shar: \"'src/hist.c'\" unpacked with wrong size!
  1568. fi
  1569. # end of 'src/hist.c'
  1570. fi
  1571. if test -f 'src/keys.h' -a "${1}" != "-c" ; then 
  1572.   echo shar: Will not clobber existing file \"'src/keys.h'\"
  1573. else
  1574. echo shar: Extracting \"'src/keys.h'\" \(7692 characters\)
  1575. sed "s/^X//" >'src/keys.h' <<'END_OF_FILE'
  1576. X/*
  1577. X *      KEYS.H
  1578. X *      UTREE key definitions.
  1579. X *      3.01-um klin, Sat Apr 20 11:02:33 1991
  1580. X *      3.02-um klin, Sun Nov 10 19:46:21 1991, Function key handling changed
  1581. X *              klin, Sun Nov 24 12:12:13 1991, Extensions for XENIX reported
  1582. X *                                              by Rolf Gebhardt (RG 11/22/91)
  1583. X *      3.03-um klin, Sat Feb 11 19:52:04 1992, Line editor extended
  1584. X *              klin, Sun Feb 23 17:34:01 1992, Key handling and key bindings
  1585. X *            a klin, Sun Mar 15 19:08:25 1992, Bug fix in handling 8 bit chars
  1586. X *
  1587. X *      Copyright (c) 1991/92 by Peter Klingebiel & UNIX Magazin Muenchen.
  1588. X *      For copying and distribution information see the file COPYRIGHT.
  1589. X */
  1590. X#if     defined(_MAIN_) && !defined(lint)
  1591. static char sccsid_keys[] = "@(#) utree 3.03a-um (klin) Mar 15 1992 keys.h";
  1592. X#endif  /* _MAIN_ && !lint */
  1593. X
  1594. X/*
  1595. X *      Return values from getline() and editline()
  1596. X */
  1597. X
  1598. X#define IN_OK   1               /* Input not empty and ok               */
  1599. X#define IN_NUL  0               /* Input empty                          */
  1600. X#define IN_INT  -1              /* Interrupt on input                   */
  1601. X#define IN_EOF  -2              /* EOF on input                         */
  1602. X#define IN_HLP  -3              /* Help key on input                    */
  1603. X#define IN_NXT  -4              /* Next key on input                    */
  1604. X#define IN_PRV  -5              /* Previous key on input                */
  1605. X#define IN_SIZ  -6              /* Screen size changed                  */
  1606. X
  1607. X/*
  1608. X *      Key symbols and initial bindings = return values from getkey()
  1609. X */
  1610. X
  1611. X#define K_SEL   0x000a          /* Select/accept line = NEWLINE         */
  1612. X#define K_FORW  0xff10          /* Forward character/file/directory     */
  1613. X#define K_BACK  0xff11          /* Backward character/file/directory    */
  1614. X#define K_NEXT  0xff12          /* Next listentry/file/directory        */
  1615. X#define K_PREV  0xff13          /* Previous listentry/file/directory    */
  1616. X#define K_NPAG  0xff14          /* Next page                            */
  1617. X#define K_PPAG  0xff15          /* Previous page                        */
  1618. X#define K_HOME  0xff16          /* Beginning line/files/directories     */
  1619. X#define K_END   0xff17          /* End line/files/directories           */
  1620. X#define K_UP    0xff18          /* Scroll up files/directories          */
  1621. X#define K_DOWN  0xff19          /* Scroll down or delete character      */
  1622. X#define K_INS   0xff20          /* Change to dir/toggle insert mode     */
  1623. X#define K_DEL   0xff21          /* Change to parent/delete char back    */
  1624. X#define K_KILL  0xff22          /* Kill line                            */
  1625. X#define K_MARK  0xff23          /* Set mark on line/file/directory      */
  1626. X#define K_GOTO  0xff24          /* Goto mark on line/file/directory     */
  1627. X#define K_TAG   0xff25          /* Goto tagged dir/file or transpose    */
  1628. X#define K_HELP  0xff26          /* Help                                 */
  1629. X#define K_REFR  0xff27          /* Refresh                              */
  1630. X#define K_CANC  0xff28          /* Cancel line                          */
  1631. X#define K_BRK   0xff29          /* Break command/line                   */
  1632. X#define K_EOF   0xff30          /* EOF                                  */
  1633. X#define K_STR   0xffe0          /* Insert string                        */
  1634. X#define K_INV   0xffff          /* Invalid symbol                       */
  1635. X#define K_SIZE  0xff            /* Screen size changed                  */
  1636. X
  1637. X/*
  1638. X *      All key symbol definitions are hold in an array of record type
  1639. X *      struct _kname to permit dynamic key bindings.
  1640. X */
  1641. X
  1642. typedef unsigned short ksym;    /* Type of key symbol                   */
  1643. typedef unsigned char kchar;    /* Type of key strings                  */
  1644. X#define UNULL   ((kchar *) 0)   /* The kchar NIL pointer                */
  1645. X
  1646. typedef struct _kname {
  1647. X  glist list;                   /* Contains key name and pointers       */
  1648. X  ksym  symbol;                 /* Key symbol (See definitions above)   */
  1649. X  char *comment;                /* Meaning of key                       */
  1650. X} kname;
  1651. X
  1652. X#ifdef  _MAIN_
  1653. kname keynames[] = {
  1654. X  { { "SELECT",   GNULL, GNULL }, K_SEL,  "Select/accept line" },
  1655. X  { { "FORWARD",  GNULL, GNULL }, K_FORW, "Forward character/file/directory" },
  1656. X  { { "BACKWARD", GNULL, GNULL }, K_BACK, "Backward character/file/directory" },
  1657. X  { { "NEXT",     GNULL, GNULL }, K_NEXT, "Next string/file/directory" },
  1658. X  { { "PREVIOUS", GNULL, GNULL }, K_PREV, "Previous string/file/directory" },
  1659. X  { { "NEXTPAGE", GNULL, GNULL }, K_NPAG, "Next page/scroll forward line" },
  1660. X  { { "PREVPAGE", GNULL, GNULL }, K_PPAG, "Previous page/scroll backward line" },
  1661. X  { { "BEGIN",    GNULL, GNULL }, K_HOME, "Beginning of line/files/directories" },
  1662. X  { { "END",      GNULL, GNULL }, K_END,  "End of line/files/directories" },
  1663. X  { { "UP",       GNULL, GNULL }, K_UP,   "Scroll up files/directories" },
  1664. X  { { "DOWN",     GNULL, GNULL }, K_DOWN, "Scroll down or delete character" },
  1665. X  { { "INSERT",   GNULL, GNULL }, K_INS,  "Change to dir/toggle insert mode" },
  1666. X  { { "DELETE",   GNULL, GNULL }, K_DEL,  "Change to parent/delete char backward" },
  1667. X  { { "KILL",     GNULL, GNULL }, K_KILL, "Kill input line", },
  1668. X  { { "SETMARK",  GNULL, GNULL }, K_MARK, "Set mark on line/file/directory" },
  1669. X  { { "GOTOMARK", GNULL, GNULL }, K_GOTO, "Goto mark on line/file/directory" },
  1670. X  { { "GOTOTAG",  GNULL, GNULL }, K_TAG,  "Goto tagged dir/file or transpose" },
  1671. X  { { "HELP",     GNULL, GNULL }, K_HELP, "Help" },
  1672. X  { { "REFRESH",  GNULL, GNULL }, K_REFR, "Refresh screen/input line" },
  1673. X  { { "CANCEL",   GNULL, GNULL }, K_CANC, "Delete input line" },
  1674. X  { { "BREAK",    GNULL, GNULL }, K_BRK,  "Break command/line" },
  1675. X  { { "EXIT",     GNULL, GNULL }, K_EOF,  "Exit" },
  1676. X  { { "\"",       GNULL, GNULL }, K_STR,  "Insert string" },
  1677. X  { { NULL } }                  /* End of entries                       */
  1678. X};
  1679. X#else   /* ! _MAIN_ */
  1680. extern kname keynames[];
  1681. X#endif  /* _MAIN_ */
  1682. X
  1683. X/*
  1684. X *      Access to entries in the keyname list is done with macros
  1685. X *      to hide this record and for abbreviation.
  1686. X */
  1687. X
  1688. X#define KNLST(n)        (&keynames[n].list)
  1689. X#define KNNAM(n)        (keynames[n].list.string)
  1690. X#define KNPRV(n)        (keynames[n].list.prev)
  1691. X#define KNNXT(n)        (keynames[n].list.next)
  1692. X#define KNSYM(n)        (keynames[n].symbol)
  1693. X#define KNCOM(n)        (keynames[n].comment)
  1694. X
  1695. X/*
  1696. X *      Key bindings are hold in a dynamically linked list of
  1697. X *      record type klist. The key binding and translation list
  1698. X *      is built up at startup time from default bindings and
  1699. X *      user defined bindings.
  1700. X */
  1701. X
  1702. typedef struct _klist {
  1703. X  glist list;                   /* Contains key name and pointers       */
  1704. X  kchar *string;                /* Key string                           */
  1705. X  ksym  symbol;                 /* Key symbol (See defines above)       */
  1706. X  char  *insert;                /* String to insert                     */
  1707. X  int   userdefined;            /* User defined binding                 */
  1708. X} klist;
  1709. X
  1710. X#define KNULL   ((klist *) 0)   /* The klist NIL pointer                */
  1711. X
  1712. X/*
  1713. X *      Acces to items of klist record is done with macros
  1714. X *      to hide this record and for abbreviation.
  1715. X */
  1716. X
  1717. X#define KBNAM(p)        ((p)->list.string)
  1718. X#define KBPRV(p)        ((p)->list.prev)
  1719. X#define KBNXT(p)        ((p)->list.next)
  1720. X#define KBSYM(p)        ((p)->symbol)
  1721. X#define KBSTR(p)        ((p)->string)
  1722. X#define KBINS(p)        ((p)->insert)
  1723. X#define KBUSR(p)        ((p)->userdefined)
  1724. X
  1725. X/* Special macro for key string comparison character per character      */
  1726. X#define KBCHR(p, n)     ((p)->string[n])
  1727. X
  1728. X#ifdef  _MAIN_
  1729. klist *kroot = KNULL;
  1730. X#else
  1731. extern klist *kroot;
  1732. X#endif  /* _MAIN_ */
  1733. X
  1734. END_OF_FILE
  1735. if test 7692 -ne `wc -c <'src/keys.h'`; then
  1736.     echo shar: \"'src/keys.h'\" unpacked with wrong size!
  1737. fi
  1738. # end of 'src/keys.h'
  1739. fi
  1740. if test -f 'src/list.h' -a "${1}" != "-c" ; then 
  1741.   echo shar: Will not clobber existing file \"'src/list.h'\"
  1742. else
  1743. echo shar: Extracting \"'src/list.h'\" \(7471 characters\)
  1744. sed "s/^X//" >'src/list.h' <<'END_OF_FILE'
  1745. X/*
  1746. X *      LIST.H
  1747. X *      UTREE tree and file list definitions.
  1748. X *      3.03-um klin, Sat Jan 11 19:53:57 1992, Splitted from defs.h
  1749. X *
  1750. X *      Copyright (c) 1991/92 by Peter Klingebiel & UNIX Magazin Muenchen.
  1751. X *      For copying and distribution information see the file COPYRIGHT.
  1752. X */
  1753. X#if     defined(_MAIN_) && !defined(lint)
  1754. static char sccsid_list[] = "@(#) utree 3.03-um (klin) Feb 11 1992 list.h";
  1755. X#endif  /* _MAIN_ && !lint */
  1756. X
  1757. X/*
  1758. X *      Files in a directory are hold in dynamically allocated array
  1759. X *      of a record type flist which is linked into directory type dlist.
  1760. X */
  1761. X
  1762. typedef struct _flist {
  1763. X  char *filename;               /*  File name                           */
  1764. X  time_t modtime;               /*  Modification time                   */
  1765. X  off_t filesize;               /*  File size                           */
  1766. X  char istagged;                /*  File is tagged                      */
  1767. X  char filemode;                /*  File modes                          */
  1768. X} flist;
  1769. X
  1770. X#define FNULL   ((flist *) 0)   /* The flist NIL pointer                */
  1771. X
  1772. X/*
  1773. X *      Directories are hold in a double linked list of a record type
  1774. X *      dlist which is built up at startup time or later at runtime.
  1775. X */
  1776. X
  1777. typedef struct _dlist {
  1778. X  glist list;                   /*  Containing pathname and pointers    */
  1779. X  char *filename;               /*  Directory basename                  */
  1780. X  flist *filevec;               /*  Pointer to flist entries            */
  1781. X  char *zoompattern;            /*  File zooming pattern                */
  1782. X  char *filebuf;                /*  Buffer of filenames                 */
  1783. X  unsigned bufsize;             /*  Size of filename buffer             */
  1784. X  int number;                   /*  Directory number                    */
  1785. X  int level;                    /*  Subdirectory level                  */
  1786. X  unsigned long treeinfo;       /*  Tree information flag               */
  1787. X  int nfils;                    /*  Number of files                     */
  1788. X  int ndirs;                    /*  Number of subdirectories            */
  1789. X  int ntags;                    /*  Number of tagged files              */
  1790. X  int curfile;                  /*  Current file in file list           */
  1791. X  int topfile;                  /*  First file on screen in file list   */
  1792. X  char cancd;                   /*  Can change to this directory        */
  1793. X  char flag;                    /*  Filelist flag                       */
  1794. X  char sort;                    /*  Sort criteria flag                  */
  1795. X  time_t modtime;               /*  Modification time of directory      */
  1796. X  time_t chgtime;               /*  Status change time of directory     */
  1797. X} dlist;
  1798. X
  1799. X#define DNULL   ((dlist *) 0)   /* The dlist NIL pointer                */
  1800. X
  1801. X/*
  1802. X *      Access to items of dlist record is done with macros
  1803. X *      to hide this record and for abbreviation.
  1804. X */
  1805. X
  1806. X#define DLIST(p)        (&(p)->list)
  1807. X#define DPNAM(p)        ((p)->list.string)
  1808. X#define DPREV(p)        ((p)->list.prev)
  1809. X#define DNEXT(p)        ((p)->list.next)
  1810. X#define DFNAM(p)        ((p)->filename)
  1811. X#define DFVEC(p)        ((p)->filevec)
  1812. X#define DZOOM(p)        ((p)->zoompattern)
  1813. X#define DFBUF(p)        ((p)->filebuf)
  1814. X#define DBSIZ(p)        ((p)->bufsize)
  1815. X#define DDNUM(p)        ((p)->number)
  1816. X#define DLEVL(p)        ((p)->level)
  1817. X#define DINFO(p)        ((p)->treeinfo)
  1818. X#define DNFIL(p)        ((p)->nfils)
  1819. X#define DNDIR(p)        ((p)->ndirs)
  1820. X#define DNTAG(p)        ((p)->ntags)
  1821. X#define DFCUR(p)        ((p)->curfile)
  1822. X#define DFTOP(p)        ((p)->topfile)
  1823. X#define DCANC(p)        ((p)->cancd)
  1824. X#define DFLAG(p)        ((p)->flag)
  1825. X#define DSORT(p)        ((p)->sort)
  1826. X#define DMTIM(p)        ((p)->modtime)
  1827. X#define DCTIM(p)        ((p)->chgtime)
  1828. X
  1829. X/*
  1830. X *      The same access macros as above for current directory entry.
  1831. X */
  1832. X
  1833. X#define CLIST           (&cdlist->list)
  1834. X#define CPNAM           (cdlist->list.string)
  1835. X#define CPREV           (cdlist->list.prev)
  1836. X#define CNEXT           (cdlist->list.next)
  1837. X#define CFNAM           (cdlist->filename)
  1838. X#define CFVEC           (cdlist->filevec)
  1839. X#define CZOOM           (cdlist->zoompattern)
  1840. X#define CFBUF           (cdlist->filebuf)
  1841. X#define CBSIZ           (cdlist->bufsize)
  1842. X#define CDNUM           (cdlist->number)
  1843. X#define CLEVL           (cdlist->level)
  1844. X#define CINFO           (cdlist->treeinfo)
  1845. X#define CNFIL           (cdlist->nfils)
  1846. X#define CNDIR           (cdlist->ndirs)
  1847. X#define CNTAG           (cdlist->ntags)
  1848. X#define CFCUR           (cdlist->curfile)
  1849. X#define CFTOP           (cdlist->topfile)
  1850. X#define CCANC           (cdlist->cancd)
  1851. X#define CFLAG           (cdlist->flag)
  1852. X#define CSORT           (cdlist->sort)
  1853. X#define CMTIM           (cdlist->modtime)
  1854. X#define CCTIM           (cdlist->chgtime)
  1855. X
  1856. X/* Compare modification and change time from dlist p with status s      */
  1857. X#define CHKTIM(p, s)    ((p)->modtime<st.st_mtime||(p)->chgtime<st.st_ctime)
  1858. X
  1859. X/* Column and row of directory p on directory tree screen               */
  1860. X#define DTCOL(p)        ((p)->level*indent)
  1861. X#define DTROW(p)        ((p)->number-tdlist->number+firstdline)
  1862. X
  1863. X/*
  1864. X *      Access to items of flist record is done with macros
  1865. X *      to hide this record and for abbreviation.
  1866. X */
  1867. X
  1868. X/* Access macros to flist items pointed to by flist ptr f               */
  1869. X#define FPFIL(f)        (f->filename)
  1870. X#define FPTIM(f)        (f->modtime)
  1871. X#define FPSIZ(f)        (f->filesize)
  1872. X#define FPTAG(f)        (f->istagged)
  1873. X#define FPMOD(f)        (f->filemode)
  1874. X
  1875. X/* Access macros to flist items in flist vector v with index n          */
  1876. X#define FVFIL(v, n)     (v[n].filename)
  1877. X#define FVTIM(v, n)     (v[n].modtime)
  1878. X#define FVSIZ(v, n)     (v[n].filesize)
  1879. X#define FVTAG(v, n)     (v[n].istagged)
  1880. X#define FVMOD(v, n)     (v[n].filemode)
  1881. X
  1882. X/* Access macros to flist with index n from directory pointed to by p   */
  1883. X#define FLIST(p, n)     (p->filevec[n])
  1884. X#define FFNAM(p, n)     (p->filevec[n].filename)
  1885. X#define FMTIM(p, n)     (p->filevec[n].modtime)
  1886. X#define FSIZE(p, n)     (p->filevec[n].filesize)
  1887. X#define FITAG(p, n)     (p->filevec[n].istagged)
  1888. X#define FMODE(p, n)     (p->filevec[n].filemode)
  1889. X
  1890. X/* Column and row of file n from directory p                            */
  1891. X#define FFCOL(p, n)     (((n-p->topfile)%fperline)*FWINSZ)
  1892. X#define FFROW(p, n)     ((n-p->topfile)/fperline+firstline)
  1893. X
  1894. X/* Column and row of file n in file window on tree screen               */
  1895. X#define FTCOL(n)        ((n%fperline)*FWINSZ)
  1896. X#define FTROW(n)        (n/fperline+firstfline)
  1897. X
  1898. X/* Values for directory list file list flag                             */
  1899. X#define FL_NUL  0x00            /* File list not read in                */
  1900. X#define FL_CHG  0x01            /* File list changed                    */
  1901. X#define FL_FIL  0x02            /* File list read in                    */
  1902. X
  1903. X/* Values for file mode and flags                                       */
  1904. X#define FF_NONE ' '             /* Ordinary file                        */
  1905. X#define FF_ERR  '?'             /* Can't stat file                      */
  1906. X#define FF_EXEC '*'             /* Executable                           */
  1907. X#define FF_DIR  '/'             /* Directory                            */
  1908. X#define FF_SLNK '@'             /* Symbolic link                        */
  1909. X#define FF_SOCK '='             /* Socket AF_UNIX                       */
  1910. X#define FF_TAG  '+'             /* File is tagged                       */
  1911. X#define FF_MARK '>'             /* Mark on file                         */
  1912. X
  1913. X#define ISTAG(p, n)     (FITAG(p, n)  == FF_TAG)
  1914. X
  1915. END_OF_FILE
  1916. if test 7471 -ne `wc -c <'src/list.h'`; then
  1917.     echo shar: \"'src/list.h'\" unpacked with wrong size!
  1918. fi
  1919. # end of 'src/list.h'
  1920. fi
  1921. if test -f 'src/stat.c' -a "${1}" != "-c" ; then 
  1922.   echo shar: Will not clobber existing file \"'src/stat.c'\"
  1923. else
  1924. echo shar: Extracting \"'src/stat.c'\" \(12422 characters\)
  1925. sed "s/^X//" >'src/stat.c' <<'END_OF_FILE'
  1926. X/*
  1927. X *      STAT.C
  1928. X *      UTREE file status functions.
  1929. X *      3.03-um klin, Tue Feb 11 22:47:06 1992, Splitted from comm.c
  1930. X *
  1931. X *      Copyright (c) 1991/92 Peter Klingebiel & UNIX Magazin Muenchen.
  1932. X *      For copying and distribution information see the file COPYRIGHT.
  1933. X */
  1934. X#ifndef lint
  1935. static char sccsid[] = "@(#) utree 3.03-um (klin) Feb 11 1992 stat.c";
  1936. X#endif  /* !lint */
  1937. X
  1938. X#include "defs.h"
  1939. X
  1940. X/* ---- Local variables and definitions ------------------------------- */
  1941. X
  1942. X#ifndef major           /* Major number part of a device */
  1943. X# define major(x)       ((x >> 8) & 0377)
  1944. X#endif  /* !major */
  1945. X#ifndef minor           /* Minor number part of a device */
  1946. X# define minor(x)       (x & 0377)
  1947. X#endif  /* !minor */
  1948. X
  1949. X/* ---- External variables and functions ------------------------------ */
  1950. X
  1951. XEXTRN struct passwd *getpwuid();
  1952. XEXTRN struct passwd *getpwnam();
  1953. XEXTRN struct group  *getgrgid();
  1954. XEXTRN struct group  *getgrnam();
  1955. XEXTRN char *readdname();
  1956. X
  1957. X/* ---- Functions and procedures -------------------------------------- */
  1958. X
  1959. X/*
  1960. X *      INTERNAL USED ROUTINES
  1961. X */
  1962. X
  1963. X/* Return device name for device with device number r from /dev */
  1964. LOCAL char *devicename(r)
  1965. X  dev_t r;
  1966. X{
  1967. X  static char pn[NAMELEN];
  1968. X  struct stat st;
  1969. X  register DIR *dp;
  1970. X  register char *fn;
  1971. X
  1972. X  if(dp = opendir("/dev")) {
  1973. X    (void) strcpy(pn, "/dev/");
  1974. X    /* Read in all valid entries in /dev */
  1975. X    while(fn = readdname(dp)) {
  1976. X      (void) strcpy(&pn[5], fn);
  1977. X      if(ISBLK(pn, st) && st.st_rdev == r) {
  1978. X       /* Match: return pathname of device */
  1979. X       closedir(dp);
  1980. X       return(pn);
  1981. X      }
  1982. X    }
  1983. X    closedir(dp);
  1984. X  }
  1985. X  return(NULL);
  1986. X
  1987. X} /* devicename() */
  1988. X
  1989. X/* Get and return type of file from stat data st */
  1990. LOCAL char *filetype(st)
  1991. X  register struct stat *st;
  1992. X{
  1993. X  register int f;
  1994. X
  1995. X  f = STFMT(st);
  1996. X  if(f == S_IFDIR)              /* Directory */
  1997. X    return("directory");
  1998. X  else if(f == S_IFBLK)         /* Block special */
  1999. X    return("block special");
  2000. X  else if(f == S_IFCHR)         /* Character special */
  2001. X    return("character special");
  2002. X  else if(f == S_IFREG)         /* Regular file */
  2003. X    return("regular");
  2004. X#ifdef  S_IFSOCK
  2005. X  else if(f == S_IFSOCK)        /* Socket */
  2006. X    return("socket");
  2007. X#endif
  2008. X#ifdef  S_IFIFO
  2009. X  else if(f == S_IFIFO)         /* Named pipe */
  2010. X    return("fifo");
  2011. X#endif
  2012. X#ifdef  S_IFLAN
  2013. X  else if(f == S_IFLAN)         /* LAN special */
  2014. X    return("network lan special");
  2015. X#endif
  2016. X#ifdef  S_IFLNK
  2017. X  else if(f == S_IFLNK)         /* Symbolic link */
  2018. X    return("symbolic link");
  2019. X#endif
  2020. X  return("unkown");             /* Unknown type */
  2021. X
  2022. X} /* filetype() */
  2023. X
  2024. X/* Build string containing current permissions */
  2025. LOCAL char *currentperms(m)
  2026. X  int m;
  2027. X{
  2028. X  static char ps[4];
  2029. X  register char *p = ps;
  2030. X
  2031. X  if(m & 04)
  2032. X    *p++ = 'r';
  2033. X  if(m & 02)
  2034. X    *p++ = 'w';
  2035. X  if(m & 01)
  2036. X    *p++ = 'x';
  2037. X  *p = '\0';
  2038. X  return(ps);
  2039. X
  2040. X} /* currentperms() */
  2041. X
  2042. X/* Parse permission string s */
  2043. LOCAL int parseperms(s)
  2044. X  register char *s;
  2045. X{
  2046. X  register int p;
  2047. X
  2048. X  p = 0;
  2049. X  while(*s) {
  2050. X    switch(*s) {
  2051. X      case '0':                 /* Permission are given octal */
  2052. X      case '1':
  2053. X      case '2':
  2054. X      case '3':
  2055. X      case '4':
  2056. X      case '5':
  2057. X      case '6':
  2058. X      case '7':
  2059. X       return(*s - '0');
  2060. X      case 'r':                 /* Read */
  2061. X       p |= 004; break;
  2062. X      case 'w':                 /* Write */
  2063. X       p |= 002; break;
  2064. X      case 'x':                 /* Execute/change */
  2065. X       p |= 001; break;
  2066. X      case '-':                 /* No permission */
  2067. X       p = 0; break;
  2068. X      default:
  2069. X       return(-1);
  2070. X    }
  2071. X    ++s;
  2072. X  }
  2073. X  return(p);
  2074. X
  2075. X} /* parseperms() */
  2076. X
  2077. X/* Get and display status of file pn. Return status record */
  2078. LOCAL struct stat *filestatus(pn)
  2079. X  register char *pn;
  2080. X{
  2081. X  static struct stat st;
  2082. X  char *uid = "???";
  2083. X  char *gid = "???";
  2084. X  register struct passwd *pw;
  2085. X  register struct group *gr;
  2086. X  register char *dev;
  2087. X  register int isdir, isdev, l;
  2088. X#ifdef  S_IFLNK
  2089. X  char sym[NAMELEN];
  2090. X  struct stat lst;
  2091. X  int n, issym = 0;
  2092. X#endif  /* S_IFLNK */
  2093. X
  2094. X  if(lstat(pn, &st))            /* Get file status information */
  2095. X    return((struct stat *) 0);
  2096. X
  2097. X  clearwindow(firstline, lastline);
  2098. X  l = firstline;
  2099. X  isdir = isdev = 0;
  2100. X
  2101. X  /* Display type of file */
  2102. X  (void) putfxy(0, ++l, 0, "Path: %s", pn);
  2103. X  (void) putfxy(0, ++l, 0, "Type: %s (octal %06o)", filetype(&st), STFMT(&st));
  2104. X  switch(STFMT(&st)) {
  2105. X    case S_IFDIR:               /* Directory */
  2106. X      ++isdir;
  2107. X      break;
  2108. X    case S_IFBLK:               /* Block special */
  2109. X    case S_IFCHR:               /* Character special */
  2110. X#ifdef  S_IFLAN
  2111. X    case S_IFLAN:               /* LAN special */
  2112. X#endif
  2113. X      ++isdev;
  2114. X      break;
  2115. X#ifdef  S_IFLNK
  2116. X    case S_IFLNK:               /* Symbolic link */
  2117. X      ++issym;
  2118. X      break;
  2119. X#endif
  2120. X  }
  2121. X
  2122. X  /* Display device number if file is a device */
  2123. X  if(isdev)
  2124. X    (void) putfxy(0, ++l, 0, "Device major no: %d, minor no %d",
  2125. X                 major(st.st_rdev), minor(st.st_rdev));
  2126. X
  2127. X  /* Display device the file resides on */
  2128. X  if( !(dev = devicename(st.st_dev)))
  2129. X    dev = "???";
  2130. X  (void) putfxy(0, ++l, 0, "Resides on device: %s (major: %d, minor: %d)",
  2131. X               dev, major(st.st_dev), minor(st.st_dev));
  2132. X
  2133. X  /* Display inode, # of links and size */
  2134. X  (void) putfxy(0, ++l, 0, "Inode: %d, Links: %d, Size: %ld bytes",
  2135. X               st.st_ino, st.st_nlink, st.st_size);
  2136. X#ifdef  BSD
  2137. X  /* Display blocksize and allocated blocks */
  2138. X  (void) putfxy(0, ++l, 0, "Optimal IO blocksize: %ld, Allocated blocks: %ld",
  2139. X               st.st_blksize, st.st_blocks);
  2140. X#endif  /* BSD */
  2141. X
  2142. X  /* Display owner and group of file */
  2143. X  if(pw = getpwuid((int) st.st_uid))
  2144. X    uid = pw->pw_name;
  2145. X  (void) putfxy(0, ++l, 0, "Owner: %s (uid: %d)", uid, st.st_uid);
  2146. X  if(gr = getgrgid((int) st.st_gid))
  2147. X    gid = gr->gr_name;
  2148. X  (void) putfxy(0, ++l, 0, "Group: %s (gid: %d)", gid, st.st_gid);
  2149. X
  2150. X  /* Display file permissions for user, group and others */
  2151. X  (void) putfxy(0, ++l, 0, "Permissions for user:");
  2152. X  if(st.st_mode & 0400)
  2153. X    (void) putfxy(24, l, 0, "read ");
  2154. X  if(st.st_mode & 0200)
  2155. X    (void) putfxy(29, l, 0, "write");
  2156. X  if(st.st_mode & 0100)
  2157. X    (void) putfxy(35, l, 0, isdir ? "search" : "execute");
  2158. X  (void) putfxy(16, ++l, 0, "group:");
  2159. X  if(st.st_mode & 0040)
  2160. X    (void) putfxy(24, l, 0, "read ");
  2161. X  if(st.st_mode & 0020)
  2162. X    (void) putfxy(29, l, 0, "write");
  2163. X  if(st.st_mode & 0010)
  2164. X    (void) putfxy(35, l, 0, isdir ? "search" : "execute");
  2165. X  (void) putfxy(16, ++l, 0, "all:");
  2166. X  if(st.st_mode & 004)
  2167. X    (void) putfxy(24, l, 0, "read ");
  2168. X  if(st.st_mode & 0002)
  2169. X    (void) putfxy(29, l, 0, "write");
  2170. X  if(st.st_mode & 0001)
  2171. X    (void) putfxy(35, l, 0, isdir ? "search" : "execute");
  2172. X
  2173. X  /* Display special access rights */
  2174. X  if(st.st_mode & (S_ISUID|S_ISGID))
  2175. X    (void) putfxy(16, ++l, 0, "Set user and group ID (%s, %s) on execution",
  2176. X                 uid, gid);
  2177. X  else if((st.st_mode & S_ISUID) == S_ISUID)
  2178. X    (void) putfxy(16, ++l, 0, "Set user ID (%s) on execution", uid);
  2179. X  else if((st.st_mode & S_ISGID) == S_ISGID)
  2180. X    (void) putfxy(16, ++l, 0, "Set group ID (%s) on execution", gid);
  2181. X  if((st.st_mode & S_ISVTX) == S_ISVTX)
  2182. X    (void) putfxy(16, ++l, 0, "Save text image after execution");
  2183. X  (void) putfxy(16, ++l, 0, "Short form: %s (octal: %04o)",
  2184. X               fileaccess(&st), st.st_mode & 07777);
  2185. X
  2186. X  /* Display file dates */
  2187. X  (void) putfxy(0, ++l, 0, "Last access:        %s", ctime(&st.st_atime));
  2188. X  (void) putfxy(0, ++l, 0, "Last modification:  %s", ctime(&st.st_mtime));
  2189. X  (void) putfxy(0, ++l, 0, "Last status change: %s", ctime(&st.st_ctime));
  2190. X
  2191. X#ifdef  S_IFLNK
  2192. X  /* Read and display symbolic link */
  2193. X  if(issym && (n = readlink(pn, sym, sizeof(sym))) > 0) {
  2194. X    sym[n] = '\0';
  2195. X    (void) putfxy(0, ++l, 0, "Symbolic link to: %s", sym);
  2196. X    if((*statfun)(sym, &lst))
  2197. X      (void) putfxy(0, ++l, 0, "Cannot stat type of file");
  2198. X    else
  2199. X      (void) putfxy(0, ++l, 0, "Type: %s (octal %06o)",
  2200. X                   filetype(&lst), STFMT(&lst));
  2201. X  }
  2202. X#endif  /* S_IFLNK */
  2203. X
  2204. X  return(&st);
  2205. X
  2206. X} /* filestatus() */
  2207. X
  2208. X/*
  2209. X *      FILE STATUS ROUTINES
  2210. X */
  2211. X
  2212. X/* Get and return file access string (like ls -l) */
  2213. GLOBL char *fileaccess(st)
  2214. X  register struct stat *st;
  2215. X{
  2216. X  static char perm[12];
  2217. X
  2218. X  perm[0] = STFMT(st) == S_IFDIR ? 'd' : '-';
  2219. X  perm[1] = st->st_mode & 0400   ? 'r' : '-';
  2220. X  perm[2] = st->st_mode & 0200   ? 'w' : '-';
  2221. X  if(st->st_mode & S_ISUID)
  2222. X    perm[3] = 's';
  2223. X  else
  2224. X    perm[3] = st->st_mode & 0100 ? 'x' : '-';
  2225. X  perm[4] = st->st_mode & 0040   ? 'r' : '-';
  2226. X  perm[5] = st->st_mode & 0020   ? 'w' : '-';
  2227. X  if(st->st_mode & S_ISGID)
  2228. X    perm[6] = 's';
  2229. X  else
  2230. X    perm[6] = st->st_mode & 0010 ? 'x' : '-';
  2231. X  perm[7] = st->st_mode & 0004   ? 'r' : '-';
  2232. X  perm[8] = st->st_mode & 0002   ? 'w' : '-';
  2233. X  if(st->st_mode & S_ISVTX)
  2234. X    perm[9] = 't';
  2235. X  else
  2236. X    perm[9] = st->st_mode & 0001 ? 'x' : '-';
  2237. X  perm[10] = '\0';
  2238. X  return(perm);
  2239. X
  2240. X} /* fileaccess() */
  2241. X
  2242. X/* Show all file status information for file fn     */
  2243. X/* Change owner and/or permissions if flag f is set */
  2244. GLOBL int statusfile(fn, f)
  2245. X  register char *fn;
  2246. X  register int f;
  2247. X{
  2248. X  char pnbuf[NAMELEN], buf[INPLEN];
  2249. X  register struct passwd *pw;
  2250. X  register struct group *gr;
  2251. X  register struct stat *st;
  2252. X  register char *pn, *ps;
  2253. X  register int mode;
  2254. X  register int c;
  2255. X
  2256. X  /* Build full pathname if needed */
  2257. X  if(f) {
  2258. X    (void) strcpy(pnbuf, pathname(fn, CPNAM));
  2259. X    pn = pnbuf;
  2260. X  }
  2261. X  else
  2262. X    pn = fn;
  2263. X
  2264. X  who = "STATUS";
  2265. X  /* File status loop */
  2266. X  do {
  2267. X    /* Get and display file status information */
  2268. X#ifdef  BSD
  2269. X    enablesignals();
  2270. X#endif
  2271. X    st = filestatus(pn);
  2272. X#ifdef  BSD
  2273. X    disablesignals();
  2274. X#endif
  2275. X    if( !st) {
  2276. X      c = errequest(fn, "Cannot stat");
  2277. X      break;
  2278. X    }
  2279. X    flushout();
  2280. X
  2281. X    if(f && STFMT(st) == S_IFDIR) {
  2282. X      /* Changes for directories from tree menu only */
  2283. X      puthelp("%s (CR:continue  Q:quit)", who);
  2284. X      (void) putecho("Status %s: ", fn);
  2285. X      c = hitakey(NULL);
  2286. X      break;
  2287. X    }
  2288. X    puthelp("%s (CR:continue  P:permissions  O:owner  G:group  ELSE:quit)", who);
  2289. X    (void) putecho("Change status %s:", fn);
  2290. X    c = hitakey(NULL);
  2291. X    if(c == 'p') {              /* Change permissions */
  2292. X      mode = 0;
  2293. X      puthelp("CHANGE PERMISSIONS: Octal or string from \'rwx-\' (CR:quit))");
  2294. X      c = putecho("Set permissions for owner to:");
  2295. X      ps = currentperms((int) (st->st_mode & 0700) >> 6);
  2296. X      if((c = getline(buf, sizeof(buf), c, 0, ps, GNULL, 0)) != RV_OK)
  2297. X       break;
  2298. X      else if((c = parseperms(buf)) < 0) {
  2299. X       c = errequest(buf, "Bad permissions");
  2300. X       break;
  2301. X      }
  2302. X      mode = c << 6;
  2303. X      c = putecho("Set permissions for group to:");
  2304. X      ps = currentperms((int) (st->st_mode & 0070) >> 3);
  2305. X      if((c = getline(buf, sizeof(buf), c, 0, ps, GNULL, 0)) != RV_OK)
  2306. X       break;
  2307. X      else if((c = parseperms(buf)) < 0) {
  2308. X       c = errequest(buf, "Bad permissions");
  2309. X       break;
  2310. X      }
  2311. X      mode |= c << 3;
  2312. X      c = putecho("Set permissions for all to:");
  2313. X      ps = currentperms((int) (st->st_mode & 0007));
  2314. X      if((c = getline(buf, sizeof(buf), c, 0, ps, GNULL, 0)) != RV_OK)
  2315. X       break;
  2316. X      else if((c = parseperms(buf)) < 0) {
  2317. X       c = errequest(buf, "Bad permissions");
  2318. X       break;
  2319. X      }
  2320. X      mode |= c;
  2321. X      if(chmod(pn, mode) < 0) {
  2322. X       c = errequest(fn, "Cannot change permissions");
  2323. X       break;
  2324. X      }
  2325. X      ++buildflag;
  2326. X      c = 'p';
  2327. X    }
  2328. X    else if(c == 'o') {         /* Change owner */
  2329. X      puthelp("CHANGE OWNER: Give new owner name (CR:quit)");
  2330. X      c = putecho("Change owner of %s to:", fn);
  2331. X      if((c = getline(buf, sizeof(buf), c, 0, NULL, GNULL, 0)) != RV_OK)
  2332. X       break;
  2333. X      if( !(pw = getpwnam(buf))) {
  2334. X       c = errequest(buf, "Unknown user");
  2335. X       break;
  2336. X      }
  2337. X      else if(chown(pn, (int) pw->pw_uid, (int) st->st_gid) < 0) {
  2338. X       c = errequest(fn, "Cannot change owner");
  2339. X       break;
  2340. X      }
  2341. X      ++buildflag;
  2342. X      c = 'o';
  2343. X    }
  2344. X    else if(c == 'g') {         /* Change group */
  2345. X      puthelp("CHANGE GROUP: Give new group name (CR:quit)");
  2346. X      c = putecho("Change group of %s to:", fn);
  2347. X      if((c = getline(buf, sizeof(buf), c, 0, NULL, GNULL, 0)) != RV_OK)
  2348. X       break;
  2349. X      if( !(gr = getgrnam(buf))) {
  2350. X       c = errequest(buf, "Unknown group");
  2351. X       break;
  2352. X      }
  2353. X      else if(chown(pn, (int) st->st_uid, (int) gr->gr_gid) < 0) {
  2354. X       c = errequest(fn, "Cannot change group");
  2355. X       break;
  2356. X      }
  2357. X      ++buildflag;
  2358. X      c = 'g';
  2359. X    }
  2360. X  } while(c == 'p' || c == 'o' || c == 'g');
  2361. X
  2362. X  /* Set screen flags and return */
  2363. X  treeflag = fileflag = SF_FULL;
  2364. X  return(c);
  2365. X
  2366. X} /* statusfile() */
  2367. X
  2368. END_OF_FILE
  2369. if test 12422 -ne `wc -c <'src/stat.c'`; then
  2370.     echo shar: \"'src/stat.c'\" unpacked with wrong size!
  2371. fi
  2372. # end of 'src/stat.c'
  2373. fi
  2374. if test -f 'src/util.c' -a "${1}" != "-c" ; then 
  2375.   echo shar: Will not clobber existing file \"'src/util.c'\"
  2376. else
  2377. echo shar: Extracting \"'src/util.c'\" \(6251 characters\)
  2378. sed "s/^X//" >'src/util.c' <<'END_OF_FILE'
  2379. X/*
  2380. X *      UTIL.C
  2381. X *      UTREE utility functions.
  2382. X *      3.01-um klin, Sat Apr 20 11:02:33 1991
  2383. X *              klin, Tue Oct 15 14:02:37 1991, Handling of symlinks changed
  2384. X *      3.02-um klin, Fri Nov  1 10:46:14 1991, APOLLO stuff added
  2385. X *      3.03-um klin, Tue Feb 11 22:58:03 1992, statusfile() into stat.c
  2386. X *                                              getopt() into sup/getopt.c
  2387. X *              klin, Fri Mar  6 10:45:49 1992, strclean() added
  2388. X *
  2389. X *      Copyright (c) 1991/92 Peter Klingebiel & UNIX Magazin Muenchen.
  2390. X *      For copying and distribution information see the file COPYRIGHT.
  2391. X */
  2392. X#ifndef lint
  2393. static char sccsid[] = "@(#) utree 3.03-um (klin) Mar  6 1992 util.c";
  2394. X#endif  /* !lint */
  2395. X
  2396. X#include "defs.h"
  2397. X
  2398. X/* ---- Local variables and definitions ------------------------------- */
  2399. X
  2400. X#define TRASH(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '#')
  2401. X
  2402. X/* ---- Functions and procedures -------------------------------------- */
  2403. X
  2404. X/*
  2405. X *      COMMON USED UTILITIY FUNCTIONS
  2406. X *
  2407. X */
  2408. X
  2409. X/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
  2410. X/* !  This function is a modified version of adjustname() `stolen'    ! */
  2411. X/* !  from the public domain editor MICRO GNU EMACS (mg) version 2a.  ! */
  2412. X/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
  2413. X
  2414. X/* Return pathname of filename fn and current directory cwd */
  2415. GLOBL char *pathname(fn, cwd)
  2416. X  register char *fn, *cwd;
  2417. X{
  2418. X  static char pn[NAMELEN];
  2419. X  register char *cp;
  2420. X
  2421. X  if(*fn == '/') {
  2422. X    cp = pn;
  2423. X#ifdef  APOLLO                  /* Stuff for APOLLO node names: //node */
  2424. X    if(fn[1] == '/')
  2425. X      *cp++ = *fn++;
  2426. X#endif  /* APOLLO */
  2427. X    while(fn[1] == '/')
  2428. X      ++fn;
  2429. X#ifdef  MUNET                   /* Stuff for MUNIX/NET: /../node */
  2430. X    if(fn[1] == '.' && fn[2] == '.') {
  2431. X      *cp++ = *fn++;
  2432. X      *cp++ = *fn++;
  2433. X    }
  2434. X#endif  /* MUNET */
  2435. X    *cp++ = *fn++;
  2436. X  }
  2437. X  else {
  2438. X    (void) strcpy(pn, cwd);
  2439. X    cp = pn + strlen(pn);
  2440. X  }
  2441. X  if(cp != pn && cp[-1] != '/')
  2442. X    *cp++ = '/';
  2443. X  while(*fn) {
  2444. X    switch(*fn) {
  2445. X      case '.':
  2446. X       switch(fn[1]) {
  2447. X         case '\0':
  2448. X           *--cp = '\0';
  2449. X           return(pn);
  2450. X         case '/':
  2451. X           fn += 2;
  2452. X           continue;
  2453. X         case '.':
  2454. X           if(fn[2]=='/' || fn[2] == '\0') {
  2455. X             --cp;
  2456. X             while(cp > pn && *--cp != '/')
  2457. X               ;
  2458. X             ++cp;
  2459. X             if(fn[2]=='\0') {
  2460. X               *--cp = '\0';
  2461. X               return(pn);
  2462. X             }
  2463. X             fn += 3;
  2464. X             continue;
  2465. X           }
  2466. X           break;
  2467. X         default:
  2468. X           break;
  2469. X       }
  2470. X       break;
  2471. X      case '/':
  2472. X       fn++;
  2473. X       continue;
  2474. X      default:
  2475. X       break;
  2476. X    }
  2477. X    while(*fn && (*cp++ = *fn++) != '/')
  2478. X      ;
  2479. X  }
  2480. X#ifdef  APOLLO
  2481. X  if(cp != &pn[2] && cp[-1] == '/')
  2482. X#else   /* !APOLLO */
  2483. X  if(cp != &pn[1] && cp[-1] == '/')
  2484. X#endif  /* APOLLO */
  2485. X    --cp;
  2486. X  *cp = '\0';
  2487. X
  2488. X  return(pn);
  2489. X
  2490. X} /* pathname() */
  2491. X
  2492. X/* Return basename of filename s */
  2493. GLOBL char *basename(s)
  2494. X  register char *s;
  2495. X{
  2496. X  register char *sp;
  2497. X
  2498. X  sp = s + strlen(s);
  2499. X  while(sp >= s)
  2500. X    if(*sp == '/')
  2501. X      return(*(++sp) ? sp : s);
  2502. X    else
  2503. X      --sp;
  2504. X  return(s);
  2505. X
  2506. X} /* basename() */
  2507. X
  2508. X/* Save string s */
  2509. GLOBL char *strsav(s)
  2510. X  register char *s;
  2511. X{
  2512. X  register char *sp;
  2513. X
  2514. X  if(sp = ualloc((unsigned) strlen(s) + 1, sizeof(char)))
  2515. X    (void) strcpy(sp, s);
  2516. X  return(sp);
  2517. X
  2518. X} /* strsav() */
  2519. X
  2520. X/* Convert string from lower to upper case */
  2521. GLOBL VOID strupper(s)
  2522. X  register char *s;
  2523. X{
  2524. X  while(*s) {
  2525. X    if(islower(*s))
  2526. X      *s = toupper(*s);
  2527. X    ++s;
  2528. X  }
  2529. X
  2530. X} /* strupper() */
  2531. X
  2532. X/* Delete leading and trailing trash characters from s */
  2533. GLOBL char *strclean(s)
  2534. X  register char *s;
  2535. X{
  2536. X  register char *p;
  2537. X
  2538. X  while(*s && TRASH(*s))
  2539. X    ++s;
  2540. X  p = s + strlen(s);
  2541. X  while(p > s && TRASH(*(p-1)))
  2542. X    --p;
  2543. X  *p = '\0';
  2544. X  return(s);
  2545. X
  2546. X} /* strclean() */
  2547. X
  2548. X/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
  2549. X/* !   This function is a modified and tuned version of a wild card   ! */
  2550. X/* !   pattern matcher written by Rich Salz (mirror!rs, Nov 26 1986)  ! */
  2551. X/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
  2552. X
  2553. X/* Shell like pattern matching for meta characters *, ?, [class] */
  2554. X/* Check string s against pattern p and return 1 on match 0 else */
  2555. GLOBL int match(s, p)
  2556. X  register char *s, *p;
  2557. X{
  2558. X  register int lc, ok, ex;
  2559. X
  2560. X  for( ; *p; s++, p++) {
  2561. X    switch(*p) {
  2562. X      case '\\':                /* Literal match next char */
  2563. X       ++p;
  2564. X       /*FALLTHRU*/
  2565. X      default:                  /* Literal match char */
  2566. X       if(*s != *p)
  2567. X         return(0);
  2568. X       continue;
  2569. X      case '?':                 /* Match any char */
  2570. X       if(*s == '\0')
  2571. X         return(0);
  2572. X       continue;
  2573. X      case '*':                 /* Match any chars */
  2574. X       if(*++p == '\0')        /* Matches all */
  2575. X         return(1);
  2576. X       for( ; *s; s++)
  2577. X         if(match(s, p))
  2578. X           return(1);
  2579. X       return(0);
  2580. X      case '[':                 /* Class */
  2581. X       if(ex = (p[1] == '^' || p[1] == '!'))
  2582. X         ++p;
  2583. X       for(lc = 0400, ok = 0; *++p && *p != ']'; lc = *p)
  2584. X         if(*p == '-' ? *s <= *++p && *s >= lc : *s == *p)
  2585. X           ok = 1;
  2586. X       if(ok == ex)
  2587. X         return(0);
  2588. X       continue;
  2589. X    }
  2590. X  }
  2591. X  return(*s == '\0');
  2592. X
  2593. X} /* match() */
  2594. X
  2595. X/* Get and return next valid filename entry from directory file d */
  2596. GLOBL char *readdname(dp)
  2597. X  register DIR *dp;
  2598. X{
  2599. X#if     defined(BSD) || !defined(NODIRENT)
  2600. X#ifdef  BSD
  2601. X  register struct direct *d;
  2602. X#else   /* SYSV */
  2603. X  register struct dirent *d;
  2604. X#endif  /* BSD */
  2605. X  register char *f;
  2606. X
  2607. X  /* Get next valid directory entry and return filename */
  2608. X  while(d = readdir(dp)) {
  2609. X    f = d->d_name;
  2610. X    /* Skip "." and ".." */
  2611. X    if(f[0] == '.' && (f[1] == '\0' || (f[1] == '.' && f[2] == '\0')))
  2612. X      continue;
  2613. X    return(f);
  2614. X#else   /* SYSV && NODIRENT */
  2615. X  static char n[DIRSIZ+1];
  2616. X  struct direct d;
  2617. X  register char *f;
  2618. X
  2619. X  while(fread(&d, sizeof(struct direct), 1, dp) > 0) {
  2620. X    f = d.d_name;
  2621. X    /* Skip removed files, "." and ".." */
  2622. X    if(d.d_ino == 0 || (f[0] == '.' && (f[1] == '\0' || (f[1] == '.' && f[2] == '\0'))))
  2623. X      continue;
  2624. X    (void) strncpy(n, d.d_name, DIRSIZ);
  2625. X    n[DIRSIZ] = '\0';
  2626. X    return(n);
  2627. X#endif  /* BSD || !NODIRENT */
  2628. X  }
  2629. X  return(NULL);
  2630. X
  2631. X} /* readdname() */
  2632. X
  2633. END_OF_FILE
  2634. if test 6251 -ne `wc -c <'src/util.c'`; then
  2635.     echo shar: \"'src/util.c'\" unpacked with wrong size!
  2636. fi
  2637. # end of 'src/util.c'
  2638. fi
  2639. if test -f 'src/vars.h' -a "${1}" != "-c" ; then 
  2640.   echo shar: Will not clobber existing file \"'src/vars.h'\"
  2641. else
  2642. echo shar: Extracting \"'src/vars.h'\" \(11380 characters\)
  2643. sed "s/^X//" >'src/vars.h' <<'END_OF_FILE'
  2644. X/*
  2645. X *      VARS.H
  2646. X *      UTREE variables definitions.
  2647. X *      3.01-um klin, Wed May  1 10:29:37 1991
  2648. X *      3.03-um klin, Tue Feb 11 14:18:50 1992, Generic lists for variables
  2649. X *                                              and file type commands
  2650. X *              klin, Sat Feb 15 14:44:52 1992, Video handling and partinioning of
  2651. X *                                              directory and file windows changed
  2652. X *              klin, Sun Feb 23 18:45:19 1992, Keybindings and variable
  2653. X *                                              AUTOSAVE added
  2654. X *
  2655. X *      Copyright (c) 1991/92 by Peter Klingebiel & UNIX Magazin Muenchen.
  2656. X *      For copying and distribution information see the file COPYRIGHT.
  2657. X */
  2658. X#if     defined(_MAIN_) && !defined(lint)
  2659. static char sccsid_vars[] = "@(#) utree 3.03-um (klin) Feb 23 1992 vars.h";
  2660. X#endif  /* _MAIN_ && !lint */
  2661. X
  2662. X/*
  2663. X *      File type dependent commands are hold in a dynamically linked
  2664. X *      list of struct _xlist.
  2665. X */
  2666. X
  2667. typedef struct _xlist {
  2668. X  glist list;                   /*  Contains filetype and pointers      */
  2669. X  char *command;                /*  Command format to execute           */
  2670. X  char *comment;                /*  Additional comment                  */
  2671. X} xlist;
  2672. X
  2673. X#define XNULL   ((xlist *) 0)   /* The xlist NIL pointer                */
  2674. X
  2675. X/*
  2676. X *      Access to entries in the file type command list is done
  2677. X *      with macros to hide this record and for abbreviation.
  2678. X */
  2679. X
  2680. X#define XLIST(p)        (&(p)->list)
  2681. X#define XTYPE(p)        ((p)->list.string)
  2682. X#define XPREV(p)        ((p)->list.prev)
  2683. X#define XNEXT(p)        ((p)->list.next)
  2684. X#define XCOMD(p)        ((p)->command)
  2685. X#define XCOMM(p)        ((p)->comment)
  2686. X
  2687. X#ifdef  _MAIN_
  2688. xlist *xroot = XNULL;           /* Root of file type command list       */
  2689. X#else   /* !_MAIN_ */
  2690. extern xlist *xroot;
  2691. X#endif  /* _MAIN_ */
  2692. X
  2693. X/*
  2694. X *      Variables are hold in a table of struct _vlist which is
  2695. X *      initialized and linked at startup. All predefined variables
  2696. X *      are accessed via index into this table.
  2697. X */
  2698. X
  2699. typedef struct _vlist {
  2700. X  glist list;                   /*  Contains variable name and pointers */
  2701. X  char *shortcut;               /*  Variable short cut                  */
  2702. X  int type;                     /*  Type of variable                    */
  2703. X  int number;                   /*  Variable number (see below)         */
  2704. X  char *defval;                 /*  Default value (if defined)          */
  2705. X  char *value;                  /*  Variable value                      */
  2706. X  char *comment;                /*  Additional comment                  */
  2707. X} vlist;
  2708. X
  2709. X#define VNULL   ((vlist *) 0)   /* The vlist NIL pointer                */
  2710. X
  2711. X/*
  2712. X *      Access to entries in the variable list is done with macros
  2713. X *      to hide this record and for abbreviation.
  2714. X */
  2715. X
  2716. X#define VARLST(n)       (&vtable[n].list)
  2717. X#define VARNAM(n)       (vtable[n].list.string)
  2718. X#define VARPRV(n)       (vtable[n].list.prev)
  2719. X#define VARNXT(n)       (vtable[n].list.next)
  2720. X#define VARCUT(n)       (vtable[n].shortcut)
  2721. X#define VARTYP(n)       (vtable[n].type)
  2722. X#define VARNUM(n)       (vtable[n].number)
  2723. X#define VARDEF(n)       (vtable[n].defval)
  2724. X#define VARVAL(n)       (vtable[n].value)
  2725. X#define VARCOM(n)       (vtable[n].comment)
  2726. X
  2727. X/* Assign vtable entry to vlist pointer. Check if variable is set       */
  2728. X#define VARTAB(n)       (&vtable[n])
  2729. X#define VARSET(n)       (vtable[n].value)
  2730. X
  2731. X/*
  2732. X *      The same macros for access via pointers.
  2733. X */
  2734. X
  2735. X#define VLIST(p)        (&(p)->list)
  2736. X#define VNAME(p)        ((p)->list.string)
  2737. X#define VPREV(p)        ((p)->list.prev)
  2738. X#define VNEXT(p)        ((p)->list.next)
  2739. X#define VSCUT(p)        ((p)->shortcut)
  2740. X#define VTYPE(p)        ((p)->type)
  2741. X#define VNUMB(p)        ((p)->number)
  2742. X#define VDFLT(p)        ((p)->defval)
  2743. X#define VVALE(p)        ((p)->value)
  2744. X#define VCOMM(p)        ((p)->comment)
  2745. X
  2746. X/* Flag values for variables/commands settings                          */
  2747. X#define VC_TST  0               /* Test only. Don't set                 */
  2748. X#define VC_SET  1               /* Set but don't effect change flag     */
  2749. X#define VC_CHG  2               /* Set and affect change flag           */
  2750. X
  2751. X/* Types of variables                                                   */
  2752. X#define VT_B    0               /* Boolean type                         */
  2753. X#define VT_N    1               /* Numerical value                      */
  2754. X#define VT_S    2               /* General string                       */
  2755. X#define VT_U    3               /* User tree or file command string     */
  2756. X#define VT_O    4               /* Other user defined strings           */
  2757. X
  2758. X/* Values for boolean variables                                         */
  2759. X#define VB_ON   ((char *) 1)
  2760. X#define VB_OFF  ((char *) 0)
  2761. X
  2762. X/* Indices in variable table. See variable table below                  */
  2763. X#define V_BL    0               /* Allow bell                           */
  2764. X#define V_CL    1               /* Clock in echo line                   */
  2765. X#define V_GC    2               /* Use graphic character set            */
  2766. X#define V_TS    3               /* Use terminal scroll funcs            */
  2767. X#define V_ST    4               /* Scan tree for changes                */
  2768. X#define V_WD    5               /* Warn about unreadable dirs           */
  2769. X#define V_LS    6               /* Lexical sort filelists               */
  2770. X#define V_AS    7               /* Save definition changes              */
  2771. X#define V_VM    8               /* Video attribute using                */
  2772. X#define V_TI    9               /* Tree indention                       */
  2773. X#define V_FL    10              /* File lines on tree screen            */
  2774. X#define V_HS    11              /* Size of history list                 */
  2775. X#define V_SH    12              /* Interaktive shell                    */
  2776. X#define V_ED    13              /* File editor                          */
  2777. X#define V_EDO   14              /* Editor options                       */
  2778. X#define V_PG    15              /* File viewer/pager                    */
  2779. X#define V_PGO   16              /* Viewer options                       */
  2780. X#define V_XD    17              /* File hex dumper                      */
  2781. X#define V_XDO   18              /* Hex dumper options                   */
  2782. X#define V_LP    19              /* File printer                         */
  2783. X#define V_LPO   20              /* Printer options                      */
  2784. X#define V_BK    21              /* Directory backup                     */
  2785. X#define V_BKO   22              /* Backup options                       */
  2786. X#define V_TC0   22              /* Dummy: used for calculation only     */
  2787. X#define V_TC1   23              /* User defined tree commands           */
  2788. X#define V_TC2   24
  2789. X#define V_TC3   25
  2790. X#define V_TC4   26
  2791. X#define V_TC5   27
  2792. X#define V_TC6   28
  2793. X#define V_TC7   29
  2794. X#define V_TC8   30
  2795. X#define V_TC9   31
  2796. X#define V_FC0   31              /* Dummy: used for calculation only     */
  2797. X#define V_FC1   32              /* User defined file commands           */
  2798. X#define V_FC2   33
  2799. X#define V_FC3   34
  2800. X#define V_FC4   35
  2801. X#define V_FC5   36
  2802. X#define V_FC6   37
  2803. X#define V_FC7   38
  2804. X#define V_FC8   39
  2805. X#define V_FC9   40
  2806. X
  2807. X/*
  2808. X *      Table defining default variable settings (See cmds.h).
  2809. X */
  2810. X
  2811. X#ifdef  _MAIN_
  2812. vlist vtable[] = {
  2813. X  { { "BELL",       GNULL, GNULL }, "BL",  VT_B, V_BL,  VB_ON,    NULL, "Allow ringing of bell" },
  2814. X#ifdef  UTCLOCK
  2815. X  { { "CLOCK",      GNULL, GNULL }, "CL",  VT_B, V_CL,  VB_ON,    NULL, "Display/update clock" },
  2816. X#else   /* !UTCLOCK */
  2817. X  { { "CLOCK",      GNULL, GNULL }, "CL",  VT_B, V_CL,  VB_OFF,   NULL, "Display/update clock" },
  2818. X#endif  /* UTCLOCK */
  2819. X  { { "GRAPHCHARS", GNULL, GNULL }, "GC",  VT_B, V_GC,  VB_ON,    NULL, "Use graphic charset" },
  2820. X  { { "TERMSCROLL", GNULL, GNULL }, "TS",  VT_B, V_TS,  VB_ON,    NULL, "Use terminal scrolling" },
  2821. X  { { "SCANTREE",   GNULL, GNULL }, "ST",  VT_B, V_ST,  VB_ON,    NULL, "Scan tree for changes" },
  2822. X  { { "WARNDIRS",   GNULL, GNULL }, "WD",  VT_B, V_WD,  VB_ON,    NULL, "Directory warnings" },
  2823. X  { { "LEXSORT",    GNULL, GNULL }, "LS",  VT_B, V_LS,  VB_ON,    NULL, "Lexical sort of filelists" },
  2824. X  { { "AUTOSAVE",   GNULL, GNULL }, "AS",  VT_B, V_AS,  VB_ON,    NULL, "Save definition/history changes" },
  2825. X  { { "VIDEOMODE",  GNULL, GNULL }, "VM",  VT_N, V_VM,  "2",      NULL, "Video mode setting (0..2)" },
  2826. X  { { "TREEINDENT", GNULL, GNULL }, "TI",  VT_N, V_TI,  "9",      NULL, "Max tree indention (3..9)" },
  2827. X  { { "FILELINES",  GNULL, GNULL }, "FL",  VT_N, V_FL,  "3",      NULL, "Max file lines (1..9)" },
  2828. X  { { "HISTSIZE",   GNULL, GNULL }, "HS",  VT_N, V_HS,  "22",     NULL, "Size of history list (readonly)" },
  2829. X  { { "SHELL",      GNULL, GNULL }, "SH",  VT_S, V_SH,  SHELL,    NULL, "Shell" },
  2830. X  { { "EDITOR",     GNULL, GNULL }, "ED",  VT_S, V_ED,  EDITPRG,  NULL, "Text editor" },
  2831. X  { { "EDITOPTS",   GNULL, GNULL }, "EO",  VT_S, V_EDO, NULL,     NULL, "Editor options" },
  2832. X  { { "PAGER",      GNULL, GNULL }, "PG",  VT_S, V_PG,  PAGEPRG,  NULL, "Text pager" },
  2833. X  { { "PAGEOPTS",   GNULL, GNULL }, "PO",  VT_S, V_PGO, NULL,     NULL, "Pager options" },
  2834. X  { { "XDUMPER",    GNULL, GNULL }, "XD",  VT_S, V_XD,  DUMPPRG,  NULL, "Hex dumper" },
  2835. X  { { "XDUMPOPTS",  GNULL, GNULL }, "XO",  VT_S, V_XDO, NULL,     NULL, "Dumper options" },
  2836. X  { { "LPRINTER",   GNULL, GNULL }, "LP",  VT_S, V_LP,  PRINTPRG, NULL, "Printer command" },
  2837. X  { { "LPRINTOPTS", GNULL, GNULL }, "LO",  VT_S, V_LPO, NULL,     NULL, "Printer options" },
  2838. X#ifdef UTBCKUP
  2839. X  { { "BACKUP",     GNULL, GNULL }, "BK",  VT_S, V_BK,  UTBCKUP,  NULL, "Backup program" },
  2840. X#else   /* !UTBCKUP */
  2841. X  { { "BACKUP",     GNULL, GNULL }, "BK",  VT_S, V_BK,  NULL,     NULL, "Backup program" },
  2842. X#endif  /* UTBCKUP */
  2843. X  { { "BACKUPOPTS", GNULL, GNULL }, "BO",  VT_S, V_BKO, NULL,     NULL, "Backup options" },
  2844. X  { { "TREECMD1",   GNULL, GNULL }, "T1",  VT_U, V_TC1, NULL,     NULL, NULL },
  2845. X  { { "TREECMD2",   GNULL, GNULL }, "T2",  VT_U, V_TC2, NULL,     NULL, NULL },
  2846. X  { { "TREECMD3",   GNULL, GNULL }, "T3",  VT_U, V_TC3, NULL,     NULL, NULL },
  2847. X  { { "TREECMD4",   GNULL, GNULL }, "T4",  VT_U, V_TC4, NULL,     NULL, NULL },
  2848. X  { { "TREECMD5",   GNULL, GNULL }, "T5",  VT_U, V_TC5, NULL,     NULL, NULL },
  2849. X  { { "TREECMD6",   GNULL, GNULL }, "T6",  VT_U, V_TC6, NULL,     NULL, NULL },
  2850. X  { { "TREECMD7",   GNULL, GNULL }, "T7",  VT_U, V_TC7, NULL,     NULL, NULL },
  2851. X  { { "TREECMD8",   GNULL, GNULL }, "T8",  VT_U, V_TC8, NULL,     NULL, NULL },
  2852. X  { { "TREECMD9",   GNULL, GNULL }, "T9",  VT_U, V_TC9, NULL,     NULL, NULL },
  2853. X  { { "FILECMD1",   GNULL, GNULL }, "F1",  VT_U, V_FC1, NULL,     NULL, NULL },
  2854. X  { { "FILECMD2",   GNULL, GNULL }, "F2",  VT_U, V_FC2, NULL,     NULL, NULL },
  2855. X  { { "FILECMD3",   GNULL, GNULL }, "F3",  VT_U, V_FC3, NULL,     NULL, NULL },
  2856. X  { { "FILECMD4",   GNULL, GNULL }, "F4",  VT_U, V_FC4, NULL,     NULL, NULL },
  2857. X  { { "FILECMD5",   GNULL, GNULL }, "F5",  VT_U, V_FC5, NULL,     NULL, NULL },
  2858. X  { { "FILECMD6",   GNULL, GNULL }, "F6",  VT_U, V_FC6, NULL,     NULL, NULL },
  2859. X  { { "FILECMD7",   GNULL, GNULL }, "F7",  VT_U, V_FC7, NULL,     NULL, NULL },
  2860. X  { { "FILECMD8",   GNULL, GNULL }, "F8",  VT_U, V_FC8, NULL,     NULL, NULL },
  2861. X  { { "FILECMD9",   GNULL, GNULL }, "F9",  VT_U, V_FC9, NULL,     NULL, NULL },
  2862. X  { { NULL } }                  /* End of predefined variables          */
  2863. X};
  2864. X/* Possible user defined variables may follow, but are not implemented  */
  2865. X#else
  2866. extern vlist vtable[];
  2867. X#endif  /* _MAIN_ */
  2868. X
  2869. END_OF_FILE
  2870. if test 11380 -ne `wc -c <'src/vars.h'`; then
  2871.     echo shar: \"'src/vars.h'\" unpacked with wrong size!
  2872. fi
  2873. # end of 'src/vars.h'
  2874. fi
  2875. echo shar: End of archive 3 \(of 8\).
  2876. cp /dev/null ark3isdone
  2877. MISSING=""
  2878. for I in 1 2 3 4 5 6 7 8 ; do
  2879.     if test ! -f ark${I}isdone ; then
  2880.     MISSING="${MISSING} ${I}"
  2881.     fi
  2882. done
  2883. if test "${MISSING}" = "" ; then
  2884.     echo You have unpacked all 8 archives.
  2885.     rm -f ark[1-9]isdone
  2886. else
  2887.     echo You still need to unpack the following archives:
  2888.     echo "        " ${MISSING}
  2889. fi
  2890. ##  End of shell archive.
  2891. exit 0
  2892.