home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume3 / rename.sh < prev    next >
Text File  |  1989-02-03  |  25KB  |  1,040 lines

  1. Path: xanth!mcnc!ncsuvx!lll-winken!lll-tis!ames!necntc!ncoast!allbery
  2. From: gandalf@csli.stanford.edu (Juergen Wagner)
  3. Newsgroups: comp.sources.misc
  4. Subject: v03i041: File renaming utility
  5. Message-ID: <8805281852.AA06643@uunet.UU.NET>
  6. Date: 28 May 88 18:51:50 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: gandalf@csli.stanford.edu (Juergen Wagner)
  9. Organization: Center for the Study of Language and Information, Stanford U.
  10. Lines: 1026
  11. Approved: allbery@ncoast.UUCP
  12.  
  13. comp.sources.misc: Volume 3, Issue 41
  14. Submitted-By: "Juergen Wagner" <gandalf@csli.stanford.edu>
  15. Archive-Name: rename.sh
  16.  
  17. Here comes a file renaming utility. I know, there are nifty shell scripts
  18. and weird sed commands to achieve the same (not to speak of 'tr'). Yet, I
  19. wrote this program to deal with some file renaming problems I had when I
  20. moved several files from VMS and MSDOS to Unix. Anyway, use it if you can,
  21. otherwise...
  22.  
  23. To unpack the archive, just strip off everything above the "#! /bin/sh" line,
  24. and feed it into /bin/sh. The archive will unpack into a directory "rename".
  25. Just invoking "make" will compile the stuff.
  26.  
  27. I have compiled the program under Ultrix, BSD4.2, SunOS3.[2-4]. Oh, I mean,
  28. "compiled successfully"! Any bug reports please to gandalf@csli.stanford.edu.
  29. Comments, etc. also to this address. Please consider that I get lotsa e-mail
  30. every day, so try to keep the messages concise.
  31.  
  32. Enjoy,
  33. Juergen "Gandalf" Wagner,           gandalf@csli.stanford.edu
  34. Center for the Study of Language and Information (CSLI), Stanford CA
  35.  
  36. #! /bin/sh
  37. #
  38. # Archive 'rename.1of1' created by Juergen Wagner at csli
  39. # Date is Sat May 28 11:10:58 1988
  40. #
  41. # This is a shell archive.  Remove anything before this line
  42. # then unpack it by saving it in a file and feeding it into sh.
  43. # (Files unpacked will be owned by you and have default permissions).
  44. #
  45. # This archive contains the following files: (use them wisely)
  46. #    ./rename/rename.c (4912 bytes)
  47. #    ./rename/Makefile (477 bytes)
  48. #    ./rename/utils.h (1182 bytes)
  49. #    ./rename/gandalf/err.h (443 bytes)
  50. #    ./rename/gandalf/file.h (530 bytes)
  51. #    ./rename/gandalf/getopt.h (106 bytes)
  52. #    ./rename/gandalf/pwd.h (402 bytes)
  53. #    ./rename/gandalf/strings.h (627 bytes)
  54. #    ./rename/err.c (2220 bytes)
  55. #    ./rename/strings.c (2313 bytes)
  56. #    ./rename/confirm.c (771 bytes)
  57. #    ./rename/enter (3345 bytes)
  58. #    ./rename/rename.man (1284 bytes)
  59. #
  60. if `test ! -d ./rename`
  61. then
  62.   mkdir ./rename
  63.   echo "Create directory ./rename"
  64. fi
  65. if `test ! -s ./rename/rename.c`
  66. then
  67. echo "Extracting ./rename/rename.c"
  68. sed 's/^X//' > ./rename/rename.c << 'foo_bar_and_baz'
  69. X/*
  70. X * Copyright by Juergen Wagner (gandalf@csli.stanford.edu)
  71. X *
  72. X * This file is *NOT* in the public domain. The copyright remains with
  73. X * the author.
  74. X *
  75. X * This file may be copied and redistributed in any form provided that
  76. X * this copyright notice is not changed or removed. It must, however, not
  77. X * be used in any licensed software without the author's consent.
  78. X *
  79. X * Any software containing this file as a whole, or parts of it, has to be
  80. X * distributed free of charge (possibly with a reasonable fee for copying and
  81. X * shipping), and machine-readable sources of this file have to be made
  82. X * accessible.
  83. X *
  84. X */
  85. X
  86. X/*
  87. X * $Compile: cc $CFLAGSD -o rename rename.c ${JWLIB}
  88. X *
  89. X *    rename reps.. files...
  90. X *
  91. X *    Rename a group of files by applying a set of textual
  92. X *    replacements.
  93. X *        -v        verbose
  94. X *        -i        ask before overwriting files
  95. X *        -l        lowercase
  96. X *        -t        remove trailing dots
  97. X *        -<n>        cut first <n> chars
  98. X *        old=new        replace `old' by `new'
  99. X *        old=        delete `old'
  100. X *        ^prefix        prefix
  101. X *        =suffix        suffix
  102. X *
  103. X *    Juergen Wagner, Fraunhofer-Institute IAO, Stuttgart
  104. X *    Thu Mar  5 19:33:18 MET 1987
  105. X *
  106. X */
  107. X# include <utils.h>
  108. X
  109. X# define MAXREPS 32
  110. X
  111. Xstatic int nreps = 0;
  112. Xstatic char verbose = FALSE;
  113. Xstatic char safe = FALSE;
  114. Xstatic char lower = FALSE;
  115. Xstatic char nodot = FALSE;
  116. Xstatic int start = 0;
  117. Xstatic char *prefix = NULL;
  118. Xstatic char *suffix = NULL;
  119. Xstatic char *reps[MAXREPS][2];
  120. Xstatic int repl[MAXREPS];
  121. Xstatic char *pos;
  122. Xstatic char buffer[MAXPATHLEN];
  123. X
  124. Xstatic char *new_name();
  125. X
  126. X# ifdef STANDALONE
  127. Xmain(argc,argv)
  128. X# else
  129. Xrename_main(argc,argv)
  130. X# endif
  131. Xint argc;
  132. Xchar **argv;
  133. X{
  134. X  char *new;
  135. X
  136. X  /* Check args */
  137. X# ifdef STANDALONE
  138. X  progname = *argv;
  139. X# endif
  140. X  argc--;
  141. X  while (argc > 0) {
  142. X    argc--; argv++;
  143. X    if (strcmp("-v",*argv) == 0) {
  144. X      verbose = TRUE;
  145. X    } else if (strcmp("-i",*argv) == 0) {
  146. X      safe = TRUE;
  147. X    } else if (strcmp("-l",*argv) == 0) {
  148. X      lower = TRUE;
  149. X    } else if (strcmp("-t",*argv) == 0) {
  150. X      nodot = TRUE;
  151. X    } else if ((argv[0][0] == '-') && isdigit(argv[0][1])) {
  152. X      start = atoi(*argv + 1);
  153. X      if ((start < 0) || (start > 32)) start = 0;
  154. X    } else if (argv[0][0] == '^') {
  155. X      /* The prefix string */
  156. X      if (prefix) usage("Two prefixes??");
  157. X      prefix = &argv[0][1];
  158. X    } else if (argv[0][0] == '=') {
  159. X      /* The suffix string */
  160. X      if (suffix) usage("Two suffixes??");
  161. X      suffix = &argv[0][1];
  162. X    } else if ((pos=index(*argv,'=')) != (char *) 0) {
  163. X      if (nreps == MAXREPS) usage("Too many replacements!");
  164. X      reps[nreps][0] = *argv;
  165. X      reps[nreps][1] = pos+1;
  166. X      *pos = '\0';
  167. X      repl[nreps] = strlen(reps[nreps][0]);
  168. X      nreps++;
  169. X    } else {
  170. X      if (strcmp(*argv,"--")) {
  171. X    argc++;
  172. X      } else argv++;
  173. X      break;
  174. X    }
  175. X  }
  176. X
  177. X  if (!prefix) prefix = "";
  178. X  if (!suffix) suffix = "";
  179. X
  180. X  /* Process files (do renaming) */
  181. X  if (argc <= 0) usage("No files??");
  182. X  if ((nreps == 0) && (*prefix == '\0') && (*suffix == '\0')
  183. X      && !lower && !nodot && (start == 0)) {
  184. X    usage("No modifications specified");
  185. X  }
  186. X
  187. X  while (argc > 0) {
  188. X    new = new_name(*argv);
  189. X    if (!new) {
  190. X      fprintf(stderr,"rename: can't rename %s\n",*argv);
  191. X    } else if (rename_file(*argv,new)) {
  192. X      PWarn(1,"%s",*argv);
  193. X    } else if (verbose) {
  194. X      printf("Renamed %s to %s\n",*argv,new);
  195. X    }
  196. X    argc--; argv++;
  197. X  }
  198. X  exit(0);
  199. X}
  200. X
  201. Xstatic usage(msg)
  202. Xchar *msg;
  203. X{
  204. X  Error(1, "%s\nUsage: %s [-i|-v|-l|-t|-<n>|old=new|^pre|=post] files...\n",
  205. X    msg, progname);
  206. X  /*NOTREACHED*/
  207. X}
  208. X
  209. Xstatic char *new_name(oldname)
  210. Xchar *oldname;
  211. X{
  212. X  int i;
  213. X  char *ptr, *name;
  214. X
  215. X  oldname = name = Copy(oldname,0);
  216. X
  217. X  if (start < strlen(name)) {
  218. X    name = name + start;
  219. X  } else {
  220. X    fprintf(stderr,"Too many chars cut off: %d of %s\n", start, name);
  221. X    return("");
  222. X  }
  223. X
  224. X  if (lower) {
  225. X    if ((ptr = rindex(name,'/')) == NULL) ptr = name;
  226. X    Tolower(ptr);
  227. X  }
  228. X
  229. X  if (nodot && (name[i = strlen(name)-1] == '.')) name[i] = '\0';
  230. X
  231. X  strcpy(buffer,prefix);
  232. X  ptr = buffer + strlen(prefix);
  233. X
  234. X  do {
  235. X    for (i=0; i<nreps; i++) {
  236. X      if (strncmp(name,reps[i][0],repl[i]) == 0) {
  237. X    strcpy(ptr,reps[i][1]);
  238. X    ptr = ptr + strlen(reps[i][1]);
  239. X    name = name + repl[i];
  240. X    break;
  241. X      }
  242. X    }
  243. X    if (i == nreps) {
  244. X      *ptr = *name;
  245. X      ptr++; name++;
  246. X    }
  247. X  } while (*name);
  248. X
  249. X  free(oldname);
  250. X  strcpy(ptr,suffix);
  251. X  return(buffer);
  252. X}
  253. X
  254. Xstatic rename_file(old,new)
  255. Xchar *old, *new;
  256. X{
  257. X  if (!strlen(new)) {
  258. X    fprintf(stderr,"Null name for %s\n",old);
  259. X    return(0);
  260. X  }
  261. X  if (StrEqual(old,".") || StrEqual(old,"..")) {
  262. X    fprintf(stderr, "Can't rename '.' or '..'\n");
  263. X    return(0);
  264. X  }
  265. X  if (StrEqual(new,".") || StrEqual(new,"..")) {
  266. X    fprintf(stderr, "Can't rename to '.' or '..'\n");
  267. X    return(0);
  268. X  }
  269. X  if (StrEqual(old,new)) {
  270. X    fprintf(stderr,"rename: %s unchanged\n",old);
  271. X    return(0);
  272. X  }
  273. X  if (safe && (access(new, F_OK) == 0)) {
  274. X    printf("Replace %s by %s? ",old,new);
  275. X    if (confirm()) return(0);
  276. X  }
  277. X
  278. X  return(rename(old,new));
  279. X}
  280. foo_bar_and_baz
  281. else
  282.   echo "will not overwrite ./rename/rename.c"
  283. fi
  284. if `test ! -s ./rename/Makefile`
  285. then
  286. echo "Extracting ./rename/Makefile"
  287. sed 's/^X//' > ./rename/Makefile << 'foo_bar_and_baz'
  288. XPROG    = rename.o
  289. X# Usually, these come from my private C library
  290. XOBJS    = confirm.o err.o strings.o
  291. X
  292. X# I have those in my environment, so I don't have to specify them every time.
  293. XCFLAGS    = -O -I. -DSTANDALONE
  294. XLDFLAGS    = -O -z -s
  295. XBINDIR    = /usr/local/bin
  296. X
  297. X#---
  298. X
  299. Xall:    rename
  300. X
  301. Xinstall: rename
  302. X    enter -d $(BINDIR) rename
  303. Xnew:
  304. X    make veryclean
  305. X    make install
  306. X
  307. Xclean:
  308. X    rm -f *.o core
  309. X
  310. Xveryclean:
  311. X    rm -f *.o core rename
  312. X
  313. X#---
  314. X
  315. Xrename:    $(PROG) $(OBJS)
  316. X    cc $(LDFLAGS) -o rename $(PROG) $(OBJS)
  317. foo_bar_and_baz
  318. else
  319.   echo "will not overwrite ./rename/Makefile"
  320. fi
  321. if `test ! -s ./rename/utils.h`
  322. then
  323. echo "Extracting ./rename/utils.h"
  324. sed 's/^X//' > ./rename/utils.h << 'foo_bar_and_baz'
  325. X/*
  326. X**
  327. X**    Include File for libutils.a
  328. X**    Juergen Wagner, FhG-IAO, March 1987
  329. X**    Juergen Wagner, CSLI Stanford, April 1988
  330. X**
  331. X*/
  332. X
  333. X# ifndef LIBUTILS_HDR_included
  334. X# define LIBUTILS_HDR_included
  335. X
  336. X# include <stdio.h>
  337. X# include <signal.h>
  338. X# include <ctype.h>
  339. X# ifndef isgraph
  340. X#   define isgraph(c)      ((_ctype_+1)[c]&(_P|_U|_L|_N))
  341. X# endif isgraph
  342. X# include <sys/param.h>
  343. X
  344. X# include <errno.h>
  345. X# if defined(vax) && !defined(ultrix)
  346. X/* Also very strange: Ultrix and SunOS define errno extern, BSD does not */
  347. Xextern int errno;
  348. X# endif
  349. Xextern int sys_nerr;
  350. Xextern char *sys_errlist[];
  351. X
  352. X# include <sys/stat.h>
  353. X# include <sys/ioctl.h>
  354. X# include <sys/file.h>
  355. X
  356. X# undef MAYBE
  357. X# undef TRUE
  358. X# undef FALSE
  359. X
  360. X# define FALSE    0
  361. X# define TRUE    1
  362. X# define MAYBE    2
  363. X
  364. X# define NIL(type)        ((type) 0)
  365. X# define ALLOC(size,type)    ((type *) Calloc(size,sizeof(type)))
  366. X
  367. X# define IDENTITY(x) x
  368. X# define CAT(x,y) IDENTITY(x)y
  369. X
  370. Xtypedef union {
  371. X    char    u_char;
  372. X    short    u_short;
  373. X    int    u_int;
  374. X    float    u_float;
  375. X    double    u_double;
  376. X    char    *u_ptr;
  377. X} CObject;
  378. X
  379. X# include <gandalf/err.h>
  380. X# include <gandalf/file.h>
  381. X# include <gandalf/getopt.h>
  382. X# include <gandalf/pwd.h>
  383. X# include <gandalf/strings.h>
  384. X
  385. X# undef min
  386. X# undef max
  387. X
  388. X# endif
  389. foo_bar_and_baz
  390. else
  391.   echo "will not overwrite ./rename/utils.h"
  392. fi
  393. if `test ! -d ./rename/gandalf`
  394. then
  395.   mkdir ./rename/gandalf
  396.   echo "Create directory ./rename/gandalf"
  397. fi
  398. if `test ! -s ./rename/gandalf/err.h`
  399. then
  400. echo "Extracting ./rename/gandalf/err.h"
  401. sed 's/^X//' > ./rename/gandalf/err.h << 'foo_bar_and_baz'
  402. X/*
  403. X *    Errors and warnings
  404. X */
  405. X
  406. Xextern void PrintMsg();    /* PrintMsg(flg, errno, exitcode, msg, args) */
  407. Xextern void Error();    /* Error(flag, msg, args..)    */
  408. Xextern void Warn();    /* Warn(flag, msg, args..)    */
  409. Xextern void PError();    /* PError(flag, msg, args..)    */
  410. Xextern void PWarn();    /* PWarn(flag, msg, args..)    */
  411. X
  412. Xextern void PrintMsgHook(/*fn, arg*/);
  413. Xextern void PrintStrings(/*file, strings*/);
  414. X
  415. Xextern char *progname;
  416. X
  417. Xextern int confirm();
  418. foo_bar_and_baz
  419. else
  420.   echo "will not overwrite ./rename/gandalf/err.h"
  421. fi
  422. if `test ! -s ./rename/gandalf/file.h`
  423. then
  424. echo "Extracting ./rename/gandalf/file.h"
  425. sed 's/^X//' > ./rename/gandalf/file.h << 'foo_bar_and_baz'
  426. X/*
  427. X**    File Access Functions
  428. X*/
  429. X
  430. Xextern int FCat();
  431. Xextern int CopyFile();
  432. X
  433. Xextern char *ExpandName();
  434. X
  435. Xextern int exists(), isdir();
  436. Xextern char *which(), *which_d(), *which_l();
  437. X
  438. Xextern int readlinks();
  439. Xextern char *rmpath(), *rmname(), *rm_butsuffix();
  440. Xextern char *getfs();
  441. X
  442. Xextern int stat(), lstat(), fstat();
  443. Xextern int MapDir();
  444. X
  445. X#define    FTW_F        1    /* A file                */
  446. X#define    FTW_D        2    /* A directory                */
  447. X#define    FTW_DNR        3    /* A directory that couldn't be read    */
  448. X#define    FTW_NS        4    /* A stat() failure            */
  449. X
  450. Xextern int sftw();
  451. foo_bar_and_baz
  452. else
  453.   echo "will not overwrite ./rename/gandalf/file.h"
  454. fi
  455. if `test ! -s ./rename/gandalf/getopt.h`
  456. then
  457. echo "Extracting ./rename/gandalf/getopt.h"
  458. sed 's/^X//' > ./rename/gandalf/getopt.h << 'foo_bar_and_baz'
  459. X/*
  460. X**    Extract Options from argv
  461. X*/
  462. X
  463. Xextern char *optarg;
  464. Xextern int optind, opterr;
  465. X
  466. Xextern int getopt();
  467. foo_bar_and_baz
  468. else
  469.   echo "will not overwrite ./rename/gandalf/getopt.h"
  470. fi
  471. if `test ! -s ./rename/gandalf/pwd.h`
  472. then
  473. echo "Extracting ./rename/gandalf/pwd.h"
  474. sed 's/^X//' > ./rename/gandalf/pwd.h << 'foo_bar_and_baz'
  475. X/*
  476. X**    Header File Describing the /etc/passwd Structure
  477. X*/
  478. X
  479. Xstruct    passwd {
  480. X    char    *pw_name;
  481. X    char    *pw_passwd;
  482. X    int    pw_uid;
  483. X    int    pw_gid;
  484. X    int    pw_quota;
  485. X    char    *pw_comment;
  486. X    char    *pw_gecos;
  487. X    char    *pw_dir;
  488. X    char    *pw_shell;
  489. X};
  490. X
  491. Xextern struct passwd *getpwent(), *getpwuid(), *getpwnam();
  492. Xextern int setpwent(), endpwent();
  493. Xextern void setpwfile();
  494. Xextern char *getfullname();
  495. Xextern int getuserid(/*name*/);
  496. foo_bar_and_baz
  497. else
  498.   echo "will not overwrite ./rename/gandalf/pwd.h"
  499. fi
  500. if `test ! -s ./rename/gandalf/strings.h`
  501. then
  502. echo "Extracting ./rename/gandalf/strings.h"
  503. sed 's/^X//' > ./rename/gandalf/strings.h << 'foo_bar_and_baz'
  504. X/*
  505. X**    String Manipulations
  506. X*/
  507. X
  508. Xextern char *Copy();
  509. Xextern char *Toupper(), *Tolower();
  510. Xextern char *StrCopy();
  511. Xextern char *Malloc(), *Calloc();
  512. X
  513. X# define StrAppend(s1,s2)    strcat(Copy((s1),strlen(s2)), s2)
  514. X# define StrEqual(s1,s2)    (!strcmp((s1),(s2)))
  515. X
  516. Xextern int match();
  517. X
  518. Xextern char
  519. X  *strcpy(), *strncpy(),
  520. X  *strcat(), *strncat(),
  521. X  *strchr(), *strrchr(),
  522. X  *index(), *rindex(),
  523. X  *strpbrk(),
  524. X  *strtok();
  525. Xextern int
  526. X  strcmp(), strncmp(),
  527. X  strlen(),
  528. X  strspn(), strcspn();
  529. X
  530. Xextern char *malloc(), *calloc(), *alloca();
  531. Xextern char *valloc();
  532. Xextern char *realloc();
  533. Xextern void free(), cfree();
  534. X
  535. Xextern char *getenv();
  536. foo_bar_and_baz
  537. else
  538.   echo "will not overwrite ./rename/gandalf/strings.h"
  539. fi
  540. if `test ! -s ./rename/err.c`
  541. then
  542. echo "Extracting ./rename/err.c"
  543. sed 's/^X//' > ./rename/err.c << 'foo_bar_and_baz'
  544. X/*
  545. X * Copyright by Juergen Wagner (gandalf@csli.stanford.edu)
  546. X *
  547. X * This file is *NOT* in the public domain. The copyright remains with
  548. X * the author.
  549. X *
  550. X * This file may be copied and redistributed in any form provided that
  551. X * this copyright notice is not changed or removed. It must, however, not
  552. X * be used in any licensed software without the author's consent.
  553. X *
  554. X * Any software containing this file as a whole, or parts of it, has to be
  555. X * distributed free of charge (possibly with a reasonable fee for copying and
  556. X * shipping), and machine-readable sources of this file have to be made
  557. X * accessible.
  558. X *
  559. X */
  560. X
  561. X/*
  562. X * Package to signal errors and warnings
  563. X * File: Libs/unix/err.c
  564. X *
  565. X */
  566. X
  567. X# include <sys/types.h>
  568. X# include <stdio.h>
  569. X# include <varargs.h>
  570. Xextern int errno;
  571. X
  572. X# define DEFUN(fn,errc,exitc) \
  573. X  /*VARARGS*/ \
  574. X  void fn(va_alist) \
  575. X  va_dcl \
  576. X  { \
  577. X    va_list args; \
  578. X    char *msg; \
  579. X    int flag; \
  580. X\
  581. X    va_start(args); \
  582. X    flag = va_arg(args, int); \
  583. X    msg = va_arg(args, char *); \
  584. X    PrintMsg(flag, errc, exitc, msg, args); \
  585. X    va_end(args); \
  586. X  }
  587. X
  588. Xchar *progname = "";
  589. Xstatic int (*printmsg_hook_fn)() = NULL;
  590. Xstatic caddr_t printmsg_hook_fn_arg;
  591. X
  592. Xstatic char *beep()
  593. X{
  594. X  return("\007");
  595. X}
  596. X
  597. Xvoid PrintMsg(flag, errcode, exitcode, msg, args)
  598. Xint flag, errcode, exitcode;
  599. Xchar *msg;
  600. Xva_list args;
  601. X{
  602. X  extern int sys_nerr;
  603. X  extern char *sys_errlist[];
  604. X  char *type;
  605. X
  606. X  if (flag) {
  607. X    type = (exitcode >= 0) ? "fatal error" : "warning";
  608. X    fprintf(stderr, "%s: (%s)%s ", progname, type, beep());
  609. X    vfprintf(stderr, msg, args);
  610. X    fprintf(stderr, "\n");
  611. X    if ((errcode >= 0) && (sys_nerr > errcode)) {
  612. X      fprintf(stderr, "   errcode: %s\n",
  613. X          sys_errlist[errcode]);
  614. X    }
  615. X    if (printmsg_hook_fn)
  616. X      printmsg_hook_fn(errcode, exitcode,
  617. X               printmsg_hook_fn_arg);
  618. X    if (exitcode >= 0)
  619. X      exit(exitcode);
  620. X    /*NOTREACHED*/
  621. X  }
  622. X}
  623. X
  624. XDEFUN(PError,errno,1)
  625. XDEFUN(PWarn,errno,-1)
  626. XDEFUN(Error,-1,1)
  627. XDEFUN(Warn,-1,-1)
  628. X
  629. Xvoid PrintMsgHook(fn, arg)
  630. Xint (*fn)();
  631. Xcaddr_t arg;
  632. X{
  633. X  printmsg_hook_fn = fn;
  634. X  printmsg_hook_fn_arg = arg;
  635. X}
  636. X
  637. Xvoid PrintStrings(f,strings)
  638. XFILE *f;
  639. Xchar **strings;
  640. X{
  641. X  while (*strings) {
  642. X    fputs(*strings, f);
  643. X    putc('\n', f);
  644. X    strings++;
  645. X  }
  646. X}
  647. foo_bar_and_baz
  648. else
  649.   echo "will not overwrite ./rename/err.c"
  650. fi
  651. if `test ! -s ./rename/strings.c`
  652. then
  653. echo "Extracting ./rename/strings.c"
  654. sed 's/^X//' > ./rename/strings.c << 'foo_bar_and_baz'
  655. X/*
  656. X * Copyright by Juergen Wagner (gandalf@csli.stanford.edu)
  657. X *
  658. X * This file is *NOT* in the public domain. The copyright remains with
  659. X * the author.
  660. X *
  661. X * This file may be copied and redistributed in any form provided that
  662. X * this copyright notice is not changed or removed. It must, however, not
  663. X * be used in any licensed software without the author's consent.
  664. X *
  665. X * Any software containing this file as a whole, or parts of it, has to be
  666. X * distributed free of charge (possibly with a reasonable fee for copying and
  667. X * shipping), and machine-readable sources of this file have to be made
  668. X * accessible.
  669. X *
  670. X */
  671. X
  672. X# include <sys/param.h>
  673. X# include <ctype.h>
  674. X# include <gandalf/strings.h>
  675. X
  676. X/*****************************************************************
  677. X**                                **
  678. X**            String Operations            **
  679. X**                                **
  680. X*****************************************************************/
  681. X
  682. Xchar *Copy(string, extra)
  683. Xchar *string;
  684. Xint extra;
  685. X{
  686. X  char *new;
  687. X
  688. X  new = malloc(strlen(string)+extra+1);
  689. X  if (new == (char *) 0) {
  690. X    perror("Copy(malloc)");
  691. X    exit(1);
  692. X  }
  693. X  return( strcpy(new,string) );
  694. X}
  695. X
  696. Xchar *Toupper(string)
  697. Xchar *string;
  698. X{
  699. X  register char *s;
  700. X
  701. X  for (s = string; *s != '\0'; s++) {
  702. X    if (isalpha(*s) && islower(*s)) *s = toupper(*s);
  703. X  }
  704. X  return(string);
  705. X}
  706. X
  707. Xchar *Tolower(string)
  708. Xchar *string;
  709. X{
  710. X  register char *s;
  711. X
  712. X  for (s = string; *s != '\0'; s++) {
  713. X    if (isalpha(*s) && isupper(*s)) *s = tolower(*s);
  714. X  }
  715. X  return(string);
  716. X}
  717. X
  718. Xchar *StrCopy(string,c)
  719. Xchar *string, c;
  720. X{
  721. X  register char *s;
  722. X  register int i;
  723. X
  724. X  s = index(string,c);
  725. X  if (s == NULL) return(NULL);
  726. X
  727. X  i = s - string;
  728. X  s = strncpy(Malloc(i + 1), string, i);
  729. X  s[i] = '\0';
  730. X  return(s);
  731. X}
  732. X
  733. Xchar *Mkstring(n,c)
  734. Xint n;
  735. Xchar c;
  736. X{
  737. X  char *string = Malloc(n+1);
  738. X  char *pos = string;
  739. X
  740. X  for (; n > 0; n--) *(pos++) = c;
  741. X  *pos = '\0';
  742. X  return(string);
  743. X}
  744. X
  745. X/*****************************************************************
  746. X**                                **
  747. X**            Memory Management            **
  748. X**                                **
  749. X*****************************************************************/
  750. X
  751. Xchar *Malloc(n)
  752. Xint n;
  753. X{
  754. X  char *new;
  755. X
  756. X  new = malloc(n);
  757. X  Error(!new, "can't allocate another %d bytes", n);
  758. X  return(new);
  759. X}
  760. X
  761. Xchar *Calloc(n,size)
  762. Xint n, size;
  763. X{
  764. X  char *new;
  765. X
  766. X  new = calloc(n,size);
  767. X  Error(!new, "can't allocate another %d %d-byte segments", n, size);
  768. X  return(new);
  769. X}
  770. foo_bar_and_baz
  771. else
  772.   echo "will not overwrite ./rename/strings.c"
  773. fi
  774. if `test ! -s ./rename/confirm.c`
  775. then
  776. echo "Extracting ./rename/confirm.c"
  777. sed 's/^X//' > ./rename/confirm.c << 'foo_bar_and_baz'
  778. X/*
  779. X * Copyright by Juergen Wagner (gandalf@csli.stanford.edu)
  780. X *
  781. X * This file is *NOT* in the public domain. The copyright remains with
  782. X * the author.
  783. X *
  784. X * This file may be copied and redistributed in any form provided that
  785. X * this copyright notice is not changed or removed. It must, however, not
  786. X * be used in any licensed software without the author's consent.
  787. X *
  788. X * Any software containing this file as a whole, or parts of it, has to be
  789. X * distributed free of charge (possibly with a reasonable fee for copying and
  790. X * shipping), and machine-readable sources of this file have to be made
  791. X * accessible.
  792. X *
  793. X */
  794. X
  795. X# include <stdio.h>
  796. X# include <ctype.h>
  797. X
  798. Xint confirm()
  799. X{
  800. X  int c;
  801. X
  802. X  while (!isprint(c = getchar()));
  803. X  while (!isspace(getchar()));
  804. X  return(c == 'y');
  805. X}
  806. foo_bar_and_baz
  807. else
  808.   echo "will not overwrite ./rename/confirm.c"
  809. fi
  810. if `test ! -s ./rename/enter`
  811. then
  812. echo "Extracting ./rename/enter"
  813. sed 's/^X//' > ./rename/enter << 'foo_bar_and_baz'
  814. X#! /bin/csh
  815. X#
  816. X# Copyright by Juergen Wagner (gandalf@csli.stanford.edu)
  817. X#
  818. X# This file is *NOT* in the public domain. The copyright remains with
  819. X# the author.
  820. X#
  821. X# This file may be copied and redistributed in any form provided that
  822. X# this copyright notice is not changed or removed. It must, however, not
  823. X# be used in any licensed software without the author's consent.
  824. X#
  825. X# Any software containing this file as a whole, or parts of it, has to be
  826. X# distributed free of charge (possibly with a reasonable fee for copying and
  827. X# shipping), and machine-readable sources of this file have to be made
  828. X# accessible.
  829. X#
  830. X#
  831. X
  832. X#
  833. X#    Install Files (symlinks or copying)
  834. X#    Juergen Wagner, March 1987
  835. X#
  836. X#    enter [ -s ] [ -d <dir> ] [ -f <origfile> ] [ -g <group> ]
  837. X#          [ -c ] [ -p <owner> ] [ -h ] <linknames>
  838. X#
  839. X
  840. X#set echo
  841. Xif ( "x$1" == "x" ) then
  842. X    echo 'usage: enter [ -s ] [ -d <dir> ] [ -f <origfile> ]'
  843. X    echo '             [ -c ] [ -p <owner> ] [ -h ] <linknames>'
  844. X    exit
  845. Xendif
  846. X
  847. Xset strip = ""
  848. Xset dest = ${BINDIR}
  849. Xset perm = 755
  850. Xset group = ""
  851. Xset cmd = "ln -s"
  852. Xset prefix = ""
  853. Xset file = ""
  854. X
  855. Xwhile (1)
  856. X    if ( $#argv == 0 ) break
  857. X    switch ( "$argv[1]" )
  858. X    # Strip file?
  859. X    case "-s":
  860. X        set strip = "y"
  861. X        breaksw
  862. X    # Destination directory?
  863. X    case "-d":
  864. X        shift
  865. X        set dest = "$argv[1]"
  866. X        breaksw
  867. X    # Filename specification?
  868. X    case "-f":
  869. X        shift
  870. X        set file = "$argv[1]"
  871. X        if ( "$file" =~ *~ ) then
  872. X          echo "enter: I refuse to install backup files: $file"
  873. X          exit 0
  874. X        endif
  875. X        breaksw
  876. X    # Permission
  877. X    case "-p":
  878. X        shift
  879. X        set perm = "$argv[1]"
  880. X        breaksw
  881. X    # Set group
  882. X    case "-g":
  883. X        shift
  884. X        set group = "$argv[1]"
  885. X        breaksw
  886. X    # Hide file
  887. X    case "-h":
  888. X        set prefix = '.'
  889. X        breaksw
  890. X    # Copy instead of linking
  891. X    case "-c":
  892. X        set cmd = cp
  893. X        breaksw
  894. X    # File names
  895. X    default:
  896. X        break
  897. X    endsw
  898. X    shift
  899. Xend
  900. X
  901. Xif ( "${file}" != "" ) then 
  902. X    # If multiple links to a single file, strip it now
  903. X    if ( "${strip}" == "y" ) strip ${file}  
  904. X    # Same for protection and group
  905. X    if ( "x$group" != "x" ) chgrp ${group} ${file}
  906. X    if ( "x$perm" != "x-" ) chmod -f ${perm} ${file}
  907. Xendif
  908. X
  909. Xforeach new ( $argv[1-] )
  910. X    # Determine the name of the old file
  911. X    if ( "x$file" == "x" ) then
  912. X    set oldfile = "${new}"
  913. X    else
  914. X    set oldfile = "${file}"
  915. X    endif
  916. X    # Check if the old file exists and is readable
  917. X    if ( ! -r "${oldfile}" ) then
  918. X    echo "   File ${oldfile} does not exist."
  919. X    continue
  920. X    endif
  921. X    # Pathname of installed file
  922. X    set newfile = "${dest}/${prefix}${new:t}"
  923. X    rm -f ${newfile}
  924. X    # Do not install backup files
  925. X    if ( "x$new" =~ *~ ) then
  926. X      echo "   Ignored: backup file $new"
  927. X      continue
  928. X    endif
  929. X    # Establish link and chmod to executable/readable for world
  930. X    $cmd `pwd`/${oldfile} ${newfile}
  931. X    # Check if link/copy really exists
  932. X    if ( ! -r ${newfile} ) then
  933. X    echo "   Install failed: ${oldfile} => ${newfile}"
  934. X    continue
  935. X    endif
  936. X    if ( "${file}" == "" ) then
  937. X    # Change group?
  938. X    if ( "x$group" != "x" ) chgrp ${group} ${newfile}
  939. X    # Change protection bits?
  940. X    if ( "x$perm" != "x-" ) chmod -f ${perm} ${newfile}
  941. X    # Strip file?
  942. X    if ( "${strip}" == "y" ) strip ${newfile}
  943. X    endif
  944. X    if ( "${newfile:t}" == "${oldfile:t}" ) then
  945. X    echo "   Installed ${oldfile} in directory ${dest}"
  946. X    else
  947. X    echo "   Installed: ${oldfile} => ${newfile}"
  948. X    endif
  949. Xend
  950. X
  951. Xexit 0
  952. foo_bar_and_baz
  953. else
  954.   echo "will not overwrite ./rename/enter"
  955. fi
  956. if `test ! -s ./rename/rename.man`
  957. then
  958. echo "Extracting ./rename/rename.man"
  959. sed 's/^X//' > ./rename/rename.man << 'foo_bar_and_baz'
  960. X.TH RENAME 1J "5th March, 1987"
  961. X.SH NAME
  962. Xrename - change the names of a set of files
  963. X.SH SYNOPSIS
  964. X.I rename
  965. Xspecs... files...
  966. X.SH DESCRIPTION
  967. X.PP
  968. XRename will change the names of all the given files according to the
  969. Xreplacement instructions and flags supplied in 
  970. X.I specs.
  971. XThe following options are available:
  972. X.IP -i
  973. X(interactive) will prompt the user if the resulting file already exists.
  974. X.IP -v
  975. X(verbose) produces a verbose protocol of what the program does.
  976. X.IP -l
  977. X(lowercase) coerces all characters to lowercase characters before any
  978. Xsubstitutions are performed.
  979. X.IP -t
  980. X(trailing dot) remove any trailing dots from the file names before any
  981. Xsubstitutions are performed.
  982. X.IP -\fIn\fP
  983. X(cut chars) cut the first 
  984. X.I n
  985. Xcharacters off the original filename before any substitutions are performed.
  986. X.PP
  987. XThe valid replacement specifications are
  988. X.IP old=new
  989. XReplace all occurrences of
  990. X.I old
  991. Xin a file name by the string
  992. X.I new
  993. X(no recursive substitutions, replacement is done left to right).
  994. X.IP string=
  995. XDelete the substring 
  996. X.I string
  997. Xin all file names.
  998. X.IP ^prefix
  999. XUse this prefix for all file names.
  1000. X.IP =suffix
  1001. XAppend this suffix to all file names.
  1002. X
  1003. X.SH AUTHOR
  1004. XJuergen Wagner, CSLI, Stanford University (gandalf@csli.stanford.edu,
  1005. Xformerly at Fraunhofer-Institute IAO, Stuttgart, FRG)foo_bar_and_baz
  1006. else
  1007.   echo "will not overwrite ./rename/rename.man"
  1008. fi
  1009. echo "Finished archive 1 of 1"
  1010. # if you want to concatenate archives, remove anything after this line
  1011. cat < /dev/null > rename.1of1_done
  1012. MISSING=""
  1013. for I in 1 ; do
  1014.     if [ ! -f rename.${I}of1_done ]
  1015.     then
  1016.     MISSING="${MISSING} ${I}"
  1017.     fi
  1018. done
  1019. cp $0 /usr/tmp; rm -f $0
  1020. if [ "${MISSING}" = "" ]
  1021. then
  1022.   echo "You have unpacked the entire archive (1 pieces)."
  1023.   echo 'See file "rename/rename.man" for instructions.'
  1024.   rm -f rename.[0-9]*of1_done
  1025.   echo Archive files now reside on /usr/tmp.
  1026.   if [ -f ./.install ]
  1027.   then
  1028.     echo -n 'Starting up installation. Ok (y/n) ? '
  1029.     read ANSWER
  1030.     if [ "$ANSWER" = y ]
  1031.     then
  1032.       exec sh .install
  1033.     fi
  1034.   fi
  1035. else
  1036.   echo You still need to unpack the following pieces:
  1037.   echo "    " ${MISSING}
  1038. fi
  1039. exit 0
  1040.