mirror of
https://github.com/GnoConsortium/gno.git
synced 2025-02-01 07:31:11 +00:00
Released udl v1.13
This commit is contained in:
commit
9366028046
51
usr.orca.bin/udl/Makefile.gs
Normal file
51
usr.orca.bin/udl/Makefile.gs
Normal file
@ -0,0 +1,51 @@
|
||||
#
|
||||
# Makefile for udl
|
||||
# Copyright (c) 1993-1994 Soenke Behrens
|
||||
# For use with dmake
|
||||
#
|
||||
# $Id: Makefile.gs,v 1.1 1994/12/13 18:08:13 gdr Exp $
|
||||
#
|
||||
# Define the following as necessary:
|
||||
#
|
||||
# HAS_ATEXIT if your system has atexit()
|
||||
#
|
||||
# _POSIX_C_SOURCE and _POSIX_SOURCE if your compiler is Posix compliant
|
||||
#
|
||||
# READDIR_RETURNS_DOT if your direct readdir() function will return
|
||||
# entries for "." and "..". SunOS4 is known to do this.
|
||||
#
|
||||
# BROKEN_REALLOC if your realloc() doesn't behave like malloc() when
|
||||
# passed a NULL pointer as the first argument.
|
||||
#
|
||||
# GNO if you are compiling on the IIgs. This will allow for both
|
||||
# ':' and '/' as pathname separators.
|
||||
#
|
||||
# CHECK_STACK if you want stack usage to be displayed (IIgs only).
|
||||
# You will also have to specify -l/usr/lib/stack in LDFLAGS.
|
||||
|
||||
DEFINES = -DGNO -D_POSIX_C_SOURCE -D_POSIX_SOURCE -DHAS_ATEXIT -DCHECK_STACK
|
||||
CFLAGS = $(DEFINES) -G25 -w -v
|
||||
LDFLAGS = -v -l/usr/lib/stack -l/usr/lib/gnulib
|
||||
|
||||
#
|
||||
# You should not have to modify anything beyond this point
|
||||
#
|
||||
|
||||
udl: udl.o udluse.o udl.r common.o
|
||||
$(CC) $(LDFLAGS) -o udl udl.o udluse.o common.o
|
||||
copyfork udl.r udl
|
||||
|
||||
udl.o: udl.gs.c common.h
|
||||
$(CC) -c $(CFLAGS) -o udl.o udl.gs.c
|
||||
|
||||
install:
|
||||
cp -f udl /usr/local/bin
|
||||
cp -f udl.1 /usr/man/man1
|
||||
|
||||
clean:
|
||||
$(RM) *.o udl
|
||||
|
||||
dist:
|
||||
@echo "Sorry, automatic packing not supported yet"
|
||||
|
||||
common.o:: common.h
|
56
usr.orca.bin/udl/Makefile.unx
Normal file
56
usr.orca.bin/udl/Makefile.unx
Normal file
@ -0,0 +1,56 @@
|
||||
#
|
||||
# Makefile for udl
|
||||
# (c) 1993-1994 Soenke Behrens
|
||||
#
|
||||
# $Id: Makefile.unx,v 1.1 1994/12/13 18:08:16 gdr Exp $
|
||||
#
|
||||
# Define the following as necessary:
|
||||
#
|
||||
# HAS_ATEXIT if your system has atexit()
|
||||
#
|
||||
# _POSIX_C_SOURCE and _POSIX_SOURCE if your compiler is Posix compliant
|
||||
#
|
||||
# READDIR_RETURNS_DOT if your direct readdir() function will return
|
||||
# entries for "." and "..". SunOS4 is known to do this.
|
||||
#
|
||||
# BROKEN_REALLOC if your realloc() doesn't behave like malloc() when
|
||||
# passed a NULL pointer as the first argument.
|
||||
#
|
||||
|
||||
# If you're on SunOS 4.x systems, use gcc instead; this is ANSI code.
|
||||
CC = cc
|
||||
DESTDIR = /usr/local/
|
||||
BINDIR = bin
|
||||
MANDIR = man/man1
|
||||
INSTALL = cp -f
|
||||
|
||||
DEFINES = -DREADDIR_RETURNS_DOT=1 -DBROKEN_REALLOC=1 -D_POSIX_C_SOURCE \
|
||||
-D_POSIX_SOURCE
|
||||
CFLAGS = $(DEFINES) -O
|
||||
# You may need -lucb in LDFLAGS
|
||||
LDFLAGS =
|
||||
|
||||
#
|
||||
# You should not have to modify anything beyond this point
|
||||
#
|
||||
|
||||
udl: udl.o udluse.o common.o
|
||||
$(CC) $(LDFLAGS) -o udl udl.o udluse.o common.o
|
||||
|
||||
udl.o: udl.unix.c common.h
|
||||
$(CC) -c $(CFLAGS) -o udl.o udl.unix.c
|
||||
|
||||
install:
|
||||
$(INSTALL) udl $(DESTDIR)$(BINDIR)
|
||||
$(INSTALL) udl.1 $(DESTDIR)$(MANDIR)
|
||||
|
||||
clean:
|
||||
rm *.o
|
||||
|
||||
clobber: clean
|
||||
rm udl
|
||||
|
||||
dist:
|
||||
@echo 'Sorry, automatic packing not yet supported.'
|
||||
|
||||
common.o::common.h
|
74
usr.orca.bin/udl/README
Normal file
74
usr.orca.bin/udl/README
Normal file
@ -0,0 +1,74 @@
|
||||
=============================================================================
|
||||
udl - Convert EOL formats freely between MS-DOS (CR/LF), Unix/Amiga (LF),
|
||||
and Apple (CR).
|
||||
|
||||
(c) 1993-1994 Soenke Behrens
|
||||
|
||||
Version 1.13: $Id: README,v 1.1 1994/12/13 18:08:18 gdr Exp $
|
||||
=============================================================================
|
||||
|
||||
Udl converts text files between CR, LF and CR/LF (Apple, Unix and MS-DOS).
|
||||
It is a very fast utility that ensures that the integrity of the file
|
||||
cannot be compromised during the translation. It is also much easier
|
||||
to use than tr(1).
|
||||
|
||||
================
|
||||
Revision History:
|
||||
================
|
||||
|
||||
v1.01
|
||||
Tabs are left alone now. Also recognizes CR/LF (MeSsy-DOS).
|
||||
|
||||
v1.02
|
||||
Does no longer read in the complete file, instead creates a temp
|
||||
file in prefix 3/.
|
||||
|
||||
v1.03
|
||||
Fixed a bug, allocated not enough mem for strncpy.
|
||||
|
||||
v1.1
|
||||
Changed to use static GS/OS strings again. Made faster by factor
|
||||
5.8.
|
||||
|
||||
v1.11
|
||||
Cleaned the code up a bit, wrote a Makefile, all output by udl is
|
||||
prefixed with the name it was invoked with.
|
||||
|
||||
v1.12
|
||||
Sped up Apple <-> Unix conversion further (factor 1.5).
|
||||
|
||||
v1.12 (Unix)
|
||||
(December 1993)
|
||||
Modified source to produce a Unix version
|
||||
|
||||
v1.13
|
||||
(Updated by Devin Reade, November 1994)
|
||||
Added ability to recurse through directories (-R flag).
|
||||
Changed behavior to ignore binary files rather than exiting.
|
||||
Merged Unix and Apple IIgs versions.
|
||||
|
||||
=========
|
||||
Compiling:
|
||||
=========
|
||||
|
||||
There are two makefiles included:
|
||||
Makefile.gs - for use on the Apple IIgs running Gno
|
||||
Makefile.unix - for use with Unix systems.
|
||||
|
||||
Although udl on the IIgs can be run from either Gno or Orca shells,
|
||||
it cannot be built with the standard Orca installation due to a lack
|
||||
of additional libraries.
|
||||
|
||||
Before you type "make", have a look at the Makefile and edit the defines
|
||||
to your liking.
|
||||
|
||||
Also, udl.c assumes that getopt() is declared in <unistd.h> and that
|
||||
the function strdup() exists in <string.h>. You might want to change
|
||||
these includes if that's not the case.
|
||||
|
||||
=============================================================================
|
||||
Enjoy,
|
||||
|
||||
Soenke
|
||||
schaf@meadow.muc.de
|
||||
December 1993
|
839
usr.orca.bin/udl/common.c
Normal file
839
usr.orca.bin/udl/common.c
Normal file
@ -0,0 +1,839 @@
|
||||
/*
|
||||
* udl - Convert EOL formats freely between MS-DOS (CR/LF), Unix/Amiga (LF),
|
||||
* and Apple (CR).
|
||||
*
|
||||
* Routines common to both the Unix and Apple IIgs versions.
|
||||
*
|
||||
* $Id: common.c,v 1.1 1994/12/13 18:08:20 gdr Exp $
|
||||
*
|
||||
* Copyright (c) 1993-1994 Soenke Behrens
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
extern char *strdup(const char *);
|
||||
|
||||
/*
|
||||
* convert_gs() ... convert files to use CR as EOL
|
||||
*
|
||||
* Inputs:
|
||||
* FILE *infile File to read from
|
||||
* FILE *outfile File to write to
|
||||
*
|
||||
* Outputs:
|
||||
* None
|
||||
*/
|
||||
|
||||
void convert_gs(FILE *infile, FILE *outfile) {
|
||||
unsigned char a;
|
||||
unsigned char *in_bufpos;
|
||||
unsigned char *out_bufpos;
|
||||
unsigned char *in_bufend;
|
||||
unsigned char *out_bufend;
|
||||
size_t file_remain;
|
||||
|
||||
in_bufpos = in_buffer;
|
||||
out_bufpos = out_buffer;
|
||||
|
||||
(void) fseek(infile,0L,SEEK_END);
|
||||
file_remain = ftell(infile);
|
||||
rewind(infile);
|
||||
|
||||
in_bufend = in_buffer + my_fread(infile,BUFFERSIZE);
|
||||
out_bufend = out_buffer + BUFFERSIZE;
|
||||
|
||||
while (file_remain != 0) {
|
||||
a = *in_bufpos;
|
||||
in_bufpos++;
|
||||
|
||||
if (in_bufpos >= in_bufend) {
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile,BUFFERSIZE);
|
||||
in_bufpos = in_buffer;
|
||||
}
|
||||
/* a = fgetc (infile); */
|
||||
|
||||
if(a == '\n') {
|
||||
*out_bufpos = '\r';
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc('\r',outfile); */
|
||||
} else if(a == '\r') {
|
||||
*out_bufpos = '\r';
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc('\r',outfile); */
|
||||
|
||||
if (*in_bufpos == '\n' && file_remain != 0) {
|
||||
in_bufpos++;
|
||||
|
||||
if (in_bufpos >= in_bufend) {
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
in_bufpos = in_buffer;
|
||||
}
|
||||
}
|
||||
/* if ((a = fgetc (infile)) != '\n')
|
||||
ungetc (a,infile); */
|
||||
} else {
|
||||
*out_bufpos = a;
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc(a,outfile); */
|
||||
}
|
||||
}
|
||||
/* Check for remainder in output buffer */
|
||||
if (out_bufpos != out_buffer)
|
||||
my_fwrite(out_buffer,outfile,out_bufpos - out_buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* convert_messy() ... convert files to use CR/LF as EOL
|
||||
*
|
||||
* Inputs:
|
||||
* FILE *infile File to read from
|
||||
* FILE *outfile File to write to
|
||||
*
|
||||
* Outputs:
|
||||
* None
|
||||
*/
|
||||
|
||||
void convert_messy (FILE *infile, FILE *outfile) {
|
||||
unsigned char a;
|
||||
unsigned char *in_bufpos;
|
||||
unsigned char *out_bufpos;
|
||||
unsigned char *in_bufend;
|
||||
unsigned char *out_bufend;
|
||||
size_t file_remain;
|
||||
|
||||
in_bufpos = in_buffer;
|
||||
out_bufpos = out_buffer;
|
||||
|
||||
(void) fseek(infile,0L,SEEK_END);
|
||||
file_remain = ftell(infile);
|
||||
rewind(infile);
|
||||
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
out_bufend = out_buffer + BUFFERSIZE;
|
||||
|
||||
while (file_remain != 0) {
|
||||
a = *in_bufpos;
|
||||
in_bufpos++;
|
||||
|
||||
if (in_bufpos >= in_bufend) {
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
in_bufpos = in_buffer;
|
||||
}
|
||||
/* a = fgetc (infile); */
|
||||
|
||||
if(a == '\n') {
|
||||
*out_bufpos = '\r';
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc('\r',outfile); */
|
||||
|
||||
*out_bufpos = '\n';
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc('\n',outfile); */
|
||||
} else if(a == '\r') {
|
||||
*out_bufpos = '\r';
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc('\r',outfile); */
|
||||
|
||||
*out_bufpos = '\n';
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc('\n',outfile); */
|
||||
|
||||
if (*in_bufpos == '\n' && file_remain != 0) {
|
||||
in_bufpos++;
|
||||
|
||||
if (in_bufpos >= in_bufend) {
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
in_bufpos = in_buffer;
|
||||
}
|
||||
}
|
||||
/* if ((a = fgetc (infile)) != '\n')
|
||||
ungetc (a,infile); */
|
||||
} else {
|
||||
*out_bufpos = a;
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc(a,outfile); */
|
||||
}
|
||||
}
|
||||
/* Check for remained in output buffer */
|
||||
if (out_bufpos != out_buffer)
|
||||
my_fwrite(out_buffer,outfile,out_bufpos - out_buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* convert_tunix() ... convert files to use LF as EOL
|
||||
*
|
||||
* Inputs:
|
||||
* FILE *infile File to read from
|
||||
* FILE *outfile File to write to
|
||||
*
|
||||
* Outputs:
|
||||
* None
|
||||
*/
|
||||
|
||||
void convert_tunix (FILE *infile, FILE *outfile) {
|
||||
unsigned char a;
|
||||
unsigned char *in_bufpos;
|
||||
unsigned char *out_bufpos;
|
||||
unsigned char *in_bufend;
|
||||
unsigned char *out_bufend;
|
||||
size_t file_remain;
|
||||
|
||||
in_bufpos = in_buffer;
|
||||
out_bufpos = out_buffer;
|
||||
|
||||
(void) fseek(infile,0L,SEEK_END);
|
||||
file_remain = ftell(infile);
|
||||
rewind(infile);
|
||||
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
out_bufend = out_buffer + BUFFERSIZE;
|
||||
|
||||
while (file_remain != 0) {
|
||||
a = *in_bufpos;
|
||||
in_bufpos++;
|
||||
|
||||
if (in_bufpos >= in_bufend) {
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
in_bufpos = in_buffer;
|
||||
}
|
||||
/* a = fgetc (infile); */
|
||||
|
||||
if(a == '\r') {
|
||||
*out_bufpos = '\n';
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc('\n',outfile); */
|
||||
|
||||
if (*in_bufpos == '\n' && file_remain != 0) {
|
||||
in_bufpos++;
|
||||
|
||||
if (in_bufpos >= in_bufend) {
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
in_bufpos = in_buffer;
|
||||
}
|
||||
}
|
||||
/* if ((a = fgetc (infile)) != '\n')
|
||||
ungetc (a,infile); */
|
||||
} else {
|
||||
*out_bufpos = a;
|
||||
out_bufpos++;
|
||||
if (out_bufpos == out_bufend) {
|
||||
my_fwrite(out_buffer,outfile,BUFFERSIZE);
|
||||
out_bufpos = out_buffer;
|
||||
}
|
||||
/* fputc(a,outfile); */
|
||||
}
|
||||
}
|
||||
/* Check for remainder in output buffer */
|
||||
if (out_bufpos != out_buffer)
|
||||
my_fwrite(out_buffer,outfile,out_bufpos - out_buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* convert_fast_gs() ... convert files to use CR as EOL
|
||||
* Do not care about differing EOL chars in the same file,
|
||||
* do not allow '\0' bytes, and replace in-vitro if possible.
|
||||
*
|
||||
* Inputs:
|
||||
* FILE *infile File to read from
|
||||
* FILE *outfile File to write to
|
||||
*
|
||||
* Outputs:
|
||||
* int FALSE if no conversion took place, TRUE otherwise
|
||||
*/
|
||||
|
||||
int convert_fast_gs(FILE *infile, FILE *outfile) {
|
||||
unsigned char a;
|
||||
unsigned char *in_bufpos;
|
||||
unsigned char *out_bufpos;
|
||||
unsigned char *in_bufend;
|
||||
unsigned char *out_bufend;
|
||||
size_t file_remain;
|
||||
enum file_format infile_type;
|
||||
|
||||
in_bufpos = in_buffer;
|
||||
out_bufpos = out_buffer;
|
||||
|
||||
(void) fseek(infile,0L,SEEK_END);
|
||||
file_remain = ftell(infile);
|
||||
rewind(infile);
|
||||
|
||||
in_bufend = in_buffer + my_fread(infile,BUFFERSIZE);
|
||||
out_bufend = out_buffer + BUFFERSIZE;
|
||||
*in_bufend = '\0';
|
||||
|
||||
infile_type = get_file_format (in_buffer);
|
||||
|
||||
switch (infile_type) {
|
||||
case apple:
|
||||
if (verbose)
|
||||
printf("%s: %s is already in Apple format, skipping.\n",
|
||||
program_name,current_file);
|
||||
return (FALSE);
|
||||
break;
|
||||
|
||||
case tunix:
|
||||
/* Replace "in-vitro", so out_buffer isn't used */
|
||||
while (file_remain != 0) {
|
||||
a = *in_bufpos;
|
||||
if (a == '\n')
|
||||
*in_bufpos++ = '\r';
|
||||
else if (a == '\0') { /* End of buffer reached */
|
||||
|
||||
/* Write changed buffer out */
|
||||
my_fwrite(in_buffer,outfile,in_bufend - in_buffer);
|
||||
|
||||
/* And reload it */
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
*in_bufend = '\0';
|
||||
in_bufpos = in_buffer;
|
||||
} else in_bufpos++;
|
||||
}
|
||||
return (TRUE);
|
||||
break;
|
||||
|
||||
case dos:
|
||||
/* This I couldn't speed up, so use the existing thing */
|
||||
convert_gs (infile, outfile);
|
||||
return (TRUE);
|
||||
break;
|
||||
|
||||
case binary:
|
||||
return (FALSE);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,"%s: Fatal internal error\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
break;
|
||||
} /* switch */
|
||||
}
|
||||
|
||||
/*
|
||||
* convert_fast_messy() ... convert files to use CR/LF as EOL
|
||||
* Just check if it's already in DOS format.
|
||||
*
|
||||
* Inputs:
|
||||
* FILE *infile File to read from
|
||||
* FILE *outfile File to write to
|
||||
*
|
||||
* Outputs:
|
||||
* int FALSE if no conversion took place, TRUE otherwise
|
||||
*/
|
||||
|
||||
int convert_fast_messy (FILE *infile, FILE *outfile) {
|
||||
unsigned char *in_bufpos;
|
||||
unsigned char *out_bufpos;
|
||||
unsigned char *in_bufend;
|
||||
unsigned char *out_bufend;
|
||||
size_t file_remain;
|
||||
enum file_format infile_type;
|
||||
|
||||
in_bufpos = in_buffer;
|
||||
out_bufpos = out_buffer;
|
||||
|
||||
(void) fseek(infile,0L,SEEK_END);
|
||||
file_remain = ftell(infile);
|
||||
rewind(infile);
|
||||
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
out_bufend = out_buffer + BUFFERSIZE;
|
||||
*in_bufend = '\0';
|
||||
|
||||
infile_type = get_file_format (in_buffer);
|
||||
|
||||
switch (infile_type) {
|
||||
case dos:
|
||||
if (verbose)
|
||||
printf("%s: %s is already in MS-DOS format, skipping.\n",
|
||||
program_name,current_file);
|
||||
return (FALSE);
|
||||
break;
|
||||
|
||||
case tunix: /* drop through */
|
||||
case apple:
|
||||
/* Wasn't able to speed this up, call old routine */
|
||||
convert_messy (infile, outfile);
|
||||
return (TRUE);
|
||||
break;
|
||||
|
||||
case binary:
|
||||
return (FALSE);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,"%s: Fatal internal error\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
break;
|
||||
} /* switch */
|
||||
}
|
||||
|
||||
/*
|
||||
* convert_fast_tunix() ... convert files to use LF as EOL
|
||||
* Do not care about differing EOL chars in the same file,
|
||||
* do not allow '\0' bytes, and replace in-vitro if possible.
|
||||
*
|
||||
* Inputs:
|
||||
* FILE *infile File to read from
|
||||
* FILE *outfile File to write to
|
||||
*
|
||||
* Outputs:
|
||||
* int FALSE if no conversion took place, TRUE otherwise
|
||||
*/
|
||||
|
||||
int convert_fast_tunix (FILE *infile, FILE *outfile) {
|
||||
unsigned char a;
|
||||
unsigned char *in_bufpos;
|
||||
unsigned char *out_bufpos;
|
||||
unsigned char *in_bufend;
|
||||
unsigned char *out_bufend;
|
||||
size_t file_remain;
|
||||
enum file_format infile_type;
|
||||
|
||||
in_bufpos = in_buffer;
|
||||
out_bufpos = out_buffer;
|
||||
|
||||
(void) fseek(infile,0L,SEEK_END);
|
||||
file_remain = ftell(infile);
|
||||
rewind(infile);
|
||||
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
out_bufend = out_buffer + BUFFERSIZE;
|
||||
*in_bufend = '\0';
|
||||
|
||||
infile_type = get_file_format (in_buffer);
|
||||
|
||||
switch (infile_type) {
|
||||
case tunix:
|
||||
if (verbose)
|
||||
printf("%s: %s is already in Unix format, skipping.\n",
|
||||
program_name,current_file);
|
||||
return (FALSE);
|
||||
break;
|
||||
|
||||
case apple:
|
||||
/* Replace "in-vitro", so out_buffer isn't used */
|
||||
while (file_remain != 0) {
|
||||
a = *in_bufpos;
|
||||
if (a == '\r')
|
||||
*in_bufpos++ = '\n';
|
||||
else if (a == '\0'){ /* End of buffer reached */
|
||||
|
||||
/* Write changed buffer out */
|
||||
my_fwrite(in_buffer,outfile,in_bufend - in_buffer);
|
||||
|
||||
/* And reload */
|
||||
file_remain -= in_bufend - in_buffer;
|
||||
in_bufend = in_buffer + my_fread(infile, BUFFERSIZE);
|
||||
*in_bufend = '\0';
|
||||
in_bufpos = in_buffer;
|
||||
} else in_bufpos++;
|
||||
}
|
||||
return (TRUE);
|
||||
break;
|
||||
|
||||
case dos:
|
||||
/* Couldn't speed it up, so use old routine */
|
||||
convert_tunix (infile, outfile);
|
||||
return (TRUE);
|
||||
break;
|
||||
|
||||
case binary:
|
||||
return (FALSE);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,"%s: Fatal internal error\n", program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
break;
|
||||
} /* switch */
|
||||
}
|
||||
|
||||
/*
|
||||
* get_file_format() ... look at a buffer and find out what the EOL
|
||||
* character is. If no EOL character is found, print an error message
|
||||
* and exit.
|
||||
*
|
||||
* Inputs:
|
||||
* unsigned char *buffer Buffer to search through, terminated
|
||||
* by '\0'.
|
||||
*
|
||||
* Output:
|
||||
* enum file_format tunix, dos, apple, or binary
|
||||
*/
|
||||
|
||||
enum file_format get_file_format (unsigned char *buffer) {
|
||||
unsigned char c;
|
||||
enum file_format result = 0;
|
||||
|
||||
while ((c = *buffer++) != '\0') {
|
||||
if (c == '\n') {
|
||||
result = tunix;
|
||||
break;
|
||||
} else if (c == '\r') {
|
||||
if (*buffer == '\n')
|
||||
result = dos;
|
||||
else
|
||||
result = apple;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (result == 0) {
|
||||
if (verbose)
|
||||
printf("%s: No EOL found on the first %d bytes "
|
||||
"of %s. Might be a binary file. File skipped\n",
|
||||
program_name,BUFFERSIZE, current_file);
|
||||
result = binary;
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
/*
|
||||
* tryopen() ... try to open a file, exit if unsuccesful
|
||||
*
|
||||
* Inputs:
|
||||
* char *name Name of file to be opened
|
||||
* char *mode Mode string for fopen() call
|
||||
*
|
||||
* Output:
|
||||
* FILE * File identifier of successful fopen()
|
||||
*/
|
||||
|
||||
FILE *tryopen (char *name, char *mode) {
|
||||
FILE *tmp;
|
||||
|
||||
if ((tmp = fopen(name,mode)) == NULL) {
|
||||
fprintf(stderr,"%s: Unable to open file %s\n",program_name, name);
|
||||
exit (EXIT_FAILURE);
|
||||
} else
|
||||
return (tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
* my_fread() ... read data into global buffer and exit if I fail
|
||||
*
|
||||
* Inputs:
|
||||
* FILE *infile File to read from
|
||||
* int howmuch Number of bytes to read
|
||||
*
|
||||
* Output:
|
||||
* int Number of bytes actually read
|
||||
*/
|
||||
|
||||
int my_fread(FILE *infile, int howmuch) {
|
||||
int result;
|
||||
|
||||
result = fread(in_buffer, 1, howmuch, infile);
|
||||
if (ferror(infile)) {
|
||||
fprintf(stderr,"%s: Error while reading data\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
/*
|
||||
* my_fwrite() ... write data from global buffer to file
|
||||
*
|
||||
* Inputs:
|
||||
* unsigned char *buffer Buffer to write out
|
||||
* FILE *outfile File to write to
|
||||
* int howmuch Number of bytes to write
|
||||
*
|
||||
* Output:
|
||||
* None
|
||||
*/
|
||||
|
||||
void my_fwrite (unsigned char *buffer, FILE *outfile, int howmuch) {
|
||||
fwrite(buffer, 1, howmuch, outfile);
|
||||
if (ferror(outfile)) {
|
||||
fprintf(stderr,"%s: Error while writing data\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* copy_file() ... copies a file to another, creates the destination file.
|
||||
*
|
||||
* Inputs:
|
||||
* char *from Name of file to copy from
|
||||
* char *to Name of file to create and copy to
|
||||
*
|
||||
* Output:
|
||||
* None
|
||||
*/
|
||||
|
||||
void copy_file (char *from, char *to) {
|
||||
FILE *fp1, *fp2;
|
||||
unsigned char *buffer;
|
||||
size_t length;
|
||||
|
||||
if((buffer = malloc(BUFFERSIZE)) == NULL) {
|
||||
fprintf(stderr,"%s: memory allocation failure\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
fp1 = tryopen (from,"rb");
|
||||
fp2 = tryopen (to,"wb");
|
||||
|
||||
while (!feof (fp1)) {
|
||||
length = fread(buffer,1,BUFFERSIZE,fp1);
|
||||
if (ferror(fp1)) {
|
||||
fprintf(stderr,"%s: Error while trying to read %s\n",
|
||||
program_name, from);
|
||||
free (buffer);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (fwrite(buffer,1,length,fp2) != length) {
|
||||
fprintf(stderr,"%s: Error while trying to write out "
|
||||
"file %s\n",program_name,to);
|
||||
free (buffer);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
if (fclose (fp1) == EOF || fclose (fp2) == EOF) {
|
||||
perror ("closing files");
|
||||
free (buffer);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* cleanup() ... called in case of an exit(). Frees memory I allocated.
|
||||
*
|
||||
* Inputs:
|
||||
* None
|
||||
*
|
||||
* Output:
|
||||
* None
|
||||
*/
|
||||
|
||||
void cleanup (void) {
|
||||
char **p;
|
||||
|
||||
free (program_name);
|
||||
free (current_file);
|
||||
free (in_buffer);
|
||||
free (out_buffer);
|
||||
if (pathList) {
|
||||
p = pathList;
|
||||
while(*p) free(*p++);
|
||||
free (pathList);
|
||||
}
|
||||
|
||||
if (tempfile)
|
||||
remove (tempfile);
|
||||
}
|
||||
|
||||
/*
|
||||
* usage() ... print out a usage string gotten from udluse.c
|
||||
*
|
||||
* Inputs:
|
||||
* None
|
||||
*
|
||||
* Outputs:
|
||||
* None
|
||||
*/
|
||||
|
||||
void usage (void) {
|
||||
extern char use1[]; /* from udluse.c */
|
||||
extern char use2[];
|
||||
|
||||
fprintf(stderr,"%s",use1);
|
||||
#ifdef GNO
|
||||
if(!needsgno())
|
||||
fprintf(stderr,"%s",use2);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* build_file_list() build the list of files to process
|
||||
*
|
||||
* Precondition:
|
||||
* file is the file name to be added to the pathList
|
||||
* recurse if non-zero, directories will be recursed
|
||||
*
|
||||
* Postcondition:
|
||||
* pathList will be a NULL-terminated array of strings. Each
|
||||
* string is a partial pathname (relative to rootdir) of a file
|
||||
* to convert.
|
||||
*
|
||||
* Note: This is a recursive routine that uses up (3 * sizeof(char *))
|
||||
* bytes of stack with each level of subdirectories.
|
||||
*/
|
||||
|
||||
|
||||
void build_file_list(char *file, short recurse) {
|
||||
char *thisdir;
|
||||
DIR *dir;
|
||||
struct dirent *entry;
|
||||
|
||||
if (stat(file,&tstat)!=0) {
|
||||
fprintf(stderr,"%s: Couldn't stat %s. File skipped\n",program_name,file);
|
||||
return;
|
||||
}
|
||||
|
||||
if (recurse && S_ISDIR(tstat.st_mode)) {
|
||||
char tstr[2];
|
||||
|
||||
/*
|
||||
* It is a directory. recurse through it.
|
||||
*/
|
||||
|
||||
/* save our state */
|
||||
tstr[0] = dirbrk;
|
||||
tstr[1] = '\0';
|
||||
if (*currentDirectory) {
|
||||
thisdir = strdup(currentDirectory);
|
||||
} else {
|
||||
thisdir = malloc(1);
|
||||
if (thisdir != NULL) *thisdir='\0';
|
||||
}
|
||||
if (thisdir == NULL) {
|
||||
perror("Couldn't duplicate current directory");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (*currentDirectory) strcat(currentDirectory,tstr);
|
||||
strcat(currentDirectory,file);
|
||||
|
||||
/* recurse */
|
||||
if ((dir = opendir(file)) == NULL) {
|
||||
fprintf(stderr,"%s: Couldn't open %s. Directory skipped.\n",
|
||||
program_name,currentDirectory);
|
||||
} else {
|
||||
if (chdir(file) !=0) {
|
||||
fprintf(stderr,"couldn't cd to %s\n",currentDirectory);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
#ifdef READDIR_RETURNS_DOT
|
||||
entry = readdir(dir); /* for "." */
|
||||
entry = readdir(dir); /* for ".." */
|
||||
#endif
|
||||
|
||||
while ((entry = readdir(dir))!=NULL) {
|
||||
/* ignore hidden files */
|
||||
if (*(entry->d_name)!='.') build_file_list(entry->d_name,1);
|
||||
}
|
||||
|
||||
if (*thisdir) {
|
||||
if ((chdir(rootdir)!=0) || (chdir(thisdir)!=0)) {
|
||||
fprintf(stderr,"couldn't cd to %s\n",thisdir);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
} else {
|
||||
if (chdir(rootdir)!=0) {
|
||||
fprintf(stderr,"couldn't cd to calling directory\n");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* restore our state */
|
||||
strcpy(currentDirectory,thisdir);
|
||||
free(thisdir);
|
||||
|
||||
} else if (S_ISREG(tstat.st_mode)) {
|
||||
|
||||
/* It is a normal file. Add it to the pathList */
|
||||
add_to_pathList(currentDirectory, file);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void add_to_pathList(char *thisdir, char *file) {
|
||||
char **p;
|
||||
|
||||
/* expand the pathList if necessary */
|
||||
if (pathSlotsUsed >= pathSlots) {
|
||||
pathSlots += PATHLIST_QUANTUM;
|
||||
#if BROKEN_REALLOC
|
||||
if ((pathList==NULL) &&
|
||||
((pathList = malloc((pathSlots+1) * sizeof(char *)))==NULL)) {
|
||||
fprintf(stderr,"%s: Couldn't expand pathList\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
} else {
|
||||
if ((p = realloc(pathList, (pathSlots+1) * sizeof(char *)))==NULL) {
|
||||
fprintf(stderr,"%s: Couldn't expand pathList\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
pathList = p;
|
||||
}
|
||||
#else
|
||||
if ((p = realloc(pathList,(pathSlots+1) * sizeof(char *)))==NULL) {
|
||||
fprintf(stderr,"%s: Couldn't expand pathList\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
} else pathList = p;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* add in the current directory and filename to the pathList */
|
||||
pathList[pathSlotsUsed] = malloc(strlen(thisdir)+strlen(file)+2);
|
||||
if (pathList[pathSlotsUsed] == NULL) {
|
||||
fprintf(stderr,"%s: Couldn't duplicate filename %s%c%s\n",program_name,
|
||||
thisdir,dirbrk,file);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
if (*thisdir) {
|
||||
sprintf(pathList[pathSlotsUsed],"%s%c%s",thisdir,dirbrk,file);
|
||||
} else {
|
||||
strcpy(pathList[pathSlotsUsed],file);
|
||||
}
|
||||
pathSlotsUsed++;
|
||||
pathList[pathSlotsUsed] = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
/* End Of File */
|
98
usr.orca.bin/udl/common.h
Normal file
98
usr.orca.bin/udl/common.h
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* udl - Convert EOL formats freely between MS-DOS (CR/LF), Unix/Amiga (LF),
|
||||
* and Apple (CR).
|
||||
*
|
||||
* Header file for routines common to both the Unix and Apple IIgs versions.
|
||||
*
|
||||
* $Id: common.h,v 1.1 1994/12/13 18:08:23 gdr Exp $
|
||||
*
|
||||
* Copyright (c) 1993-1994 Soenke Behrens
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#define BUFFERSIZE 0x2000
|
||||
#define PATHLIST_QUANTUM 20
|
||||
#define UDL_VERSION "Version 1.13"
|
||||
|
||||
#ifndef FALSE
|
||||
# define FALSE 0
|
||||
# define TRUE !FALSE
|
||||
#endif
|
||||
|
||||
/* we use this macro for macro definitions/declarations */
|
||||
#ifdef MAIN
|
||||
# define EXTERN
|
||||
#else
|
||||
# define EXTERN extern
|
||||
#endif
|
||||
|
||||
#ifndef EXIT_FAILURE
|
||||
# define EXIT_FAILURE 1
|
||||
# define EXIT_SUCCESS 0
|
||||
#endif
|
||||
|
||||
#ifdef HAS_ATEXIT
|
||||
# define EXIT(a) exit(a)
|
||||
#else
|
||||
# define EXIT(a) { cleanup(); exit(a); }
|
||||
#endif
|
||||
|
||||
enum file_format { tunix = 1, dos, apple, binary };
|
||||
|
||||
/* Since udl is so small, I dare to use some globals :) */
|
||||
EXTERN char *program_name; /* How was udl invoked? */
|
||||
EXTERN char *current_file; /* Name of current file */
|
||||
EXTERN char *tempfile; /* Name of temporary file */
|
||||
EXTERN unsigned char *in_buffer; /* My own buffering scheme instead of */
|
||||
EXTERN unsigned char *out_buffer; /* setvbuf() */
|
||||
EXTERN int verbose;
|
||||
EXTERN char filebuffer[MAXPATHLEN]; /* a scratch buffer for file names */
|
||||
EXTERN char currentDirectory[MAXPATHLEN];
|
||||
EXTERN char rootdir[MAXPATHLEN]; /* the initial directory */
|
||||
EXTERN struct stat tstat; /* temporary variable used to stat files */
|
||||
EXTERN int pathSlotsUsed; /* number of used and available slots in pathList,*/
|
||||
EXTERN int pathSlots; /* respectively. Both are initially zero. */
|
||||
EXTERN char **pathList; /* the list of files to process, given relative */
|
||||
/* to the initial directory. Initially NULL, */
|
||||
/* and NULL terminated. */
|
||||
EXTERN char dirbrk; /* the character used to separate parts of a path name */
|
||||
EXTERN int recursionDepth; /* levels of subdirectories that we've traversed */
|
||||
extern int optind; /* part of getopt library */
|
||||
extern int opterr;
|
||||
|
||||
/* Prototypes of functions in common.c */
|
||||
|
||||
extern void convert_gs (FILE *infile, FILE *outfile);
|
||||
extern void convert_messy (FILE *infile, FILE *outfile);
|
||||
extern void convert_tunix (FILE *infile, FILE *outfile);
|
||||
extern int convert_fast_gs (FILE *infile, FILE *outfile);
|
||||
extern int convert_fast_messy (FILE *infile, FILE *outfile);
|
||||
extern int convert_fast_tunix (FILE *infile, FILE *outfile);
|
||||
extern enum file_format get_file_format (unsigned char *buffer);
|
||||
extern FILE *tryopen (char *file, char *mode);
|
||||
extern int my_fread (FILE *infile, int howmuch);
|
||||
extern void my_fwrite (unsigned char *buffer, FILE *outfile, int howmuch);
|
||||
extern void copy_file (char *from, char *to);
|
||||
extern void cleanup (void);
|
||||
extern void usage (void);
|
||||
extern void build_file_list(char *file, short recurse);
|
||||
extern void add_to_pathList(char *thisdir, char *file);
|
||||
|
||||
extern int needsgno(void);
|
||||
|
||||
/* not strictly necessary, but it cuts down on warnings from gcc */
|
||||
#ifdef __GNUC__
|
||||
extern char *getwd(char *);
|
||||
extern char getopt(int, char **, char *);
|
||||
#endif
|
85
usr.orca.bin/udl/udl.1
Normal file
85
usr.orca.bin/udl/udl.1
Normal file
@ -0,0 +1,85 @@
|
||||
.\" Copyright (c) 1993-1994 Soenke Behrens
|
||||
.\" $Id: udl.1,v 1.1 1994/12/13 18:08:26 gdr Exp $
|
||||
.TH UDL 1 "22 November 1994" "Version 1.13" "Commands and Applications"
|
||||
.SH NAME
|
||||
udl - convert text files between different architectures
|
||||
.SH SYNOPSIS
|
||||
.BR udl
|
||||
.BR -u | m | g
|
||||
[
|
||||
.B -Rv
|
||||
]
|
||||
.I file1
|
||||
[
|
||||
.IR file2 " ..."
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.B udl
|
||||
converts files between different computer systems by changing the EOL
|
||||
(End-Of-Line) character. It does
|
||||
.I not
|
||||
do a plausability check, so the user has to make sure udl is not invoked
|
||||
on object files or the like.
|
||||
.PP
|
||||
.B udl
|
||||
creates a temporary file the size of the file it is currently working on
|
||||
while it's doing its thing.
|
||||
.PP
|
||||
When running under Byteworks' ORCA shell, the Orca shell wildcards
|
||||
.BR =
|
||||
and
|
||||
.BR ?
|
||||
are properly expanded in file names.
|
||||
.SH OPTIONS
|
||||
.IP \fB\-u\fP
|
||||
Convert to use LF as EOL (Unix/Amiga).
|
||||
.IP \fB\-m\fP
|
||||
Convert to use CR/LF as EOL (MS-DOS).
|
||||
.IP \fB\-g\fP
|
||||
Convert to use CR as EOL (Apple).
|
||||
.IP \fB\-p\fP
|
||||
Be pedantic, only affects Unix<->Apple conversions, see below.
|
||||
.IP \fB\-R\fP
|
||||
Recurse through subdirectories.
|
||||
.IP \fB\-v\fP
|
||||
Be verbose, show the file udl is currently working on.
|
||||
.PP
|
||||
If you specify the
|
||||
.B -p
|
||||
switch,
|
||||
.B udl
|
||||
is pedantic while doing the conversion. This means: The input file may
|
||||
contain bytes with a value of zero (0), and the input file may contain
|
||||
different EOL characters (i.e., MS-DOS and Unix style might be mixed in
|
||||
one file). For conversions to or from MS-DOS,
|
||||
.B udl
|
||||
is always pedantic, so this only affects conversions from Unix to Apple
|
||||
or vice versa. Being pedantic slows udl down by a factor of 1.5.
|
||||
.PP
|
||||
If
|
||||
.B udl
|
||||
is given a file that seems to be a binary file \(that is, no EOL is
|
||||
found in the first part of the file\), the file will be skipped. No
|
||||
notice is given of this unless the
|
||||
.B -v
|
||||
flag is used.
|
||||
.SH BUGS
|
||||
When compiling on some Solaris installations, files within subdirectories
|
||||
do not get their names properly resolved.
|
||||
This seems to be due to bad definitions in
|
||||
.IR <sys/stat.h> .
|
||||
If you have access to SunOS 4.x,
|
||||
.BR udl
|
||||
can be compiled there and used under Solaris.
|
||||
.LP
|
||||
If you find any other bugs, please send a report to the address given below.
|
||||
.SH AUTHOR
|
||||
Soenke Behrens, soenke.behrens@conner.com
|
||||
.br
|
||||
Version 1.13 updated by Devin Reade, gdr@myrias.ab.ca
|
||||
.SH VERSION
|
||||
This is
|
||||
.B udl
|
||||
version 1.13.
|
||||
.br
|
||||
It's 1.5 times faster than 1.1 for Unix<->Apple conversions.
|
402
usr.orca.bin/udl/udlgs.c
Normal file
402
usr.orca.bin/udl/udlgs.c
Normal file
@ -0,0 +1,402 @@
|
||||
/*
|
||||
* udl - Convert EOL formats freely between MS-DOS (CR/LF), Unix/Amiga (LF),
|
||||
* and Apple (CR).
|
||||
*
|
||||
* Apple IIgs specific routines.
|
||||
*
|
||||
* $Id: udlgs.c,v 1.1 1994/12/13 18:08:29 gdr Exp $
|
||||
*
|
||||
* Copyright (c) 1993-1994 Soenke Behrens
|
||||
*/
|
||||
|
||||
#include <orca.h>
|
||||
#include <shell.h>
|
||||
#include <gsos.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#define MAIN 1
|
||||
#include "common.h"
|
||||
|
||||
#define QUITFLAG 0x4000 /* udl is restartable */
|
||||
|
||||
/*
|
||||
* Globals
|
||||
*/
|
||||
|
||||
int theType, theAuxType; /* Hold type of current file */
|
||||
Next_WildcardGSPB NextWild; /* for handling ORCA/Shell style wildcards */
|
||||
Init_WildcardGSPB InitWild;
|
||||
|
||||
extern pascal void SystemQuitFlags (unsigned);
|
||||
extern pascal void SystemQuitPath (GSString255Ptr);
|
||||
extern int needsgno(void);
|
||||
extern void begin_stack_check(void);
|
||||
extern int end_stack_check(void);
|
||||
|
||||
/*
|
||||
* Prototypes of functions in this file
|
||||
*/
|
||||
|
||||
extern int CheckGSOSType (char *name);
|
||||
extern void SetGSOSType (char *name, int type, int auxtype);
|
||||
extern int right_shell_version (void);
|
||||
|
||||
int main(int argc,char *argv[]) {
|
||||
FILE *infile, *outfile;
|
||||
int Tunix = FALSE;
|
||||
int Messy = FALSE;
|
||||
int GS = FALSE;
|
||||
int careful = FALSE;
|
||||
int converted;
|
||||
int c;
|
||||
static GSString255 gsp;
|
||||
static ResultBuf255 rsp;
|
||||
int R_flag = FALSE;
|
||||
char **p;
|
||||
|
||||
verbose = FALSE;
|
||||
recursionDepth = 0;
|
||||
program_name = NULL;
|
||||
tempfile = NULL;
|
||||
current_file = NULL;
|
||||
NextWild.pathName = NULL;
|
||||
in_buffer = out_buffer = NULL;
|
||||
pathSlotsUsed = 0;
|
||||
pathSlots = 0;
|
||||
pathList = NULL;
|
||||
*currentDirectory = '\0';
|
||||
|
||||
#ifdef CHECK_STACK
|
||||
begin_stack_check();
|
||||
#endif
|
||||
|
||||
/* In case of exit(), free the mem I allocated */
|
||||
atexit (cleanup);
|
||||
|
||||
/* Make udl restartable */
|
||||
SystemQuitFlags (QUITFLAG);
|
||||
SystemQuitPath (NULL);
|
||||
|
||||
if (right_shell_version() == FALSE) {
|
||||
fprintf(stderr,"%s requires at least ORCA/Shell 2.0"
|
||||
" or GNO/ME 1.0\n", argv[0]);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if ((program_name = strdup (argv[0])) == NULL) {
|
||||
fprintf(stderr,"%s: memory allocation failure\n",argv[0]);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (argc < 3) {
|
||||
usage();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Get and process arguments */
|
||||
|
||||
optind = 0;
|
||||
opterr = 1;
|
||||
while ((c = getopt (argc, argv, "pvugmR")) != EOF) {
|
||||
switch (c) {
|
||||
case 'v':
|
||||
verbose = TRUE;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
careful = TRUE;
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
if (Tunix == TRUE || Messy == TRUE || GS == TRUE) {
|
||||
fprintf(stderr, "%s: You may not "
|
||||
"specify more than one conversion option\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
Tunix = TRUE;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
if (Tunix == TRUE || Messy == TRUE || GS == TRUE) {
|
||||
fprintf(stderr, "%s: You may not "
|
||||
"specify more than one conversion option\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
Messy = TRUE;
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
if (Tunix == TRUE || Messy == TRUE || GS == TRUE) {
|
||||
fprintf(stderr, "%s: You may not "
|
||||
"specify more than one conversion option\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
GS = TRUE;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
R_flag++;
|
||||
break;
|
||||
|
||||
case '?':
|
||||
usage();
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
default:
|
||||
fprintf (stderr, "%s: Internal getopt error\n", program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (optind == argc) { /* no files specified */
|
||||
usage();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (Tunix == FALSE && GS == FALSE && Messy == FALSE) {
|
||||
fprintf(stderr,"%s: You have to specify a destination "
|
||||
"format.\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (verbose == TRUE) {
|
||||
printf ("%s version %s\n",program_name,UDL_VERSION);
|
||||
}
|
||||
|
||||
if ((in_buffer = malloc(BUFFERSIZE+1)) == NULL ||
|
||||
(out_buffer = malloc(BUFFERSIZE+1)) == NULL) {
|
||||
fprintf(stderr,"%s: Unable to buffer files\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Orca Shell: expand wildcards */
|
||||
if (!needsgno()) {
|
||||
NextWild.pCount = 1;
|
||||
InitWild.pCount = 2;
|
||||
rsp.bufSize = 259;
|
||||
NextWild.pathName = &rsp;
|
||||
InitWild.wFile = &gsp;
|
||||
InitWild.flags = 0x8000 | 0x2000 | 0x1000;
|
||||
|
||||
/* loop through all command line args */
|
||||
for (; optind < argc; optind++) {
|
||||
size_t i;
|
||||
int num_of_files;
|
||||
|
||||
i = strlen(argv[optind]);
|
||||
strncpy (gsp.text,argv[optind],i);
|
||||
gsp.length = i;
|
||||
InitWildcardGS (&InitWild);
|
||||
num_of_files = 0;
|
||||
|
||||
/* loop through all matches of wildcards */
|
||||
for (;;) {
|
||||
NextWildcardGS (&NextWild);
|
||||
if (toolerror()) {
|
||||
fprintf(stderr,"%s: Fatal internal error, "
|
||||
"exiting\n", program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* No further file found by NextWildcardGS */
|
||||
if(!rsp.bufString.length)
|
||||
break;
|
||||
|
||||
num_of_files++;
|
||||
|
||||
if((current_file = calloc(1,rsp.bufString.length + 1)) == NULL) {
|
||||
fprintf(stderr,"%s: memory allocation failure\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
strncpy(current_file, rsp.bufString.text,rsp.bufString.length);
|
||||
|
||||
add_to_pathList("",current_file);
|
||||
free(current_file);
|
||||
current_file = NULL;
|
||||
} /* for (;;) */
|
||||
|
||||
if (num_of_files == 0)
|
||||
fprintf(stderr,"%s: No files found that match %s\n",
|
||||
program_name,argv[optind]);
|
||||
} /* for (; optind < argc; optind++) */
|
||||
}
|
||||
/* gsh or other Gno shell */
|
||||
else {
|
||||
|
||||
/* save the directory we're in */
|
||||
if (getwd(rootdir)==NULL) {
|
||||
fprintf(stderr,"%s: Couldn't stat .\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
for (; optind<argc; optind++) {
|
||||
/* set the directory separator character. */
|
||||
dirbrk = (strchr(argv[optind],':')!=NULL) ? ':' : '/';
|
||||
build_file_list(argv[optind],R_flag);
|
||||
chdir(rootdir);
|
||||
*currentDirectory = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
p = pathList;
|
||||
while(*p) {
|
||||
current_file = *p;
|
||||
|
||||
if (CheckGSOSType (current_file) == FALSE) {
|
||||
fprintf(stderr,"%s: %s is not of type TXT or "
|
||||
"SRC ... skipping\n",program_name,current_file);
|
||||
p++;
|
||||
continue;
|
||||
}
|
||||
if (verbose == TRUE) {
|
||||
printf("%s: Working on %s\n",program_name,current_file);
|
||||
}
|
||||
|
||||
infile = tryopen(current_file,"rwb");
|
||||
outfile = tryopen(tempfile = tmpnam(NULL),"wb");
|
||||
|
||||
if (careful) {
|
||||
converted = TRUE; /* always */
|
||||
|
||||
if (GS)
|
||||
convert_gs(infile,outfile);
|
||||
else if (Tunix)
|
||||
convert_tunix(infile,outfile);
|
||||
else
|
||||
convert_messy(infile,outfile);
|
||||
} else {
|
||||
if (GS)
|
||||
converted = convert_fast_gs(infile,outfile);
|
||||
else if (Tunix)
|
||||
converted = convert_fast_tunix(infile,outfile);
|
||||
else
|
||||
converted = convert_fast_messy(infile,outfile);
|
||||
}
|
||||
|
||||
if (fclose (infile) == EOF || fclose (outfile) == EOF) {
|
||||
perror ("closing files");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (converted) { /* Temp file contains converted data */
|
||||
if (remove (current_file) != 0) {
|
||||
perror ("removing original file");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (rename (tempfile,current_file) != 0) {
|
||||
copy_file (tempfile,current_file);
|
||||
remove (tempfile);
|
||||
tempfile = NULL;
|
||||
}
|
||||
} else
|
||||
remove (tempfile);
|
||||
|
||||
SetGSOSType (current_file, theType, theAuxType);
|
||||
p++;
|
||||
} /* end while */
|
||||
|
||||
#ifdef CHECK_STACK
|
||||
fprintf(stderr,"stack usage: %d bytes\n",end_stack_check());
|
||||
#endif
|
||||
|
||||
return (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* CheckGSOSType() ... check if a file is of type TXT or SRC
|
||||
*
|
||||
* Inputs:
|
||||
* char *name Name of file to check
|
||||
*
|
||||
* Outputs:
|
||||
* int Boolean, TRUE if file type is TXT or SRC, FALSE otherwise
|
||||
*/
|
||||
|
||||
int CheckGSOSType(char *name) {
|
||||
#define TXT 0x04
|
||||
#define SRC 0xB0
|
||||
|
||||
static GSString255 gst;
|
||||
static FileInfoRecGS fir = {5};
|
||||
size_t i;
|
||||
|
||||
i = strlen (name);
|
||||
gst.length = i;
|
||||
strncpy(gst.text,name,i);
|
||||
fir.pathname = &gst;
|
||||
|
||||
GetFileInfoGS(&fir);
|
||||
|
||||
if (toolerror()) {
|
||||
fprintf (stderr,"%s: GS/OS error on %s: 0x%04X\n",
|
||||
program_name,name,toolerror());
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if ((fir.fileType != TXT) && (fir.fileType != SRC))
|
||||
return (FALSE);
|
||||
else {
|
||||
theType = fir.fileType;
|
||||
theAuxType = fir.auxType;
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* SetGSOSType() ... set file and auxtype of a file.
|
||||
*
|
||||
* Inputs:
|
||||
* char *name Name of file to be affected
|
||||
* int type File type it should be set to
|
||||
* int auxtype Auxiliary type it should be set to
|
||||
*
|
||||
* Outputs:
|
||||
* None
|
||||
*/
|
||||
|
||||
void SetGSOSType (char *name, int type, int auxtype) {
|
||||
static GSString255 gst;
|
||||
static FileInfoRecGS fir = {4, NULL, 0xE3};
|
||||
size_t i;
|
||||
|
||||
i = strlen (name);
|
||||
gst.length = i;
|
||||
strncpy(gst.text,name,i);
|
||||
fir.pathname = &gst;
|
||||
fir.fileType = type;
|
||||
fir.auxType = auxtype;
|
||||
|
||||
SetFileInfoGS(&fir);
|
||||
|
||||
if (toolerror()) {
|
||||
fprintf (stderr,"%s: GS/OS error on %s: 0x%04X\n",
|
||||
program_name,name,toolerror());
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* right_shell_version() ... check if at least ORCA/Shell 2.0 or
|
||||
* GNO/ME 1.0 is active.
|
||||
*
|
||||
* Inputs:
|
||||
* None
|
||||
*
|
||||
* Output:
|
||||
* int Boolean, TRUE if shell is satisfactory, FALSE otherwise
|
||||
*/
|
||||
|
||||
int right_shell_version (void) {
|
||||
static VersionPB vpb;
|
||||
|
||||
VERSION(&vpb);
|
||||
|
||||
if (vpb.version[0] < '2' || strcmp (shellid(),"BYTEWRKS") != 0)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* End Of File */
|
206
usr.orca.bin/udl/udlunix.c
Normal file
206
usr.orca.bin/udl/udlunix.c
Normal file
@ -0,0 +1,206 @@
|
||||
/*
|
||||
* udl - Convert EOL formats freely between MS-DOS (CR/LF), Unix/Amiga (LF),
|
||||
* and Apple (CR).
|
||||
*
|
||||
* Unix specific routines.
|
||||
*
|
||||
* $Id: udlunix.c,v 1.1 1994/12/13 18:08:32 gdr Exp $
|
||||
*
|
||||
* Copyright (c) 1993-1994 Soenke Behrens
|
||||
*/
|
||||
|
||||
#define MAIN 1
|
||||
#include "common.h"
|
||||
|
||||
extern char *strdup(const char *);
|
||||
|
||||
int main(int argc,char *argv[]) {
|
||||
FILE *infile, *outfile;
|
||||
int Tunix = FALSE;
|
||||
int Messy = FALSE;
|
||||
int GS = FALSE;
|
||||
int careful = FALSE;
|
||||
int converted;
|
||||
int c;
|
||||
int R_flag = FALSE;
|
||||
|
||||
verbose = FALSE;
|
||||
program_name = NULL;
|
||||
tempfile = NULL;
|
||||
current_file = NULL;
|
||||
in_buffer = out_buffer = NULL;
|
||||
pathSlotsUsed = 0;
|
||||
pathSlots = 0;
|
||||
pathList = NULL;
|
||||
*currentDirectory = '\0';
|
||||
|
||||
/* In case of exit(), free the mem I allocated */
|
||||
#ifdef HAS_ATEXIT
|
||||
atexit (cleanup);
|
||||
#endif
|
||||
|
||||
if ((program_name = strdup (argv[0])) == NULL) {
|
||||
fprintf(stderr,"%s: memory allocation failure\n",argv[0]);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (argc < 3) {
|
||||
usage();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Get and process arguments */
|
||||
|
||||
opterr = 1;
|
||||
while ((c = getopt (argc, argv, "pvugmR")) != EOF) {
|
||||
switch (c) {
|
||||
case 'v':
|
||||
verbose = TRUE;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
careful = TRUE;
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
if (Tunix == TRUE || Messy == TRUE || GS == TRUE) {
|
||||
fprintf(stderr, "%s: You may not "
|
||||
"specify more than one conversion option\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
Tunix = TRUE;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
if (Tunix == TRUE || Messy == TRUE || GS == TRUE) {
|
||||
fprintf(stderr, "%s: You may not specify more than one "
|
||||
"conversion option\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
Messy = TRUE;
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
if (Tunix == TRUE || Messy == TRUE || GS == TRUE) {
|
||||
fprintf(stderr, "%s: You may not specify more than one "
|
||||
"conversion option\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
GS = TRUE;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
R_flag++;
|
||||
break;
|
||||
|
||||
case '?':
|
||||
usage();
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
default:
|
||||
fprintf (stderr, "%s: Internal getopt error\n", program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* no files specified */
|
||||
if (optind == argc) {
|
||||
usage();
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (Tunix == FALSE && GS == FALSE && Messy == FALSE) {
|
||||
fprintf(stderr,"%s: You have to specify a destination "
|
||||
"format.\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (verbose == TRUE) {
|
||||
printf ("%s %s\n",program_name,UDL_VERSION);
|
||||
}
|
||||
|
||||
/* Now process the files I got */
|
||||
|
||||
if ((in_buffer = malloc(BUFFERSIZE+1)) == NULL ||
|
||||
(out_buffer = malloc(BUFFERSIZE+1)) == NULL) {
|
||||
fprintf(stderr,"%s: Unable to buffer files\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* save the directory we're in */
|
||||
if (getwd(rootdir)==NULL) {
|
||||
fprintf(stderr,"%s: Couldn't stat .\n",program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* set the directory separator character. */
|
||||
dirbrk = '/';
|
||||
|
||||
/* build the list of files to process */
|
||||
for (; optind<argc; optind++) {
|
||||
build_file_list(argv[optind],R_flag);
|
||||
chdir(rootdir);
|
||||
*currentDirectory = '\0';
|
||||
}
|
||||
|
||||
for (c=0; pathList[c]; c++) {
|
||||
if((current_file = strdup(pathList[c])) == NULL) {
|
||||
fprintf(stderr,"%s: memory allocation failure\n", program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (verbose == TRUE) {
|
||||
printf("%s: Working on %s\n",program_name,
|
||||
current_file);
|
||||
}
|
||||
|
||||
infile = tryopen(current_file,"rwb");
|
||||
outfile = tryopen(tempfile = tmpnam(NULL),"wb");
|
||||
|
||||
if (careful) {
|
||||
converted = TRUE; /* always */
|
||||
|
||||
if (GS)
|
||||
convert_gs(infile,outfile);
|
||||
else if (Tunix)
|
||||
convert_tunix(infile,outfile);
|
||||
else
|
||||
convert_messy(infile,outfile);
|
||||
} else {
|
||||
if (GS)
|
||||
converted = convert_fast_gs(infile,outfile);
|
||||
else if (Tunix)
|
||||
converted = convert_fast_tunix(infile,outfile);
|
||||
else
|
||||
converted = convert_fast_messy(infile,outfile);
|
||||
}
|
||||
|
||||
if (fclose (infile) == EOF || fclose (outfile) == EOF) {
|
||||
perror ("closing files");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (converted) { /* Temp file contains converted data */
|
||||
if (remove (current_file) != 0) {
|
||||
perror ("removing original file");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (rename (tempfile,current_file) != 0) {
|
||||
copy_file (tempfile,current_file);
|
||||
remove (tempfile);
|
||||
tempfile = NULL;
|
||||
}
|
||||
} else
|
||||
remove (tempfile);
|
||||
|
||||
free(current_file);
|
||||
current_file = NULL;
|
||||
|
||||
} /* for (c=0; pathList[c]; c++) */
|
||||
|
||||
return (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
|
29
usr.orca.bin/udl/udluse.c
Normal file
29
usr.orca.bin/udl/udluse.c
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* udl - Convert EOL formats freely between MS-DOS (CR/LF), Unix/Amiga (LF),
|
||||
* and Apple (CR).
|
||||
*
|
||||
* Usage strings.
|
||||
*
|
||||
* $Id: udluse.c,v 1.1 1994/12/13 18:08:34 gdr Exp $
|
||||
*
|
||||
* Copyright (c) 1993-1994 Soenke Behrens
|
||||
*/
|
||||
|
||||
char use1 [] =
|
||||
"udl 1.13 by Soenke Behrens\n"
|
||||
"Usage: udl -u|g|m [-Rv] file1 [file2 ...]\n\n"
|
||||
"Options:\n"
|
||||
" -u Convert file to use LF as EOL character.\n"
|
||||
" -g Convert file to use CR as EOL character.\n"
|
||||
" -m Convert file to use LF/CR as EOL character.\n"
|
||||
" -R Recurse through subdirectories.\n"
|
||||
" -p Be pedantic.\n"
|
||||
" -v Be verbose about it.\n\n"
|
||||
"udl creates a temporary file on 14:, the original file(s) are over-\n"
|
||||
"written when it is done.\n";
|
||||
|
||||
char use2 [] =
|
||||
"files may contain ORCA/Shell style wildcards.\n\n";
|
||||
|
||||
/* End Of File */
|
||||
|
Loading…
x
Reference in New Issue
Block a user