home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / pct.arc / SUBST.C < prev    next >
Text File  |  1986-03-30  |  2KB  |  115 lines

  1. /* change.c:    replace strings in text files */
  2.  
  3. #include <makearg.h>
  4.  
  5. #define MAXLINE 256
  6. #define MAXFILES 512
  7. int count = 0,
  8.     sensitive = 1;
  9.  
  10. main()
  11. {
  12.     char from[MAXLINE], to[MAXLINE];
  13.     
  14.     makeargv();     /* ..Must be first - builds args.. */
  15.  
  16.     if (argv[1][0] == '-' || argv[1][0] == '/')
  17.         if (tolower(argv[1][1]) == 'i')
  18.         {
  19.             sensitive = !sensitive;
  20.             --argc;
  21.             ++argv;
  22.         }
  23.         else
  24.         {
  25.             fprintf(stderr,"invalid option: %c\n",argv[1][1]);
  26.             exit(1);
  27.         }
  28.     
  29.     if (argc < 3)
  30.     {
  31.         fprintf(stderr,"usage:  subst [-i] from to [file1 file2 ...]\n");
  32.         exit(1);
  33.     }
  34.  
  35.     strcpy(from,argv[1]);
  36.     strcpy(to,argv[2]);
  37.     argc -= 2;
  38.     argv += 2;
  39.     
  40.     if (argc == 1)
  41.         change(from,to);
  42.     else
  43.     {
  44.         /* ..process each file.. */
  45.         while (*++argv)
  46.             if (freopen(*argv,"r",stdin) != NULL)
  47.                 change(from,to);
  48.             else
  49.                 fprintf(stderr,"can't open: %s\n",*argv);
  50.     }
  51.     fprintf(stderr,"\n%d substitutions.\n",count);
  52. }
  53.  
  54. change(from,to)
  55. char *from, *to;
  56. {
  57.     char s[MAXLINE], *subst();
  58.     
  59.     while (gets(s) != NULL)
  60.         puts(subst(s,from,to));
  61. }
  62.  
  63. char *subst(s,from,to)
  64. char *s, *from ,*to;
  65. {
  66.     int delta;
  67.     register char *p, *ptr;
  68.     char *q, *match();
  69.  
  70.     for (p = s; p = match(p,from); ++count)
  71.     {
  72.         q = p + strlen(from);
  73.         delta = strlen(from) - strlen(to);
  74.  
  75.         if (delta < 0)
  76.             for (ptr = p + strlen(p); ptr >= q; --ptr)
  77.                 *(ptr - delta) = *ptr;
  78.         else if (delta > 0)
  79.         {
  80.             ptr = q;
  81.             do
  82.                 *(ptr - delta) = *ptr;
  83.             while (*ptr++);
  84.         }
  85.  
  86.         ptr = to;
  87.         while (*ptr)
  88.             *p++ = *ptr++;
  89.     }
  90.     return s;
  91. }
  92.  
  93. char *match(s,pat)
  94. char *s, *pat;
  95. {
  96.     register char *p;
  97.  
  98.     for (p = s; *p; ++p)
  99.         if (compare(p,pat,strlen(pat)) == 0)
  100.             return p;
  101.     return NULL;
  102. }
  103.  
  104. int compare(s,t,n)
  105. char *s, *t;
  106. int n;
  107. {
  108.     char s1[MAXLINE], t1[MAXLINE];
  109.  
  110.     if (sensitive)
  111.         return strncmp(s,t,n);
  112.     else
  113.         return strncmp(strlower(s1,s),strlower(t1,t),n);
  114. }
  115.