home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource4
/
216_01
/
c_user.txt
< prev
next >
Wrap
Text File
|
1979-12-31
|
7KB
|
133 lines
July 15, 1986
Donna S. Ward
Operations Manager
C Users Group
P.O. Box 97
McPherson, Kansas 67460
Dear Ms Ward,
Ref your letter of June 23, you are welcome to the code, and may publish
it if you wish. If Mr Apsey is a Fortranner, he should have no difficulty
adapting it to his needs. I'm sorry its in Fortran, and would like to convert
it to C, but it will be Christmas before I have a spare day. I hope another
of your readers will volunteer to translate it to C, if found worthy.
The software is in two pieces, a batch file and the Fortran program. In
this application, I think the batch file plays a more than usually important
role. It does more than most of my batch files.
The batch file, which is baptized CLL.BAT copies files to RAM disk and
invokes dBase. When dBase is quit, CLL saves any newly created or updated
files. I haven't tried, but I expect this could be made to work with any
other language, or no language - not just dBase. One of the commands in CLL
is "scanfils", which calls up the Fortran routine, SCANFILS.
Fortran routine SCANFILS checks the latest directory to see what files
have been created, or altered, and builds the batch file SAVEFILS, containing
copy commands, which CLL uses to save the necessary files.
The first statement in CLL.BAT;
if exist c:mims.prg goto dbase2
makes it possible to work in RAM for a while, then quit dBase. All changed
files will be saved. You can later go back to work on the files without
re-copying everything back to RAM again.
After saving a copy of the directory, dBase is called up, followed by
MIMS (a root menu type of program). The programs and data files comprise a
a small system which contains file update screens, prints mailing labels,
member phone directory and file listing. When dBase is quit, another copy
of the directory is taken, and the program SCANFILS checks for new or changed
files.
SAVEFILS is a batch file created by SCANFILS, and contains the names of
new or changed files in the format;
copy e:filename.ext b:.
SCANFILS is written in Fortran 77, and is pretty straightforward. But
of course there are always some things which a few words of explanation may
save someone else a lot of time trying to figure out what the author is up to.
The usual declarations and initializations are there. Here I guess I
should mention an old habit of mine, born of reading lots of source code
with lots of logical unit numbers, like "read(17,1001)iolist". If there are
as few as 3 or 4 such numbers you will find yourself flipping back and forth
between source and job control listing to see which files are associated with
which numbers. So I set up data statements to make the correlations for me.
Example: data gpcin /17/
.
.
read(gpcin,1001)iolist
Using this, I wouldn't have to go to the control file or anyplace else to know
that I was reading the gpc input file. So that is what the statement
data oldir,nudir,report,savefi /2,3,4,8/
is doing. Its keeping me from getting mixed up.
A couple of lines farther down, the statement
data tmpfmt /.........../
initializes an array containing an execution time format statement. It turns
out that MS-DOS will not tolerate any spaces between filename and extension,
just the period. So the number of characters in filename is counted, and the
A8, which you see in tmpfmt will be changed to A7 or A4, or whatever is the
number of characters in filename.
The entire old and new directories are read into arrays, except for the
headers and trailers, and the size column.
The "end = ..." in line 47 is not needed. (Line numbers are contained
in SCANFILS.LST). It is a defensive coding habit. The statement, "...bytes
free " in the directory trailer, has the " free " right under the time column.
I use that instead of EOF as a signal to quit the read loop.
Since the directory listings are so short, not more than 50 in this
program, I do not sort/merge. The program simply looks at an entry in the
old directory and then goes thru the new directory from the beginning till
it finds a match (maybe).
Beginning on line 88 of scanfils.lst, the program counts the number of
characters in filename. Fortran 77 uses the internal file concept instead of
the old encode-decode of Fortran 5. "fname" on lines 88 and 89 is the internal
file name. I write to it with an A8 format, and read from it with 8A1 format.
"Nurch", for number of characters in lines 94,95, is another use of the
internal file.
The "* Pack nudir arrays " paragraph deletes from the arrays data
pertaining to files that have been matched up. This may be an inefficient
use of cpu time. True, it will save some time in the match up process. At any
rate, the code's there, and it has the plus feature that whatever is left in
the nudir arrays at the end is a list of newly created files. The "do 300"
loop, beginning at line 121 writes whatever amy remain in the nudir arrays
to savefils.
The last three loops write to report.txt a list of actions taken in the
RAM disk session, namely;
files deleted,
files added,
files changed.
Note that a file deleted in RAM is not deleted by the batch file. For the
few files that I may delete in this application I use DOS. Also, it is
sometimes handy to be able to get an unneeded file out of RAM by deleting it,
knowing that it wont be deleted from your floppy.
This was originally designed to work on a Tandy 2000 with 2 floppies and
no fixed disk. It first ran with the RAM in c:, but when I got the fixed disk,
(and a later version of MS-DOS) I had to change it to e:. I did that and
checked it out. It still works.
With the application files in b:, and the dBase2 working disk,
(containing CLL.BAT, SCANFILS.BAT, and CONFIG.SYS capable of establishing a
RAM disk) in a:, enter CLL, and it will take off. Surprise! You will get
a copy of new.dir in b: in addition to any other creations or changes.
Cordially,
Frank H. Jeys
414 Bay Colony
LaPorte, Tex 77571
(713) 471-2462