home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
utils
/
arc-lbr
/
pull.lbr
/
PULL.CQ
/
PULL.C
Wrap
Text File
|
1986-11-22
|
4KB
|
180 lines
/* Program to extract 1 file from a Novosielski .lbr file
* Tom Burnett 10/08/85
*/
#define VERSION 1
#define REVISION 0
#define MOD_DATE "10/08/85"
/* This program will extract a member of a LBR file...
USE: PULL <library> <member>
COMPILE/LINK: cc pull.c
as pull.asm
ln pull.o c.lib
Based on Ltype by S. Kluger 01-13-83
and
Vers 3.0 3-1-84
Upgrade to lattice c ms dos P. H. Mack.
Change to Aztec C 10/08/85 Tom Burnett
*/
#include "stdio.h"
char curdsk, fcb[36];
char fnam[12], libnam[16], dirbuf[128], *dirp;
int fd, dirsiz, filsiz;
FILE *fp1,*fopen();
#define OK 0
#define ERROR -1
/************************************************
main
*************************************************/
main(argc,argv)
int argc;
char **argv;
{
fprintf(stderr,"\nPULL vers:%d.%02d %s\n\r\n",
VERSION,REVISION,MOD_DATE);
if (argc != 3) {
fprintf(stderr,"usage PULL LIBRARY.LBR FILENAME\n\n");
exit(1);
}
opnlib(argv[1]);
if (fndmem(argv[2]) == ERROR) erxit("\nMember not in LBR file!\n\r");
fprintf(stderr,"\nFile '%s' present - %d sectors.\n",argv[2],filsiz);
fprintf(stderr,"extracting file to default drive....\n");
if ((fp1 = fopen(argv[2],"w")) == NULL) {
fprintf(stderr,"cannot create -> %s\n",argv[2]);
exit(1);
}
extract();
}
/************************************************
Extract function
*************************************************/
extract()
{
int j;
int c;
dirsiz = filsiz;
do
{
reload();
for (j=0; j<128; j++){
fputc(*dirp,fp1);
dirp++;
}
}while(dirsiz != 0);
}
/************************************************
open library file
*************************************************/
opnlib(file)
char *file;
{
char l, *npnt;
strcpy(libnam,file);
l = matchr(libnam,'.');
if (l == 0) strcat(libnam, ".LBR");
fcbinit(libnam,fcb); /* build name in fcb */
movmem(fcb,fnam,12); /* get from dfcb2 for log */
if(strcmp(fcb+9, "LBR")){
fprintf(stderr,"got %s\n",libnam);
erxit("Invalid file spec, MUST be type .LBR\n");
}
fd = open(libnam,0x8000);
if(fd == -1) erxit("Library file not found.\n");
}
/************************************************
find library member
*************************************************/
fndmem(file)
char *file;
{
char dnam[16], fname[36];
long int floc;
fcbinit(file,fname);
read(fd,dirbuf,128);
dirp = dirbuf;
dirsiz = *(dirp+14);
dirp += 32;
do{
if (*dirp == 255) return(ERROR);
if (*dirp == 0){
strcpy(dnam, dirp+1);
dnam[11]=0;
if(strcmp(dnam, fname+1) == 0){
filsiz = (*(dirp+14)) + ((*(dirp+15)) * 256);
floc=(*(dirp+12)) + ((*(dirp+13)) * 256);
lseek(fd,floc *128,0);
return(OK);
}
}
dirp += 32;
if(dirp > dirbuf+128) reload();
}
while(dirsiz);
return(ERROR);
}
/************************************************
reload
*************************************************/
reload()
{
read(fd,dirbuf,128);
dirp = dirbuf;
dirsiz--;
}
/************************************************
match char
*************************************************/
matchr(st,ch)
char *st,ch;
{
int i;
for(i=0; st[i]; i++){
if(st[i] == ch) return(i);
}
return(0);
}
/************************************************
error exit
*************************************************/
erxit(strg)
char *strg;
{
fprintf(stderr,strg);
exit();
}