home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / utree / part03 < prev    next >
Encoding:
Text File  |  1992-09-06  |  92.2 KB  |  2,886 lines

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