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