[comp.sources.apple2] v001SRC042: conv -- Character Converter For Oraca

jac@yoko.rutgers.edu (Jonathan A. Chandross) (05/03/91)

Submitted-by: Jawaid Bazyar (bazyar@cs.uiuc.edu)
Posting-number: Volume 1, Source:42
Archive-name: util/gs/shell/orca/conv
Architecture: ONLY_2gs
Version-number: 1.2


conv performs the following conversions:
	lf <--> cr
	upper case --> lower case
	tabs --> spaces

It requires the ORCA shell to run.

Enjoy

###################################

=conv.doc
-============
-    CONV
-============
-
-Version 1.2
-
-CONV is a general purpose file format converter program.  Included with
-this version of CONV are the following translation options:
-
-   crlf       convert Apple text to Unix text
-   lfcr       convert Unix text to Apple text
-   lower      convert all the letters in a filename to lowercase
-   detab      converts the tabs in a file to spaces
-
-CONV (except for detab) is invoked with the following command:
-
-   conv -<option> <filename>...
-
-The detab operation is called slightly differently:
-
-   conv -detab <col> <filename>...
-
-The value <col> is a number indicating how many columns lie between tab
-stops.  Eight (8) is the value normally used in Unix (and the ORCA shell),
-and four (4) is good for C programs.  Note that CONV -detab does not blindly
-insert <col> spaces for every tab it finds.  It outputs enough spaces only to
-move to the next tab stop.
-
-Update Log:
-
-       CONV didn't support wildcards correctly in v1.0, an oversight.
-       It also now uses the GS/OS BeginSession call for better performance.
-       Of course the real bottleneck is the fact that CONV is written in C.
-       Bug me enough and I'll redo the necessary parts in assembly.
-
-Note:
-
-A filespec is a method of identifying files on a disk.  In the ORCA
-shell, a filespec can contain the = and ? wildcards, in addition to
-plain filenames.  CONV supports multiple filespecs, e.g.
-	conv -LFCR a.c b.c c.c d=.c
-etc.  Any combination of wildcarded and/or vanilla filespecs is allowed.
-This functionality, however, comes at a price.  CONV works only under
-the ORCA shell or a compatible.  At this time, there are no shells truly
-compatible with ORCA.
-
-----
-
-Jawaid Bazyar
-Derek Taubert
-
-Copyright 1990 by Procyon Software
-Freeware - distribute but don't sell!
-
-This utility is FreeWare.  Distribute them as much as you like, just
-don't sell them or distribute modified versions.  Send me your comments -
-I'm eager to hear from you for suggestions and improvements.
-
-Also, if you make any modifications to the code please do not redistribute
-them. Instead, send me the changed source along with an explanation and
-I will consider including your change in the next version.
-
-	Jawaid Bazyar
-	1120 Maple Street
-	Mt. Vernon, IL 62864
-
-	Internet/ARPAnet     bazyar@cs.uiuc.edu
-	GEnie                J.BAZYAR
-
=conv.c
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <gsos.h>
-#include <shell.h>
-
-void usage()
-{
-    printf("Usage: conv -<convspec> <filespec>... \n");
-    printf("  <convspec> is one of the following:\n");
-    printf("    CRLF  - convert CR to LF\n");
-    printf("    LFCR  - convert LF to CR\n");
-    printf("    lower - change the filename to lowercase\n");
-    printf("    detab <col> - convert tabs to spaces (tab stop every COL\
- columns)\n");
-    exit(1);
-}
-
-GSString255Ptr MakeGSString1(char *s)
-{
-GSString255Ptr n;
-    n = malloc(sizeof(GSString255));
-    strcpy((char *) n->text,s);
-    n->length = strlen(s);
-    return n;
-}
-
-main(argc,argv)
-int argc;
-char *argv[];
-{
-int x;
-FILE *i,*o;
-int c,d;
-int filecount;
-int curcolumn,tabColumns;
-FileInfoRecGS info;
-char expanded[65];
-Init_WildcardPB iwpb;
-Next_WildcardPB nwpb;
-int SessionPB = 0;
-
-    filecount = 2;
-    if (argc < 3) usage();
-    { int i;
-      i = 0;
-      while (argv[1][i] = tolower(argv[1][i++]));
-    }
-
-    if (!strcmp(argv[1],"-crlf"))
-        x = 1;
-    else if (!strcmp(argv[1],"-lfcr"))
-        x = 2;
-    else if (!strcmp(argv[1],"-lower"))
-        x = 3;
-    else if (!strcmp(argv[1],"-detab")) {
-        x = 4;
-        filecount = 3;
-        sscanf(argv[2],"%d",&tabColumns);
-    }
-    else { printf("Illegal conversion parameter %s\n",argv[1]);
-        usage(); }
-
-    BeginSessionGS(&SessionPB);
-    while (filecount < argc)
-    {
-      strcpy(expanded+1,argv[filecount]);
-      expanded[0] = strlen(argv[filecount]);
-      iwpb.w_file = expanded;
-      iwpb.flags = 0x8000;
-      INIT_WILDCARD(&iwpb);
-      nwpb.nextfile = expanded;
-      NEXT_WILDCARD(&nwpb);
-      expanded[expanded[0]+1] = 0;
-      while (strlen(expanded) != 0) {
-
-        if (x == 3) {
-        char *r,*p;
-            p = malloc(strlen(expanded+1)+1);
-            strcpy(p,expanded+1);
-            r = p;
-            while (*r != '\0') { if (isupper(*r)) *r = tolower(*r); r++; }
-            printf("New filename: %s\n",p);
-            rename(expanded+1,p);
-            free(p);
-            goto NextFile; /* sorry, I can't think of a better way to do this */
-        }
-
-        i = fopen(expanded+1,"rb");
-        o = fopen("tmp000","wb");
-        info.pCount = 4;
-        info.pathname = MakeGSString1(expanded+1);
-        GetFileInfoGS(&info);
-        curcolumn = 0;
-        printf("Converting %s",expanded+1);
-        while ((c = getc(i)) != EOF)
-        {
-            if (x == 1)
-            {
-                if (c == '\r') fputc(10,o);
-                else fputc(c,o);
-            }
-            else if (x == 2)
-            {
-                if (c == '\n') fputc('\r',o);
-                else fputc(c,o);
-            }
-            else if (x == 4)
-            {
-                switch (c)
-                {
-                    case '\t':
-                    { int i;
-                      for (i = (curcolumn % tabColumns); i < tabColumns; i++)
-                          {    fputc(' ',o); curcolumn++;   }
-                    }
-                    break;
-
-                    case '\n':
-                    case '\r': curcolumn = -1;
-
-                    default: curcolumn++;
-                             fputc(c,o);
-                }
-            }
-        }
-
-        fclose(i);
-        fclose(o);
-        remove(expanded+1);
-        rename("tmp000",expanded+1);
-        SetFileInfoGS(&info);
-        free(info.pathname);
-        printf("\n");
-
-NextFile:
-        NEXT_WILDCARD(&nwpb);
-        expanded[expanded[0]+1] = 0;
-      }
-      filecount++;
-    }
-    EndSessionGS(&SessionPB);
-}
-
+ END OF ARCHIVE