home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 7000-7999 / 7775 < prev    next >
Text File  |  1993-04-14  |  55KB  |  1,845 lines

  1. Newsgroups: alt.sources
  2. Path: wupost!darwin.sura.net!spool.mu.edu!torn!watserv2.uwaterloo.ca!watserv1!news
  3. From: pfratar@fpg.uwaterloo.ca (Paul Frattaroli)
  4. Subject: files, curses-based file manager for UNIX (01/05)
  5. Message-ID: <C5Hops.MtD@watserv1.uwaterloo.ca>
  6. Keywords: file manager files UNIX
  7. Sender: news@watserv1.uwaterloo.ca
  8. Organization: Despotic Coders Society
  9. Date: Wed, 14 Apr 1993 19:56:16 GMT
  10. Lines: 1833
  11.  
  12.  
  13.                    files - a file manager for UNIX
  14.  
  15.                                  by
  16.  
  17.                            Paul Frattaroli
  18.                      <pfratar@fpg.uwaterloo.ca>
  19.  
  20. Files is, as the above title would suggest, a file manager for UNIX.
  21. There are increasingly more and more of these programs becoming
  22. available for UNIX but the author has never liked any of them.  When I
  23. talk about file managers for UNIX, I mean ones which run in text mode.
  24. There are very nice graphical file managers for Graphical User
  25. Interfaces (GUI's) like Sun's OpenWindows(tm) or OSF's Motif(tm) etc.
  26. However a great number of UNIX users lack the appropriate equipment to
  27. run these graphical file managers.
  28.  
  29. Files was written using the curses library for handling text-based
  30. terminals.  Files for UNIX was also modelled after a file manager for
  31. IBM VM/CMS systems which was written at the University of Waterloo,
  32. called FILELIST.  This was an attempt to help migrate users off of our
  33. aging VM system here at UW and onto UNIX systems.
  34.  
  35. Files has been tested on the following systems:
  36.  
  37.     Sun4, SunOS 4.1.X
  38.     DEC MIPS, Ultrix 4.2x, 4.3
  39.     SGI, IRIX
  40.     RS/6000, AIX 3
  41.     MIPS, RISC/os
  42.  
  43. The source provided should compile with the standard cc on every system
  44. except Sun.  You must use gcc on the Sun.  However, K&R source can be
  45. provided which should work with Sun's cc.
  46.  
  47. The source for "files" is also available by anonymous ftp from:
  48.  
  49.     fpg.uwaterloo.ca  [129.97.108.41]
  50.     /pub/files/
  51.  
  52. Enjoy...
  53. Paul Frattaroli
  54.  
  55. --- cut here and feed remainder to sh ---
  56. #! /bin/sh
  57. # This is a shell archive.  Remove anything before this line, then unpack
  58. # it by saving it into a file and typing "sh file".  To overwrite existing
  59. # files, type "sh file -c".  You can also feed this as standard input via
  60. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  61. # will see the following message at the end:
  62. #        "End of archive 1 (of 5)."
  63. # Contents:  files-2.1 files-2.1/INSTALL files-2.1/attributes.c
  64. #   files-2.1/config.h files-2.1/helpsys.c files-2.1/lib files-2.1/man
  65. #   files-2.1/mark.c files-2.1/myaddstr.c files-2.1/paths.c
  66. #   files-2.1/proto.h files-2.1/rc.h files-2.1/shells.c
  67. #   files-2.1/show.c files-2.1/sorting.c files-2.1/struct.h
  68. #   files-2.1/util files-2.1/util/Makefile files-2.1/util/tag.c
  69. # Wrapped by pfratar@fpg on Wed Apr 14 15:28:20 1993
  70. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  71. if test ! -d 'files-2.1' ; then
  72.     echo shar: Creating directory \"'files-2.1'\"
  73.     mkdir 'files-2.1'
  74. fi
  75. if test -f 'files-2.1/INSTALL' -a "${1}" != "-c" ; then 
  76.   echo shar: Will not clobber existing file \"'files-2.1/INSTALL'\"
  77. else
  78. echo shar: Extracting \"'files-2.1/INSTALL'\" \(825 characters\)
  79. sed "s/^X//" >'files-2.1/INSTALL' <<'END_OF_FILE'
  80. X
  81. X                Installation document for "Files"
  82. X
  83. XThis document will attempt to ease the installation of "files" at your
  84. Xsite.  About all there is to do (hopefully) is to edit the files
  85. Xconfig.h and Makefile.
  86. X
  87. XCONFIG.H
  88. X
  89. X- Modfiy the values for DEF_EDITOR, DEF_VIEWER and DEF_SHELL (if desired)
  90. X- Ensure that the definition for FILES_LIB_DIR matches the definition
  91. X  of LIBDIR in Makefile
  92. X- Change any of the paths to various executibles as necessary
  93. X
  94. XMAKEFILE
  95. X
  96. X- Make sure the definition for MACHINE is correct
  97. X- Set the values for BINDIR, LIBDIR and MANDIR
  98. X- Set the values for any other variables in the Makefile. eg. CFLAGS, LDFLAGS,
  99. X  CC, LD, LIBS, INSTALL, INSTALLOPTS and CP
  100. X
  101. XAfter you finish editing these files, type 'make' and/or 'make install'
  102. Xand if all goes well, "files" should be installed.
  103. X
  104. XPaul Frattaroli
  105. X
  106. END_OF_FILE
  107. if test 825 -ne `wc -c <'files-2.1/INSTALL'`; then
  108.     echo shar: \"'files-2.1/INSTALL'\" unpacked with wrong size!
  109. fi
  110. # end of 'files-2.1/INSTALL'
  111. fi
  112. if test -f 'files-2.1/attributes.c' -a "${1}" != "-c" ; then 
  113.   echo shar: Will not clobber existing file \"'files-2.1/attributes.c'\"
  114. else
  115. echo shar: Extracting \"'files-2.1/attributes.c'\" \(3927 characters\)
  116. sed "s/^X//" >'files-2.1/attributes.c' <<'END_OF_FILE'
  117. X/*
  118. X * $Source: /u/pfratar/src/files-2.1/src/RCS/attributes.c,v $
  119. X *
  120. X * $Id: attributes.c,v 6.8 1993/03/30 22:12:20 pfratar v2_1pl10 $
  121. X *
  122. X * files - full screen file manager for UNIX
  123. X * Copyright (C) 1993 Paul Frattaroli
  124. X *
  125. X * This program is free software; you can redistribute it and/or modify
  126. X * it under the terms of the GNU General Public License as published by
  127. X * the Free Software Foundation; either version 2 of the License, or
  128. X * (at your option) any later version.
  129. X *
  130. X * This program is distributed in the hope that it will be useful,
  131. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  132. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  133. X * GNU General Public License for more details.
  134. X *
  135. X * You should have received a copy of the GNU General Public License
  136. X * along with this program; if not, write to the Free Software
  137. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  138. X *
  139. X */
  140. X#define EXTERN
  141. X#include "global.h"
  142. X#undef EXTERN
  143. X
  144. X#ifndef lint
  145. Xstatic char *rcsid = "$Id: attributes.c,v 6.8 1993/03/30 22:12:20 pfratar v2_1pl10 $";
  146. X#endif
  147. X
  148. X/*
  149. X * toggle_mode_bits() - Toggle the bit at the correct position.
  150. X */
  151. Xvoid
  152. Xtoggle_mode_bits(mode_t *m, int p)
  153. X{
  154. X    mode_t tm;
  155. X
  156. X    switch(p) {
  157. X        case 0:
  158. X        case 1:
  159. X        case 3:
  160. X        case 4:
  161. X        case 6:
  162. X        case 7:
  163. X            *m ^= (1 << (8 - p));
  164. X            break;
  165. X        case 2:
  166. X            tm = ((*m & 04000) >> 10) ^ ((*m & 0100) >> 6);
  167. X            tm++;
  168. X            tm %= 4;
  169. X            *m &= 03677;
  170. X            *m |= ((tm & 02) << 10);
  171. X            *m |= ((tm & 1) << 6);
  172. X            break;
  173. X        case 5:
  174. X            tm = ((*m & 02000) >> 9) ^ ((*m & 010) >> 3);
  175. X            tm++;
  176. X            tm %= 4;
  177. X            *m &= 05767;
  178. X            *m |= ((tm & 02) << 9);
  179. X            *m |= ((tm & 1) << 3);
  180. X            break;
  181. X        case 8:
  182. X            tm = ((*m & 01000) >> 8) ^ (*m & 1);
  183. X            tm++;
  184. X            tm %= 4;
  185. X            *m &= 06776;
  186. X            *m |= ((tm & 02) << 8);
  187. X            *m |= (tm & 1);
  188. X            break;
  189. X    }
  190. X}
  191. X
  192. X/*
  193. X * change_attr() - Change the read/write/execute attributes on a file.
  194. X */
  195. Xint
  196. Xchange_attr(void)
  197. X{
  198. X    int position, i, escstat;
  199. X    mode_t mode;
  200. X    char *modestr;
  201. X    int chr;
  202. X
  203. X    position = 0;
  204. X    escstat = 0;
  205. X    modestr = (char *)Alloc(MAXPATHLEN * sizeof(char));
  206. X    mode = (entries + *marked_list)->e_stat.st_mode;
  207. X    mod2str((entries + *marked_list)->e_stat.st_mode, modestr);
  208. X    clear_cwin();
  209. X    cwin_yxaddstr(0, 0,
  210. X        "Use: 'h' and 'l' (or cursor keys) to move left or right,");
  211. X    cwin_yxaddstr(1, 0,
  212. X        "     spacebar to toggle, enter/return to set");
  213. X
  214. X    /*
  215. X     * Don't want to display the file's I_FMT character.
  216. X     */
  217. X    cwin_yxaddstr(2, 0, modestr + 1);
  218. X    cwin_move(2, position);
  219. X
  220. X    mode &= 07777;
  221. X    chr = my_getch(cwin);
  222. X    if(isupper(chr) && chr < 256)
  223. X        chr = tolower(chr);
  224. X    while(!(chr == '\n' || chr == '\r')) {
  225. X        switch(chr) {
  226. X            case 'h':
  227. X            case CSR_LFT:
  228. X                position -= (position == 0) ? 0 : 1;
  229. X                break;
  230. X            case 'l':
  231. X            case CSR_RHT: /* char from escape_seq */
  232. X                position += (position == ATTRIBWIDTH - 2) ? 0 : 1;
  233. X                break;
  234. X            case ' ':
  235. X                toggle_mode_bits(&mode, position);
  236. X                mod2str(mode, modestr);
  237. X                cwin_yxaddstr(2, 0, modestr + 1);
  238. X                break;
  239. X            case '\033':
  240. X                goto leave_change_attr;
  241. X                break;
  242. X        }
  243. X        cwin_move(2, position);
  244. X        chr = my_getch(cwin);
  245. X    }
  246. X    for( i = 0; i < num_marked; i++ ) {
  247. X        if(chmod((entries + *(marked_list + i))->e_name, (mode_t)mode))
  248. X            print_error("Could not change mode:");
  249. X        restat_file((entries + *(marked_list + i)));
  250. X    }
  251. Xleave_change_attr:
  252. X    Free(modestr);
  253. X    num_marked = 0;
  254. X    new_dir(".", curfilter);
  255. X    return(RCNOERR);
  256. X}
  257. X
  258. END_OF_FILE
  259. if test 3927 -ne `wc -c <'files-2.1/attributes.c'`; then
  260.     echo shar: \"'files-2.1/attributes.c'\" unpacked with wrong size!
  261. fi
  262. # end of 'files-2.1/attributes.c'
  263. fi
  264. if test -f 'files-2.1/config.h' -a "${1}" != "-c" ; then 
  265.   echo shar: Will not clobber existing file \"'files-2.1/config.h'\"
  266. else
  267. echo shar: Extracting \"'files-2.1/config.h'\" \(2496 characters\)
  268. sed "s/^X//" >'files-2.1/config.h' <<'END_OF_FILE'
  269. X/*
  270. X * config.h - contains definitions which should be configured by the user.
  271. X *
  272. X * $Source: /u/pfratar/src/files-2.1/src/RCS/config.h,v $
  273. X *
  274. X * files - full screen file manager for UNIX
  275. X * Copyright (C) 1993 Paul Frattaroli
  276. X *
  277. X * This program is free software; you can redistribute it and/or modify
  278. X * it under the terms of the GNU General Public License as published by
  279. X * the Free Software Foundation; either version 2 of the License, or
  280. X * (at your option) any later version.
  281. X *
  282. X * This program is distributed in the hope that it will be useful,
  283. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  284. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  285. X * GNU General Public License for more details.
  286. X *
  287. X * You should have received a copy of the GNU General Public License
  288. X * along with this program; if not, write to the Free Software
  289. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  290. X *
  291. X */
  292. X
  293. X#ifndef __Config_h_
  294. X#define __Config_h_
  295. X
  296. X/*
  297. X * These defines will configure 'files' to your local environment.
  298. X * See also the variables in Makefile
  299. X */
  300. X
  301. X/*
  302. X * DEF_EDITOR: The default editor to start if EDITOR is not defined.
  303. X * DEF_VIEWER: The default pager to use if FILESVIEWER is not defined.
  304. X * DEF_SHELL: The default shell to use if SHELL is not defined.
  305. X */
  306. X#define DEF_EDITOR "vi"
  307. X#define DEF_VIEWER "more -c"
  308. X#define DEF_SHELL "csh"
  309. X
  310. X/*
  311. X * Various defines for the help system.
  312. X * FILES will use a "gopher" based help system if GOPHER_HELP is defined.
  313. X */
  314. X/*
  315. X * Define GOPHER_HELP if you want to use the gopher help system.
  316. X * Define GOPHER_PATH to the initial path for the gopher based
  317. X *   documentation.  You probably shouldn`t change this unless you have the
  318. X *   docs on a local gopher server.  [fpg.uwaterloo.ca -> 129.97.108.41]
  319. X * Define GOPHER_CLIENT to the path of your site's gopher client.
  320. X * Define FILES_LIB_DIR to the path where files can find its standard help
  321. X *   files.  These help files are only used if GOPHER_HELP is not defined.
  322. X */
  323. X/* #define GOPHER_HELP */
  324. X#define GOPHER_PATH "-p \"Software Documentation\"/files fpg.uwaterloo.ca"
  325. X#define GOPHER_CLIENT "/software/gopher/bin/gopher"
  326. X#define FILES_LIB_DIR "/software/files/lib"
  327. X#define HELPFILE "files.help"
  328. X#define INDEXFILE "files.index"
  329. X
  330. X/*
  331. X * Paths to various executibles
  332. X */
  333. X#ifdef MIPS
  334. X#define PATH_CP        "/bsd43/bin/cp"
  335. X#else
  336. X#define PATH_CP        "/bin/cp"
  337. X#endif
  338. X#define PATH_MV        "/bin/mv"
  339. X#define PATH_GREP    "grep"
  340. X#define PATH_RM        "/bin/rm"
  341. X
  342. X#endif /* #ifndef __Config_h__ */
  343. X
  344. END_OF_FILE
  345. if test 2496 -ne `wc -c <'files-2.1/config.h'`; then
  346.     echo shar: \"'files-2.1/config.h'\" unpacked with wrong size!
  347. fi
  348. # end of 'files-2.1/config.h'
  349. fi
  350. if test -f 'files-2.1/helpsys.c' -a "${1}" != "-c" ; then 
  351.   echo shar: Will not clobber existing file \"'files-2.1/helpsys.c'\"
  352. else
  353. echo shar: Extracting \"'files-2.1/helpsys.c'\" \(4496 characters\)
  354. sed "s/^X//" >'files-2.1/helpsys.c' <<'END_OF_FILE'
  355. X/*
  356. X * $Source: /u/pfratar/src/files-2.1/src/RCS/helpsys.c,v $
  357. X *
  358. X * $Id: helpsys.c,v 6.9 1993/04/14 19:23:53 pfratar v2_1pl10 $
  359. X *
  360. X * files - full screen file manager for UNIX
  361. X * Copyright (C) 1993 Paul Frattaroli
  362. X *
  363. X * This program is free software; you can redistribute it and/or modify
  364. X * it under the terms of the GNU General Public License as published by
  365. X * the Free Software Foundation; either version 2 of the License, or
  366. X * (at your option) any later version.
  367. X *
  368. X * This program is distributed in the hope that it will be useful,
  369. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  370. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  371. X * GNU General Public License for more details.
  372. X *
  373. X * You should have received a copy of the GNU General Public License
  374. X * along with this program; if not, write to the Free Software
  375. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  376. X *
  377. X */
  378. X
  379. X#include <stdio.h>
  380. X#define EXTERN
  381. X#include "global.h"
  382. X#undef EXTERN
  383. X
  384. X#ifndef lint
  385. Xstatic char *rcsid = "$Id: helpsys.c,v 6.9 1993/04/14 19:23:53 pfratar v2_1pl10 $";
  386. X#endif
  387. X
  388. X#define NUM_IDHELPLINES 11
  389. X
  390. Xchar id_lines[NUM_IDHELPLINES][75] = {
  391. X    "Use the normal navigation keys to move to the destination directory.",
  392. X    "",
  393. X    "If you DO NOT wish to change the name of the source:",
  394. X    "  Press 'd' to complete the [c]opy or [r]ename once you reach the",
  395. X    "  destination directory.",
  396. X    "",
  397. X    "If you wish to change the name of the source:",
  398. X    "  Press 'n' and type the new name once you reach the destination",
  399. X    "  directory.",
  400. X    "",
  401. X    "Press 'a' to abort the [c]opy/[r]ename at any time."
  402. X};
  403. X
  404. X/*
  405. X * help_sys() - Start files's help system.
  406. X */
  407. Xint
  408. Xhelp_sys(void)
  409. X{
  410. X    FILE *fp, *ifp;
  411. X    char hfn[MAXPATHLEN], ifn[MAXPATHLEN], line[MAXPATHLEN];
  412. X    int cc, index, tind, ypos, FOUND;
  413. X    long toff;
  414. X    char *p;
  415. X
  416. X    sprintf(hfn, "%s/%s", FILES_LIB_DIR, HELPFILE);
  417. X    sprintf(ifn, "%s/%s", FILES_LIB_DIR, INDEXFILE);
  418. X
  419. X    if((fp = fopen(hfn, "r")) == NULL) {
  420. X        warn_user("Could not open help file");
  421. X        goto __help_exit;
  422. X    }
  423. X    if((ifp = fopen(ifn, "r")) == NULL) {
  424. X        warn_user("Could not open index file");
  425. X        goto __help_exit;
  426. X    }
  427. X
  428. X    clear_fwin();
  429. X    clear_cwin();
  430. X
  431. X    sprintf(line, "Paul's File Manager: %s.  Version: %s  Patchlevel: %s",
  432. X            progname, VERSION, PATCHLEVEL);
  433. X    fwin_yxaddstr(3, 2, line);
  434. X    fwin_yxaddstr(4, 2, copyright);
  435. X    fwin_yxaddstr(6, 2,
  436. X        "This program comes with ABSOLUTELY NO WARRANTY");
  437. X    fwin_yxaddstr(7, 2,
  438. X        "This is free software, and you are welcome to redistribute it");
  439. X    fwin_yxaddstr(8, 2,
  440. X        "under certain conditions.  See the file COPYING for more details");
  441. X
  442. X    cwin_yxaddstr(0, 0, "Press the key you want help on. ('h' to exit help)");
  443. X
  444. X    do {
  445. X        cc = my_getch(fwin);
  446. X        FOUND = FALSE;
  447. X        if(cc != 'h') {
  448. X            index = (int)cc;
  449. X            while(fgets(line, sizeof line, ifp) && !FOUND) {
  450. X                p = line;
  451. X                line[strlen(line) - 1] = '\0';
  452. X
  453. X                while(*p && *p != ':') p++;
  454. X                *p = '\0';
  455. X                tind = atoi(line);
  456. X                if(tind == index) {
  457. X                    toff = atol(p+1);
  458. X                    FOUND = TRUE;
  459. X                }
  460. X            }
  461. X
  462. X            ypos = 0;
  463. X            clear_fwin();
  464. X            if(FOUND) {
  465. X                fseek(fp, toff, 0);
  466. X                while(fgets(line, sizeof line, fp) && strncmp(line, "@@", 2)) {
  467. X                    fwin_yxaddstr(++ypos, 0, line);
  468. X                    if(ypos >= fwinlines - 3) {
  469. X                        ypos++;
  470. X                        fwin_yxaddstr(++ypos, 0,
  471. X                                "... More: press enter/return  ...");
  472. X                        fwin_wait();
  473. X                        clear_fwin();
  474. X                        ypos = 0;
  475. X                    }
  476. X                }
  477. X            } else {
  478. X                fwin_yxaddstr(++ypos, 0, "No help found on that key");
  479. X            }
  480. X            rewind(ifp);
  481. X        }
  482. X    } while(cc != 'h');
  483. X
  484. X    fclose(fp);
  485. X    fclose(ifp);
  486. X
  487. X__help_exit:
  488. X    new_dir(".", curfilter);
  489. X    return(RCNOERR);
  490. X}
  491. X
  492. X/*
  493. X * interdest_help() - Give help on interactive destination choosing.
  494. X */
  495. Xint
  496. Xinterdest_help(void)
  497. X{
  498. X    int ypos;
  499. X
  500. X    clear_fwin();
  501. X    for(ypos = 0; ypos < NUM_IDHELPLINES; ypos++) {
  502. X        fwin_yxaddstr(ypos, 0, id_lines[ypos]);
  503. X    }
  504. X    fwin_yxaddstr(++ypos, 0, ENTRET_PROMPT);
  505. X    fwin_wait();
  506. X    new_dir(".", curfilter);
  507. X    return(RCNOERR);
  508. X}
  509. X
  510. END_OF_FILE
  511. if test 4496 -ne `wc -c <'files-2.1/helpsys.c'`; then
  512.     echo shar: \"'files-2.1/helpsys.c'\" unpacked with wrong size!
  513. fi
  514. # end of 'files-2.1/helpsys.c'
  515. fi
  516. if test ! -d 'files-2.1/lib' ; then
  517.     echo shar: Creating directory \"'files-2.1/lib'\"
  518.     mkdir 'files-2.1/lib'
  519. fi
  520. if test ! -d 'files-2.1/man' ; then
  521.     echo shar: Creating directory \"'files-2.1/man'\"
  522.     mkdir 'files-2.1/man'
  523. fi
  524. if test -f 'files-2.1/mark.c' -a "${1}" != "-c" ; then 
  525.   echo shar: Will not clobber existing file \"'files-2.1/mark.c'\"
  526. else
  527. echo shar: Extracting \"'files-2.1/mark.c'\" \(3739 characters\)
  528. sed "s/^X//" >'files-2.1/mark.c' <<'END_OF_FILE'
  529. X/*
  530. X * $Source: /u/pfratar/src/files-2.1/src/RCS/mark.c,v $
  531. X *
  532. X * $Id: mark.c,v 6.8 1993/03/30 22:12:20 pfratar v2_1pl10 $
  533. X *
  534. X * files - full screen file manager for UNIX
  535. X * Copyright (C) 1993 Paul Frattaroli
  536. X *
  537. X * This program is free software; you can redistribute it and/or modify
  538. X * it under the terms of the GNU General Public License as published by
  539. X * the Free Software Foundation; either version 2 of the License, or
  540. X * (at your option) any later version.
  541. X *
  542. X * This program is distributed in the hope that it will be useful,
  543. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  544. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  545. X * GNU General Public License for more details.
  546. X *
  547. X * You should have received a copy of the GNU General Public License
  548. X * along with this program; if not, write to the Free Software
  549. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  550. X *
  551. X */
  552. X#define EXTERN
  553. X#include "global.h"
  554. X#undef EXTERN
  555. X
  556. X#ifndef lint
  557. Xstatic char *rcsid = "$Id: mark.c,v 6.8 1993/03/30 22:12:20 pfratar v2_1pl10 $";
  558. X#endif
  559. X
  560. X/*
  561. X * include_files() - Include or exclude files from marked list by wildcard
  562. X *                   match on name.
  563. X */
  564. Xint
  565. Xinclude_files(void)
  566. X{
  567. X    FILE *pr;
  568. X    char str[MAXPATHLEN], cmd[MAXPATHLEN];
  569. X    int chr, i, INC = 0, j, tmpfd;
  570. X
  571. X    clear_cwin();
  572. X    str[0] = '\0';
  573. X    chr = get_char_ans("Choose: [i]nclude, [e]xclude, [s]elect or [u]nselect ");
  574. X    switch(chr) {
  575. X        case 'i':
  576. X            INC = 1;
  577. X        case 'e':
  578. X            get_user_input("Enter wildcard expression:", str);
  579. X            if(!*str)
  580. X                break;
  581. X            sprintf(cmd, "ls -1ad %s | uniq", str);
  582. X            i = 0;
  583. X
  584. X            /*
  585. X             * In order for the next part to work we have to sort by name.
  586. X             */
  587. X            if(sort_type != SBYNAME) {
  588. X                qsort(entries, count, sizeof(struct entry), fl_name_sort);
  589. X                warn_user("Warning: I have to sort by name to do this...");
  590. X                sort_type = SBYNAME;
  591. X            }
  592. X
  593. X            tmpfd = dup(2);
  594. X            freopen("/dev/null", "w", stderr);
  595. X            pr = popen(cmd, "r");
  596. X            while(fgets(str, MAXPATHLEN, pr)) {
  597. X                *(str + strlen(str) - 1) = '\0';
  598. X                while(strcmp(str, (entries + i)->e_name)) {
  599. X                    if(!INC) {
  600. X                        if(marked(i) == -1) {
  601. X                            *(marked_list + num_marked) = i;
  602. X                            num_marked++;
  603. X                        }
  604. X                    }
  605. X                    i++;
  606. X                }
  607. X                if(INC) {
  608. X                    if(marked(i) == -1) {
  609. X                        *(marked_list + num_marked) = i;
  610. X                        num_marked++;
  611. X                    }
  612. X                } else {
  613. X                    if((j = marked(i)) != -1) {
  614. X                        remove_mark(j);
  615. X                    }
  616. X                }
  617. X                i++;
  618. X            }
  619. X
  620. X            /*
  621. X             * If we are excluding files, we have to mark the files from the
  622. X             * last match to the end.
  623. X             */
  624. X            if(i < count && !INC) {
  625. X                for(; i < count; i++) {
  626. X                    *(marked_list + num_marked) = i;
  627. X                    num_marked++;
  628. X                }
  629. X            }
  630. X            pclose(pr);
  631. X            fclose(stderr);
  632. X            dup2(tmpfd, 2);
  633. X            fdopen(2, "w");
  634. X            close(tmpfd);
  635. X            break;
  636. X        case 's':
  637. X            for( i = 0; i < count; i++ )
  638. X                *(marked_list + i) = i;
  639. X            num_marked = count;
  640. X            break;
  641. X        case 'u':
  642. X            num_marked = 0;
  643. X            break;
  644. X        default:
  645. X            break;
  646. X    }
  647. X    new_dir(".", curfilter);
  648. X    return(RCNOERR);
  649. X}
  650. END_OF_FILE
  651. if test 3739 -ne `wc -c <'files-2.1/mark.c'`; then
  652.     echo shar: \"'files-2.1/mark.c'\" unpacked with wrong size!
  653. fi
  654. # end of 'files-2.1/mark.c'
  655. fi
  656. if test -f 'files-2.1/myaddstr.c' -a "${1}" != "-c" ; then 
  657.   echo shar: Will not clobber existing file \"'files-2.1/myaddstr.c'\"
  658. else
  659. echo shar: Extracting \"'files-2.1/myaddstr.c'\" \(2630 characters\)
  660. sed "s/^X//" >'files-2.1/myaddstr.c' <<'END_OF_FILE'
  661. X/*
  662. X * mywaddstr and mymvwaddstr - Implement special highlighting and attributes
  663. X *                             using \c type codes.
  664. X *
  665. X * $Source: /u/pfratar/src/files-2.1/src/RCS/myaddstr.c,v $
  666. X *
  667. X * files - full screen file manager for UNIX
  668. X * Copyright (C) 1993 Paul Frattaroli
  669. X *
  670. X * This program is free software; you can redistribute it and/or modify
  671. X * it under the terms of the GNU General Public License as published by
  672. X * the Free Software Foundation; either version 2 of the License, or
  673. X * (at your option) any later version.
  674. X *
  675. X * This program is distributed in the hope that it will be useful,
  676. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  677. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  678. X * GNU General Public License for more details.
  679. X *
  680. X * You should have received a copy of the GNU General Public License
  681. X * along with this program; if not, write to the Free Software
  682. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  683. X *
  684. X */
  685. X
  686. X#include <curses.h>
  687. X
  688. X#ifndef lint
  689. Xstatic char *rcsid = "$Id: myaddstr.c,v 6.8 1993/03/30 22:12:20 pfratar v2_1pl10 $";
  690. X#endif
  691. X
  692. Xint highlight;
  693. X
  694. X/*
  695. X * mywaddstr() - Adds strings to a curses window.  Special codes are
  696. X *               expanded into highlighting of some sort.
  697. X */
  698. Xvoid
  699. Xmywaddstr(WINDOW *w, char *s)
  700. X{
  701. X    char *p, *q, tmp[1024];
  702. X    int BOLDON = FALSE;
  703. X
  704. X    strcpy(tmp, s);
  705. X    q = p = tmp;
  706. X    while(*p) {
  707. X        switch(*p) {
  708. X            case '\\':
  709. X                *p = '\0';
  710. X                switch(*++p) {
  711. X                    case 'H':
  712. X                        waddstr(w, q);
  713. X                        wrefresh(w);
  714. X#ifndef AIX
  715. X                        if(MD) fputs(MD, stdout);
  716. X                        wrefresh(w);
  717. X#endif
  718. X                        BOLDON = TRUE;
  719. X                        break;
  720. X                    case 'h':
  721. X                        waddstr(w, q);
  722. X                        wrefresh(w);
  723. X#ifndef AIX
  724. X                        if(ME) fputs(ME, stdout);
  725. X                        wrefresh(w);
  726. X#endif
  727. X                        BOLDON = FALSE;
  728. X                        break;
  729. X                    case '\\':
  730. X                        waddstr(w, "\\");
  731. X                        wrefresh(w);
  732. X                        break;
  733. X                    default:
  734. X                        break;
  735. X                }
  736. X                q = p + 1;
  737. X                break;
  738. X            default:
  739. X                break;
  740. X        }
  741. X        p++;
  742. X    }
  743. X    waddstr(w, q);
  744. X    wrefresh(w);
  745. X}
  746. X
  747. X/*
  748. X * mymvwaddstr() - A mvwaddstr replacement.  Uses mywaddstr() above.
  749. X */
  750. Xvoid
  751. Xmymvwaddstr(WINDOW *w, int y, int x, char *s)
  752. X{
  753. X    wmove(w, y, x);
  754. X    mywaddstr(w, s);
  755. X}
  756. X
  757. END_OF_FILE
  758. if test 2630 -ne `wc -c <'files-2.1/myaddstr.c'`; then
  759.     echo shar: \"'files-2.1/myaddstr.c'\" unpacked with wrong size!
  760. fi
  761. # end of 'files-2.1/myaddstr.c'
  762. fi
  763. if test -f 'files-2.1/paths.c' -a "${1}" != "-c" ; then 
  764.   echo shar: Will not clobber existing file \"'files-2.1/paths.c'\"
  765. else
  766. echo shar: Extracting \"'files-2.1/paths.c'\" \(2470 characters\)
  767. sed "s/^X//" >'files-2.1/paths.c' <<'END_OF_FILE'
  768. X/*
  769. X * $Source: /u/pfratar/src/files-2.1/src/RCS/paths.c,v $
  770. X *
  771. X * $Id: paths.c,v 6.8 1993/03/30 22:12:20 pfratar v2_1pl10 $
  772. X *
  773. X * files - full screen file manager for UNIX
  774. X * Copyright (C) 1993 Paul Frattaroli
  775. X *
  776. X * This program is free software; you can redistribute it and/or modify
  777. X * it under the terms of the GNU General Public License as published by
  778. X * the Free Software Foundation; either version 2 of the License, or
  779. X * (at your option) any later version.
  780. X *
  781. X * This program is distributed in the hope that it will be useful,
  782. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  783. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  784. X * GNU General Public License for more details.
  785. X *
  786. X * You should have received a copy of the GNU General Public License
  787. X * along with this program; if not, write to the Free Software
  788. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  789. X *
  790. X */
  791. X#define EXTERN
  792. X#include "global.h"
  793. X#undef EXTERN
  794. X
  795. X#ifndef lint
  796. Xstatic char *rcsid = "$Id: paths.c,v 6.8 1993/03/30 22:12:20 pfratar v2_1pl10 $";
  797. X#endif
  798. X
  799. X/*
  800. X * expand_dir() - expand normal shell special characters into paths.
  801. X *                Example: ~ or ~joeblo
  802. X */
  803. Xchar *
  804. Xexpand_dir(char *dir)
  805. X{
  806. X    static char tmp[MAXPATHLEN];
  807. X    char *p, *q, *r, *u;
  808. X    int was_slash = FALSE;
  809. X    struct passwd *pwtmp;
  810. X
  811. X    p = dir;
  812. X    q = tmp;
  813. X    switch(*p) {
  814. X        case '~':
  815. X            p++;
  816. X            for(u = p; *u && *u != '/'; u++);
  817. X            if(*u == '/') was_slash = TRUE;
  818. X            *u = '\0';
  819. X            if(*p) {
  820. X                if((pwtmp = getpwnam(p)) != NULL)
  821. X                    r = pwtmp->pw_dir;
  822. X                else
  823. X                    return((char *)NULL);
  824. X            } else {
  825. X                r = homedir;
  826. X            }
  827. X            while(*r) *q++ = *r++;
  828. X            *q++ = '/';
  829. X            if(was_slash)
  830. X                p = u + 1;
  831. X            else
  832. X                p = u;
  833. X            break;
  834. X        default:
  835. X            break;
  836. X    }
  837. X    while(*q++ = *p++);
  838. X    return(tmp);
  839. X}
  840. X
  841. X/*
  842. X * new_path() - Prompt user for a new absolute or relative path and
  843. X *              chdir() there.
  844. X */
  845. Xint
  846. Xnew_path(void)
  847. X{
  848. X    static char np[MAXPATHLEN];
  849. X
  850. X    get_user_input("Enter new path (Press ^R to retrieve last):", np);
  851. X    if(*np) {
  852. X        strcpy(cur_wd, "Reading new directory...");
  853. X        display_cwd();
  854. X        refresh_cwin();
  855. X        new_dir(expand_dir(np), curfilter);
  856. X    } else
  857. X        new_dir(".", curfilter);
  858. X    return(RCNOERR);
  859. X}
  860. X
  861. END_OF_FILE
  862. if test 2470 -ne `wc -c <'files-2.1/paths.c'`; then
  863.     echo shar: \"'files-2.1/paths.c'\" unpacked with wrong size!
  864. fi
  865. # end of 'files-2.1/paths.c'
  866. fi
  867. if test -f 'files-2.1/proto.h' -a "${1}" != "-c" ; then 
  868.   echo shar: Will not clobber existing file \"'files-2.1/proto.h'\"
  869. else
  870. echo shar: Extracting \"'files-2.1/proto.h'\" \(4237 characters\)
  871. sed "s/^X//" >'files-2.1/proto.h' <<'END_OF_FILE'
  872. X/* attributes.c */
  873. Xvoid toggle_mode_bits(mode_t *m, int p);
  874. Xint change_attr(void);
  875. X/* configure.c */
  876. Xint configure_files(void);
  877. Xint read_configuration(void);
  878. Xint write_configuration(void);
  879. X/* dir.c */
  880. Xvoid read_cur_dir(char *filt);
  881. Xint check_dirperms(char *path);
  882. Xvoid new_dir(char *path, char *filt);
  883. Xint check_dirinfo(char *filt);
  884. Xvoid save_old_dir(struct dirst *dip);
  885. Xvoid free_old_dir(struct dirst *dip);
  886. Xvoid restat_file(struct entry *fep);
  887. Xvoid free_all_info(void);
  888. Xvoid waitkey(void);
  889. Xvoid get_home_directory(void);
  890. X/* display.c */
  891. Xvoid init_screen(void);
  892. Xvoid end_screen(void);
  893. Xvoid start_win(void);
  894. Xvoid refresh_screen(void);
  895. Xvoid refresh_fwin(void);
  896. Xvoid refresh_cwin(void);
  897. Xvoid init_cwin(void);
  898. Xvoid display_cwd(void);
  899. Xvoid fix_cwd(char *p);
  900. Xvoid init_keywin(void);
  901. Xvoid update_keywin(void);
  902. Xvoid repaint_screen(void);
  903. Xvoid page_up(void);
  904. Xvoid page_down(void);
  905. Xvoid scroll_up(void);
  906. Xvoid scroll_down(void);
  907. Xint cursor_up(int current, int beep);
  908. Xint cursor_down(int current, int beep);
  909. Xvoid go_top(void);
  910. Xvoid go_end(void);
  911. Xvoid display_fwin(void);
  912. Xvoid display_marks(void);
  913. Xvoid warn_user(char *warn);
  914. Xvoid clear_cwin(void);
  915. Xvoid clear_fwin(void);
  916. Xint ask_user(char *ques, char def);
  917. Xint get_char_ans(char *ques);
  918. Xvoid get_user_input(char *ques, char *ans);
  919. Xvoid mygetstr(struct _win_st *ww, char *str);
  920. Xvoid place_mark(void);
  921. Xvoid remove_mark(int which);
  922. Xvoid set_menu(void);
  923. Xvoid display_version(void);
  924. Xvoid cwin_yxaddstr(int y, int x, char *str);
  925. Xvoid cwin_move(int y, int x);
  926. Xvoid fwin_yxaddstr(int y, int x, char *str);
  927. Xvoid fwin_wait(void);
  928. Xvoid display_file_info(char *fn, char *o, char *g, ino_t inod, nlink_t numl, char *atm, char *ctm);
  929. Xvoid calc_fmt_strings(void);
  930. Xvoid window_change_size(void);
  931. Xint my_getch(struct _win_st *w);
  932. Xint escape_seq(int *status, int chr);
  933. Xvoid set_isig(void);
  934. Xvoid init_syswin(void);
  935. Xvoid end_syswin(void);
  936. Xvoid syswin_addstr(char *str);
  937. Xvoid syswin_msg(char *warn);
  938. Xvoid syswin_wait(void);
  939. X/* fileops.c */
  940. Xint backup_file(void);
  941. Xint copy_file(int newnm, int indest);
  942. Xint create_file_dir(void);
  943. Xint delete_file(void);
  944. Xint edit_file(void);
  945. Xint filter_files(void);
  946. Xint grep_file(void);
  947. Xint file_info(void);
  948. Xint rename_file(int newnm, int indest);
  949. X/* helpsys.c */
  950. Xint help_sys(void);
  951. Xint interdest_help(void);
  952. X/* macro.c */
  953. Xvoid read_a_file(char *fn, char **l, int *nm);
  954. Xvoid read_startup_files(void);
  955. Xvoid write_a_file(char *fn, char **l, int nlm);
  956. Xvoid write_startup_file(void);
  957. Xint valid_cmd_string(char *test);
  958. Xvoid preproc_cmd(char *cmd);
  959. Xint expand_cmd(char *cmd, struct entry *eptr);
  960. Xchar *fix_file_name(char *fn);
  961. Xint define_macro(void);
  962. Xvoid execute_macro(char **mpl, int nmp);
  963. Xint print_file(void);
  964. Xint your_cmd(void);
  965. X/* main.c */
  966. Xint main(int argc, char *argv[]);
  967. Xvoid exit_program(void);
  968. Xvoid tm2str(struct tm *tt, char *tstr);
  969. Xvoid mod2str(mode_t m, char *mstr);
  970. Xvoid fl_str(struct entry *ep);
  971. Xvoid fixname(char *orig, char *new);
  972. Xvoid set_fl_indices(int newfl_first, int warp);
  973. Xvoid *Alloc(int size);
  974. Xvoid *RealFree(void *to_free);
  975. Xvoid my_system(char *cmd, int pause);
  976. Xint check_recursive_cp(char *a, char *b);
  977. Xvoid setup_stderr(void);
  978. Xvoid undo_stderr(void);
  979. Xvoid pass_signal(int s);
  980. Xvoid syswin_system(char *bin, char *swch, char *f2);
  981. Xvoid get_error_str(int status);
  982. Xvoid print_error(char *basemsg);
  983. Xint marked(int which);
  984. Xvoid sort_marked_list(void);
  985. Xint intp_cmp(int *a, int *b);
  986. Xvoid handle_sigsegv(void);
  987. Xchar *basename(char *fullname);
  988. X/* mark.c */
  989. Xint include_files(void);
  990. X/* myaddstr.c */
  991. Xvoid mywaddstr(struct _win_st *w, char *s);
  992. Xvoid mymvwaddstr(struct _win_st *w, int y, int x, char *s);
  993. X/* ops.c */
  994. Xint do_command(int cha);
  995. Xint menu_switch(void);
  996. Xint quit_prog(void);
  997. Xint show_version(void);
  998. X/* paths.c */
  999. Xchar *expand_dir(char *dir);
  1000. Xint new_path(void);
  1001. X/* shells.c */
  1002. Xint goto_shell(void);
  1003. Xint user_cmd(void);
  1004. X/* show.c */
  1005. Xvoid view_file(char *fname);
  1006. Xint show_file_dir(void);
  1007. X/* sorting.c */
  1008. Xint fl_extn_sort(struct entry *e1, struct entry *e2);
  1009. Xint fl_time_sort(struct entry *e1, struct entry *e2);
  1010. Xint time_t_cmp(time_t a, time_t b);
  1011. Xint fl_size_sort(struct entry *e1, struct entry *e2);
  1012. Xint off_t_cmp(off_t a, off_t b);
  1013. Xint fl_name_sort(struct entry *e1, struct entry *e2);
  1014. Xint fl_def_sort(struct entry *e1, struct entry *e2);
  1015. Xint sort_display(void);
  1016. END_OF_FILE
  1017. if test 4237 -ne `wc -c <'files-2.1/proto.h'`; then
  1018.     echo shar: \"'files-2.1/proto.h'\" unpacked with wrong size!
  1019. fi
  1020. # end of 'files-2.1/proto.h'
  1021. fi
  1022. if test -f 'files-2.1/rc.h' -a "${1}" != "-c" ; then 
  1023.   echo shar: Will not clobber existing file \"'files-2.1/rc.h'\"
  1024. else
  1025. echo shar: Extracting \"'files-2.1/rc.h'\" \(966 characters\)
  1026. sed "s/^X//" >'files-2.1/rc.h' <<'END_OF_FILE'
  1027. X/*
  1028. X * rc.h - contains definitions of various return values.
  1029. X *
  1030. X * $Source: /u/pfratar/src/files-2.1/src/RCS/rc.h,v $
  1031. X *
  1032. X * files - full screen file manager for UNIX
  1033. X * Copyright (C) 1993 Paul Frattaroli
  1034. X *
  1035. X * This program is free software; you can redistribute it and/or modify
  1036. X * it under the terms of the GNU General Public License as published by
  1037. X * the Free Software Foundation; either version 2 of the License, or
  1038. X * (at your option) any later version.
  1039. X *
  1040. X * This program is distributed in the hope that it will be useful,
  1041. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1042. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1043. X * GNU General Public License for more details.
  1044. X *
  1045. X * You should have received a copy of the GNU General Public License
  1046. X * along with this program; if not, write to the Free Software
  1047. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1048. X *
  1049. X */
  1050. X
  1051. X#define RCNOCMD 0
  1052. X#define RCNOERR 1
  1053. X#define RCQUIT 50
  1054. X
  1055. END_OF_FILE
  1056. if test 966 -ne `wc -c <'files-2.1/rc.h'`; then
  1057.     echo shar: \"'files-2.1/rc.h'\" unpacked with wrong size!
  1058. fi
  1059. # end of 'files-2.1/rc.h'
  1060. fi
  1061. if test -f 'files-2.1/shells.c' -a "${1}" != "-c" ; then 
  1062.   echo shar: Will not clobber existing file \"'files-2.1/shells.c'\"
  1063. else
  1064. echo shar: Extracting \"'files-2.1/shells.c'\" \(2387 characters\)
  1065. sed "s/^X//" >'files-2.1/shells.c' <<'END_OF_FILE'
  1066. X/*
  1067. X * $Source: /u/pfratar/src/files-2.1/src/RCS/shells.c,v $
  1068. X *
  1069. X * $Id: shells.c,v 6.9 1993/03/30 22:12:20 pfratar v2_1pl10 $
  1070. X *
  1071. X * files - full screen file manager for UNIX
  1072. X * Copyright (C) 1993 Paul Frattaroli
  1073. X *
  1074. X * This program is free software; you can redistribute it and/or modify
  1075. X * it under the terms of the GNU General Public License as published by
  1076. X * the Free Software Foundation; either version 2 of the License, or
  1077. X * (at your option) any later version.
  1078. X *
  1079. X * This program is distributed in the hope that it will be useful,
  1080. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1081. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1082. X * GNU General Public License for more details.
  1083. X *
  1084. X * You should have received a copy of the GNU General Public License
  1085. X * along with this program; if not, write to the Free Software
  1086. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1087. X *
  1088. X */
  1089. X#define EXTERN
  1090. X#include "global.h"
  1091. X#undef EXTERN
  1092. X
  1093. X#ifndef lint
  1094. Xstatic char *rcsid = "$Id: shells.c,v 6.9 1993/03/30 22:12:20 pfratar v2_1pl10 $";
  1095. X#endif
  1096. X
  1097. X/*
  1098. X * goto_shell() - Start an interactive shell.
  1099. X */
  1100. Xint
  1101. Xgoto_shell(void)
  1102. X{
  1103. X    char shell[MAXPATHLEN], *tmp;
  1104. X
  1105. X    end_screen();
  1106. X    tmp = getenv("SHELL"); 
  1107. X    if(tmp) {
  1108. X        strcpy(shell, tmp);
  1109. X        my_system(shell, NOPAUSE);
  1110. X    } else
  1111. X        my_system(DEF_SHELL, NOPAUSE);
  1112. X    num_marked = 0;
  1113. X    start_win();
  1114. X    new_dir(".", curfilter);
  1115. X    return(RCNOERR);
  1116. X}
  1117. X
  1118. X/*
  1119. X * user_cmd() - Escape to the shell for a command.
  1120. X */
  1121. Xint
  1122. Xuser_cmd(void)
  1123. X{
  1124. X    static char ocmd[MAXPATHLEN];
  1125. X    char cmd[MAXPATHLEN];
  1126. X    int i;
  1127. X
  1128. X    get_user_input("Enter command (Press ^R to retrieve last command):", ocmd);
  1129. X    if(*ocmd) {
  1130. X        end_screen();
  1131. X        for(i = 0; i < num_marked; i++) {
  1132. X            strcpy(cmd, ocmd);
  1133. X            preproc_cmd(cmd);
  1134. X            expand_cmd(cmd, (entries + *(marked_list + i)));
  1135. X            if(cmd[0]) {
  1136. X                if( i == num_marked - 1 || num_marked == 0 )
  1137. X                    my_system(cmd, PAUSE);
  1138. X                else
  1139. X                    my_system(cmd, NOPAUSE);
  1140. X            } else {
  1141. X                fprintf(stderr, "Command line too long\n");
  1142. X                waitkey();
  1143. X            }
  1144. X            restat_file((entries + *(marked_list + i)));
  1145. X        }
  1146. X        num_marked = 0;
  1147. X        start_win();
  1148. X    }
  1149. X    num_marked = 0;
  1150. X    new_dir(".", curfilter);
  1151. X    return(RCNOERR);
  1152. X}
  1153. END_OF_FILE
  1154. if test 2387 -ne `wc -c <'files-2.1/shells.c'`; then
  1155.     echo shar: \"'files-2.1/shells.c'\" unpacked with wrong size!
  1156. fi
  1157. # end of 'files-2.1/shells.c'
  1158. fi
  1159. if test -f 'files-2.1/show.c' -a "${1}" != "-c" ; then 
  1160.   echo shar: Will not clobber existing file \"'files-2.1/show.c'\"
  1161. else
  1162. echo shar: Extracting \"'files-2.1/show.c'\" \(3501 characters\)
  1163. sed "s/^X//" >'files-2.1/show.c' <<'END_OF_FILE'
  1164. X/*
  1165. X * $Source: /u/pfratar/src/files-2.1/src/RCS/show.c,v $
  1166. X *
  1167. X * $Id: show.c,v 6.9 1993/03/30 22:12:20 pfratar v2_1pl10 $
  1168. X *
  1169. X * files - full screen file manager for UNIX
  1170. X * Copyright (C) 1993 Paul Frattaroli
  1171. X *
  1172. X * This program is free software; you can redistribute it and/or modify
  1173. X * it under the terms of the GNU General Public License as published by
  1174. X * the Free Software Foundation; either version 2 of the License, or
  1175. X * (at your option) any later version.
  1176. X *
  1177. X * This program is distributed in the hope that it will be useful,
  1178. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1179. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1180. X * GNU General Public License for more details.
  1181. X *
  1182. X * You should have received a copy of the GNU General Public License
  1183. X * along with this program; if not, write to the Free Software
  1184. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1185. X *
  1186. X */
  1187. X#define EXTERN
  1188. X#include "global.h"
  1189. X#undef EXTERN
  1190. X
  1191. X#ifndef lint
  1192. Xstatic char *rcsid = "$Id: show.c,v 6.9 1993/03/30 22:12:20 pfratar v2_1pl10 $";
  1193. X#endif
  1194. X
  1195. X/*
  1196. X * view_file() - View the file using the user's file viewer or
  1197. X *               DEF_VIEWER if one isn't defined.
  1198. X */
  1199. Xvoid
  1200. Xview_file(char *fname)
  1201. X{
  1202. X    char cmd[MAXPATHLEN], viewer[MAXPATHLEN], *tmp;
  1203. X
  1204. X    tmp = getenv("FILESVIEWER");
  1205. X    if(tmp) {
  1206. X        strcpy(viewer, tmp);
  1207. X        sprintf(cmd, "%s '%s'", viewer, fix_file_name(fname));
  1208. X    } else
  1209. X        sprintf(cmd, "%s '%s'", DEF_VIEWER, fix_file_name(fname));
  1210. X    end_screen();
  1211. X    my_system(cmd, PAUSE);
  1212. X    num_marked = 0;
  1213. X    start_win();
  1214. X}
  1215. X
  1216. X/*
  1217. X * show_file_dir() - Change to a new directory to display or show a file
  1218. X *                   using view/more.
  1219. X */
  1220. Xint
  1221. Xshow_file_dir(void)
  1222. X{
  1223. X    mode_t x;
  1224. X    struct stat *tmpst;
  1225. X    char cmd[MAXPATHLEN], args[MAXPATHLEN];
  1226. X
  1227. X    x = (entries + (fl_first + cursor_pos))->e_stat.st_mode;
  1228. X    x &= 0170000;
  1229. X    x >>= 12;
  1230. X    if(x == 012) {
  1231. X        tmpst = (struct stat *)Alloc(sizeof(struct stat));
  1232. X        stat((entries + fl_first + cursor_pos)->e_name, tmpst);
  1233. X        x = tmpst->st_mode;
  1234. X        x &= 0170000;
  1235. X        x >>= 12;
  1236. X        Free(tmpst);
  1237. X    }
  1238. X    if(x == 004) {
  1239. X        strcpy(cur_wd, "Reading new directory...");
  1240. X        display_cwd();
  1241. X        refresh_cwin();
  1242. X        new_dir((entries + fl_first + cursor_pos)->e_name, curfilter);
  1243. X    }
  1244. X    if(x == 010) {
  1245. X        x = (entries + (fl_first + cursor_pos))->e_stat.st_mode;
  1246. X        if(((x & 07777) & 06111)) {
  1247. X            sprintf(cmd, "Execute \"%s\" (y/n)? ",
  1248. X                    (entries + (fl_first + cursor_pos))->e_name);
  1249. X            if(ask_user(cmd, 'n')) {
  1250. X                sprintf(cmd, "Arguments to '%s'?",
  1251. X                        (entries + (fl_first + cursor_pos))->e_name);
  1252. X                args[0] = '\0';
  1253. X                get_user_input(cmd, args);
  1254. X                sprintf(cmd, "./%s %s",
  1255. X                   (entries + (fl_first + cursor_pos))->e_name,
  1256. X                   (args) ? args : "");
  1257. X                end_screen();
  1258. X                my_system(cmd, PAUSE);
  1259. X                num_marked = 0;
  1260. X                start_win();
  1261. X            } else {
  1262. X                /*
  1263. X                 * If the user doesn't want to run an executable file
  1264. X                 * perhaps its a shell script, so lets view it.
  1265. X                 */
  1266. X                view_file((entries + fl_first + cursor_pos)->e_name);
  1267. X            }
  1268. X        } else {
  1269. X            view_file((entries + fl_first + cursor_pos)->e_name);
  1270. X        }
  1271. X        new_dir(".", curfilter);
  1272. X    }
  1273. X    return(RCNOERR);
  1274. X}
  1275. END_OF_FILE
  1276. if test 3501 -ne `wc -c <'files-2.1/show.c'`; then
  1277.     echo shar: \"'files-2.1/show.c'\" unpacked with wrong size!
  1278. fi
  1279. # end of 'files-2.1/show.c'
  1280. fi
  1281. if test -f 'files-2.1/sorting.c' -a "${1}" != "-c" ; then 
  1282.   echo shar: Will not clobber existing file \"'files-2.1/sorting.c'\"
  1283. else
  1284. echo shar: Extracting \"'files-2.1/sorting.c'\" \(4785 characters\)
  1285. sed "s/^X//" >'files-2.1/sorting.c' <<'END_OF_FILE'
  1286. X/*
  1287. X * $Source: /u/pfratar/src/files-2.1/src/RCS/sorting.c,v $
  1288. X *
  1289. X * $Id: sorting.c,v 6.7 1993/03/30 22:12:20 pfratar v2_1pl10 $
  1290. X *
  1291. X * files - full screen file manager for UNIX
  1292. X * Copyright (C) 1993 Paul Frattaroli
  1293. X *
  1294. X * This program is free software; you can redistribute it and/or modify
  1295. X * it under the terms of the GNU General Public License as published by
  1296. X * the Free Software Foundation; either version 2 of the License, or
  1297. X * (at your option) any later version.
  1298. X *
  1299. X * This program is distributed in the hope that it will be useful,
  1300. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1301. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1302. X * GNU General Public License for more details.
  1303. X *
  1304. X * You should have received a copy of the GNU General Public License
  1305. X * along with this program; if not, write to the Free Software
  1306. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1307. X *
  1308. X */
  1309. X#define EXTERN
  1310. X#include "global.h"
  1311. X#undef EXTERN
  1312. X
  1313. X#ifndef lint
  1314. Xstatic char *rcsid = "$Id: sorting.c,v 6.7 1993/03/30 22:12:20 pfratar v2_1pl10 $";
  1315. X#endif
  1316. X
  1317. X/*
  1318. X * fl_extn_sort() - Used by sort_display() to sort on extension.
  1319. X */
  1320. Xint
  1321. Xfl_extn_sort(struct entry *e1, struct entry *e2)
  1322. X{
  1323. X    char *p, *q;
  1324. X
  1325. X    p = index(e1->e_name, '.');
  1326. X    q = index(e2->e_name, '.');
  1327. X    if(!p && !q) {
  1328. X        return(strcmp(e1->e_name, e2->e_name));
  1329. X    } else if(!p && q) {
  1330. X        return(-1);
  1331. X    } else if(p && !q) {
  1332. X        return(1);
  1333. X    } else {
  1334. X        p++;
  1335. X        q++;
  1336. X        return(strcmp(p, q));
  1337. X    }
  1338. X}
  1339. X
  1340. X/*
  1341. X * fl_time_sort(), time_t_cmp() - Used by sort_display() to sort on time.
  1342. X */
  1343. Xint
  1344. Xfl_time_sort(struct entry *e1, struct entry *e2)
  1345. X{
  1346. X    return(time_t_cmp(e1->e_stat.st_mtime, e2->e_stat.st_mtime));
  1347. X}
  1348. X
  1349. Xint
  1350. Xtime_t_cmp(time_t a, time_t b)
  1351. X{
  1352. X    return((a > b) ? -1 : (a == b) ? 0 : 1);
  1353. X}
  1354. X
  1355. X/*
  1356. X * fl_size_sort(), off_t_cmp() - Used by sort_display() to sort on size.
  1357. X */
  1358. Xint
  1359. Xfl_size_sort(struct entry *e1, struct entry *e2)
  1360. X{
  1361. X    return(off_t_cmp(e1->e_stat.st_size, e2->e_stat.st_size));
  1362. X}
  1363. X
  1364. Xint
  1365. Xoff_t_cmp(off_t a, off_t b)
  1366. X{
  1367. X    return((a > b) ? -1 : (a == b) ? 0 : 1);
  1368. X}
  1369. X
  1370. X/*
  1371. X * fl_name_sort() - Used by sort_display() to sort on name.
  1372. X */
  1373. Xint
  1374. Xfl_name_sort(struct entry *e1, struct entry *e2)
  1375. X{
  1376. X    return(strcmp(e1->e_name, e2->e_name));
  1377. X}
  1378. X
  1379. X/*
  1380. X * fl_def_sort() - Used by sort_display() to sort in FILES's default
  1381. X *                 manner.
  1382. X */
  1383. Xint
  1384. Xfl_def_sort(struct entry *e1, struct entry *e2)
  1385. X{
  1386. X    int num_of_dirs = 0, x, y, rc;
  1387. X    struct stat *tmpst;
  1388. X
  1389. X    /*
  1390. X     * Various cases:
  1391. X     *    1)   . and ..
  1392. X     *    2)   directory and file
  1393. X     *    3)   2 directories
  1394. X     *    4)   2 files
  1395. X     */
  1396. X    x = e1->e_stat.st_mode;
  1397. X    y = e2->e_stat.st_mode;
  1398. X    x &= 0170000;
  1399. X    y &= 0170000;
  1400. X    x >>= 12;
  1401. X    y >>= 12;
  1402. X
  1403. X    if(x == 012) {
  1404. X        tmpst = (struct stat *)Alloc(sizeof(struct stat));
  1405. X        stat(e1->e_name, tmpst);
  1406. X        x = tmpst->st_mode;
  1407. X        x &= 0170000;
  1408. X        x >>= 12;
  1409. X        Free(tmpst);
  1410. X    }
  1411. X    if(y == 012) {
  1412. X        tmpst = (struct stat *)Alloc(sizeof(struct stat));
  1413. X        stat(e2->e_name, tmpst);
  1414. X        y = tmpst->st_mode;
  1415. X        y &= 0170000;
  1416. X        y >>= 12;
  1417. X        Free(tmpst);
  1418. X    }
  1419. X
  1420. X    /*
  1421. X     *                                   num_of_dirs
  1422. X     * neither e1 or e2 are directories:      0
  1423. X     * e1 is a directory:                     1
  1424. X     * e2 is a directory:                     2
  1425. X     * both e1 and e2 are directories:        3
  1426. X     */
  1427. X    if(x == 004) num_of_dirs |= 0x01;
  1428. X    if(y == 004) num_of_dirs |= 0x02;
  1429. X
  1430. X    switch(num_of_dirs) {
  1431. X        case 0:
  1432. X            return(fl_name_sort(e1, e2));
  1433. X            break;
  1434. X        case 1:
  1435. X            return(-1);
  1436. X            break;
  1437. X        case 2:
  1438. X            return(1);
  1439. X            break;
  1440. X        case 3:
  1441. X            if(!strcmp(e1->e_name, ".")) {
  1442. X                rc = -1;
  1443. X            } else if(!strcmp(e2->e_name, ".")) {
  1444. X                rc = 1;
  1445. X            } else if(!strcmp(e1->e_name, "..")) {
  1446. X                rc = -1;
  1447. X            } else if(!strcmp(e2->e_name, "..")) {
  1448. X                rc = 1;
  1449. X            } else {
  1450. X                rc = fl_name_sort(e1, e2);
  1451. X            }
  1452. X            break;
  1453. X    }
  1454. X    return(rc);
  1455. X}
  1456. X
  1457. X/*
  1458. X * sort_display() - Sort the file list display in a different order.
  1459. X */
  1460. Xint
  1461. Xsort_display(void)
  1462. X{
  1463. X    int stype;
  1464. X
  1465. X    stype =
  1466. X        get_char_ans("Sort: [d]efault, [e]xtension, [n]ame, [t]ime, [s]ize? ");
  1467. X    switch(stype) {
  1468. X        case 'e':
  1469. X            sort_type = SBYEXTN;
  1470. X            break;
  1471. X        case 't':
  1472. X            sort_type = SBYTIME;
  1473. X            break;
  1474. X        case 's':
  1475. X            sort_type = SBYSIZE;
  1476. X            break;
  1477. X        case 'n':
  1478. X            sort_type = SBYNAME;
  1479. X            break;
  1480. X        default:
  1481. X            sort_type = SBYDFLT;
  1482. X    }
  1483. X    num_marked = 0;
  1484. X    new_dir(".", curfilter);
  1485. X    return(RCNOERR);
  1486. X}
  1487. X
  1488. END_OF_FILE
  1489. if test 4785 -ne `wc -c <'files-2.1/sorting.c'`; then
  1490.     echo shar: \"'files-2.1/sorting.c'\" unpacked with wrong size!
  1491. fi
  1492. # end of 'files-2.1/sorting.c'
  1493. fi
  1494. if test -f 'files-2.1/struct.h' -a "${1}" != "-c" ; then 
  1495.   echo shar: Will not clobber existing file \"'files-2.1/struct.h'\"
  1496. else
  1497. echo shar: Extracting \"'files-2.1/struct.h'\" \(1660 characters\)
  1498. sed "s/^X//" >'files-2.1/struct.h' <<'END_OF_FILE'
  1499. X/*
  1500. X * struct.h - contains definition of entry structure.
  1501. X *
  1502. X * $Source: /u/pfratar/src/files-2.1/src/RCS/struct.h,v $
  1503. X *
  1504. X * files - full screen file manager for UNIX
  1505. X * Copyright (C) 1993 Paul Frattaroli
  1506. X *
  1507. X * This program is free software; you can redistribute it and/or modify
  1508. X * it under the terms of the GNU General Public License as published by
  1509. X * the Free Software Foundation; either version 2 of the License, or
  1510. X * (at your option) any later version.
  1511. X *
  1512. X * This program is distributed in the hope that it will be useful,
  1513. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1514. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1515. X * GNU General Public License for more details.
  1516. X *
  1517. X * You should have received a copy of the GNU General Public License
  1518. X * along with this program; if not, write to the Free Software
  1519. X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1520. X *
  1521. X */
  1522. X
  1523. X/*
  1524. X * structure to hold a single directory entry.
  1525. X */
  1526. Xtypedef struct entry {
  1527. X    char *e_name;
  1528. X    char *e_flstr;
  1529. X    struct stat e_stat;
  1530. X    u_long e_flags;
  1531. X} entry;
  1532. X
  1533. X/*
  1534. X * structure to hold all the necessary info needed to return to a
  1535. X * directory that has already been read.
  1536. X */
  1537. Xtypedef struct dirst {
  1538. X    char *d_name;
  1539. X    int d_sort_type;
  1540. X    int d_count;
  1541. X    int d_fl_first;
  1542. X    int d_fl_last;
  1543. X    int d_cursor_pos;
  1544. X    int d_num_marked;
  1545. X    int *d_marked_list;
  1546. X    int d_kw_mode;
  1547. X    u_long d_mrk_sum;
  1548. X    struct stat *d_stat;
  1549. X    struct entry *d_entries;
  1550. X    u_long d_flags;
  1551. X} dirst;
  1552. X
  1553. Xtypedef struct conf_t {
  1554. X    char ct_name[32];
  1555. X    char ct_desc[64];
  1556. X    int ct_val;
  1557. X    int ct_ny;
  1558. X    int ct_nx;
  1559. X    int ct_dy;
  1560. X    int ct_dx;
  1561. X} conf_t;
  1562. X
  1563. END_OF_FILE
  1564. if test 1660 -ne `wc -c <'files-2.1/struct.h'`; then
  1565.     echo shar: \"'files-2.1/struct.h'\" unpacked with wrong size!
  1566. fi
  1567. # end of 'files-2.1/struct.h'
  1568. fi
  1569. if test ! -d 'files-2.1/util' ; then
  1570.     echo shar: Creating directory \"'files-2.1/util'\"
  1571.     mkdir 'files-2.1/util'
  1572. fi
  1573. if test -f 'files-2.1/util/Makefile' -a "${1}" != "-c" ; then 
  1574.   echo shar: Will not clobber existing file \"'files-2.1/util/Makefile'\"
  1575. else
  1576. echo shar: Extracting \"'files-2.1/util/Makefile'\" \(279 characters\)
  1577. sed "s/^X//" >'files-2.1/util/Makefile' <<'END_OF_FILE'
  1578. XPROG = tag
  1579. X
  1580. XSRCS = tag.c
  1581. X
  1582. XOBJS = tag.o
  1583. X
  1584. XLIBS =
  1585. X
  1586. XHELPFILE = ../lib/files.help
  1587. XINDEXFILE = ../lib/files.index
  1588. X
  1589. Xall: tag index
  1590. X
  1591. Xtag: tag.c
  1592. X    gcc -O -o $(PROG) $(SRCS) $(LIBS)
  1593. X
  1594. Xindex: $(INDEXFILE)
  1595. X
  1596. X$(INDEXFILE): $(HELPFILE)
  1597. X    ./tag $(HELPFILE) $(INDEXFILE)
  1598. X
  1599. Xclean:
  1600. X    rm -f *.o $(PROG)
  1601. X
  1602. END_OF_FILE
  1603. if test 279 -ne `wc -c <'files-2.1/util/Makefile'`; then
  1604.     echo shar: \"'files-2.1/util/Makefile'\" unpacked with wrong size!
  1605. fi
  1606. # end of 'files-2.1/util/Makefile'
  1607. fi
  1608. if test -f 'files-2.1/util/tag.c' -a "${1}" != "-c" ; then 
  1609.   echo shar: Will not clobber existing file \"'files-2.1/util/tag.c'\"
  1610. else
  1611. echo shar: Extracting \"'files-2.1/util/tag.c'\" \(4879 characters\)
  1612. sed "s/^X//" >'files-2.1/util/tag.c' <<'END_OF_FILE'
  1613. X/*
  1614. X * tag.c - Create an index from a tagged input file
  1615. X *         Due to the nature of the algorithm, anything that appears in
  1616. X *         the input file before the first tag is actually a comment
  1617. X *         since a key/offset value will not appear in the index for it.
  1618. X *
  1619. X * $Source: /u/pfratar/src/files-2.1/util/RCS/tag.c,v $
  1620. X *
  1621. X * $Log: tag.c,v $
  1622. X * Revision 1.2  1993/03/04  23:17:59  pfratar
  1623. X * Made a few minor formatting changes and added a few comments.
  1624. X *
  1625. X * Revision 1.1  1993/03/04  23:03:13  pfratar
  1626. X * Initial revision
  1627. X *
  1628. X */
  1629. X
  1630. X#ifndef lint
  1631. Xstatic char *rcsid = "$Id: tag.c,v 1.2 1993/03/04 23:17:59 pfratar Exp $";
  1632. X#endif
  1633. X
  1634. X#include <stdio.h>
  1635. X#include <string.h>
  1636. X#include <strings.h>
  1637. X
  1638. X#define KEY_TAG        "@@key:"
  1639. X#define KEY_TAG_LEN    6
  1640. X#define TABLE_SIZE    256
  1641. X
  1642. Xchar Pname[1024];
  1643. X
  1644. X/*
  1645. X * Table structure to hold the key and the offset for that key
  1646. X */
  1647. Xtypedef struct tab {
  1648. X    int    ind;
  1649. X    long    off;
  1650. X} tab_t;
  1651. X
  1652. X/*
  1653. X * The user fucked up, print out a usage message to help them
  1654. X */
  1655. Xvoid
  1656. Xusage(void)
  1657. X{
  1658. X    printf("Usage: %s [ infile [ outfile ] ]\n", Pname);
  1659. X    return;
  1660. X}
  1661. X
  1662. X/*
  1663. X * We want to sort the table of key/offset pairs, here is our comparison
  1664. X * routine to pass to qsort
  1665. X */
  1666. Xint
  1667. Xcompar(tab_t *a, tab_t *b)
  1668. X{
  1669. X    if(a->ind > b->ind) return(1);
  1670. X    else if(a->ind < b->ind) return(-1);
  1671. X    else return(0);
  1672. X}
  1673. X
  1674. X/*
  1675. X * Run through the input file, find the keys, grab the offset, store
  1676. X * the key/value pairs in the table, sort the table, output the
  1677. X * table to the output file
  1678. X */
  1679. Xint
  1680. Xcreate_index(FILE *fp, FILE *ofp)
  1681. X{
  1682. X    char    line[1024], *p, *q;
  1683. X    long    current;
  1684. X    tab_t    *table, *t;
  1685. X    int    tsize, tind = 0, i;
  1686. X
  1687. X    /*
  1688. X     * Get an initial table
  1689. X     */
  1690. X    tsize = TABLE_SIZE;
  1691. X    table = (tab_t *)malloc(tsize * sizeof(tab_t));
  1692. X    if(!table) return(1);
  1693. X    t = table;
  1694. X
  1695. X    while(fgets(line, sizeof line, fp)) {
  1696. X
  1697. X        /* Get the current offset in the file */
  1698. X        current = ftell(fp);
  1699. X
  1700. X        /* Did we just read a key tag? */
  1701. X        if(!strncmp(line, KEY_TAG, KEY_TAG_LEN)) {
  1702. X
  1703. X            /*
  1704. X             * We have found a new key, do we have enough space
  1705. X             * in the table?  If not, allocate more space.
  1706. X             */
  1707. X            if(tind >= tsize) {
  1708. X                tsize *= 2;
  1709. X                table = (tab_t *)realloc(table, tsize * sizeof(tab_t));
  1710. X                t = table + tind;
  1711. X            }
  1712. X
  1713. X            /* NULL out the newline */
  1714. X            line[strlen(line) - 1] = '\0';
  1715. X
  1716. X            /* Skip over the tag */
  1717. X            p = line + KEY_TAG_LEN;
  1718. X
  1719. X            /* Skip over white space */
  1720. X            while(*p && *p == ' ') p++;
  1721. X
  1722. X            /*
  1723. X             * Convert the comma separated numbers and place
  1724. X             * into the table.
  1725. X             */
  1726. X            q = p;
  1727. X            while(*q) {
  1728. X                /* Find a comma or EOL */
  1729. X                while(*p && *p != ',') p++;
  1730. X                if(*p == ',') {
  1731. X                    *p = '\0';
  1732. X                    t->ind = atoi(q);
  1733. X                    t->off = current;
  1734. X                    *p++ = ',';
  1735. X                } else {
  1736. X                    t->ind = atoi(q);
  1737. X                    t->off = current;
  1738. X                }
  1739. X                t++, tind++;
  1740. X                q = p;
  1741. X            }
  1742. X        }
  1743. X    }
  1744. X
  1745. X    /* Sort the index list */
  1746. X    qsort(table, tind, sizeof(tab_t), compar);
  1747. X
  1748. X    /* Print out the index list */
  1749. X    t = table;
  1750. X    for(i = 0; i < tind; i++) {
  1751. X        sprintf(line, "%d:%ld\n", t->ind, t->off);
  1752. X        fputs(line, ofp);
  1753. X        t++;
  1754. X    }
  1755. X
  1756. X    if(table) free(table);
  1757. X    return(0);
  1758. X}
  1759. X
  1760. Xint
  1761. Xmain(int argc, char **argv)
  1762. X{
  1763. X    char    *cp;
  1764. X    FILE    *ifp, *ofp;
  1765. X
  1766. X    /*
  1767. X     * Get the program name
  1768. X     */
  1769. X    if(cp = rindex(argv[0], '/'))
  1770. X        strcpy(Pname, cp+1);
  1771. X    else
  1772. X        strcpy(Pname, argv[0]);
  1773. X
  1774. X    /*
  1775. X     * Assume initially that we will be using stdin and stdout.
  1776. X     */
  1777. X    ifp = stdin;
  1778. X    ofp = stdout;
  1779. X
  1780. X    /*
  1781. X     * If there were arguments, do create_index() once for each,
  1782. X     * otherwise, use stdin.
  1783. X     */
  1784. X    switch(argc) {
  1785. X    case 1:
  1786. X        if(create_index(ifp, ofp))
  1787. X            fprintf(stderr, "%s: %s\n", Pname, "Error creating index");
  1788. X        break;
  1789. X    case 3:
  1790. X        if((ofp = fopen(argv[2], "w")) == NULL) {
  1791. X            fprintf(stderr, "%s: %s '%s'\n", Pname,
  1792. X                "Could not open output file", argv[2]
  1793. X            );
  1794. X        }
  1795. X        /* FALL THROUGH */
  1796. X    case 2:
  1797. X        if((ifp = fopen(argv[1], "r")) == NULL) {
  1798. X            fprintf(stderr, "%s: %s '%s'\n",
  1799. X                Pname, "Could not open file", argv[1]
  1800. X            );
  1801. X        } else {
  1802. X            if(create_index(ifp, ofp))
  1803. X                fprintf(stderr, "%s: %s '%s'\n",
  1804. X                    Pname, "Error creating index for", argv[1]
  1805. X                );
  1806. X            fclose(ifp);
  1807. X            fclose(ofp);
  1808. X        }
  1809. X        break;
  1810. X    default:
  1811. X        fprintf(stderr, "%s: Invalid arguments\n", Pname);
  1812. X        usage();
  1813. X        break;
  1814. X    }
  1815. X    return(0);
  1816. X}
  1817. X
  1818. END_OF_FILE
  1819. if test 4879 -ne `wc -c <'files-2.1/util/tag.c'`; then
  1820.     echo shar: \"'files-2.1/util/tag.c'\" unpacked with wrong size!
  1821. fi
  1822. # end of 'files-2.1/util/tag.c'
  1823. fi
  1824. echo shar: End of archive 1 \(of 5\).
  1825. cp /dev/null ark1isdone
  1826. MISSING=""
  1827. for I in 1 2 3 4 5 ; do
  1828.     if test ! -f ark${I}isdone ; then
  1829.     MISSING="${MISSING} ${I}"
  1830.     fi
  1831. done
  1832. if test "${MISSING}" = "" ; then
  1833.     echo You have unpacked all 5 archives.
  1834.     rm -f ark[1-9]isdone
  1835. else
  1836.     echo You still need to unpack the following archives:
  1837.     echo "        " ${MISSING}
  1838. fi
  1839. ##  End of shell archive.
  1840. exit 0
  1841. -- 
  1842.          Paul "vi joe" Frattaroli - Department of Computing Services
  1843.           University of Waterloo  Waterloo, Ontario Canada  N2L-3G1
  1844.      < pfratar@fpg.UWaterloo.CA >       < pfratar@watserv1.UWaterloo.CA >
  1845.