|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8064 (0x1f80)
Types: TextFile
Names: »LS.C«
└─⟦dd59903ef⟧ Bits:30005887 Klub diskette for udveksling af software
└─⟦this⟧ »LS.C«
/****************************************************************
* *
* ls.c - CP/M Directory lising program *
* Written in BDS C *
* Written by: Bob Longoria *
* 9-Jan-82 *
* *
* The program lists the directory in several different *
* formats depending on switches set in the command *
* line (ala C). Explanation of the switches follows: *
* *
* Size specification: *
* -f Lists full directory (file size in *
* records, size file takes in disk *
* space, and the files attributes *
* -b Lists brief directory (file size in *
* records only *
* default Lists file names only *
* Attribute specification: *
* -n Lists files that are SYS only *
* -r Lists files that are R/O only *
* -w Lists files that are R/W only *
* -a Lists files regardless of attributes *
* default Lists files that are DIR only *
* (corresponds to CP/M dir) *
* Sort specification: *
* -s Sorts listed files alphabettically *
* default Does not sort files *
* Case specification: *
* -u Lists information in upper case *
* default Lists information in lower case *
* *
* For the size or attributes specifications - if two *
* of any switches in either of these groups are set - *
* a conflict arises and a warning is issued and the *
* default setting for the group is set. *
* e.g. ls *.com -fb This command asks for a full *
* and a brief listing at the same time. Here warning *
* is issued and default set (brief, brief listing) *
* Switches may be set in any order and can be con- *
* catenated or separated. *
* e.g. ls *.com -fasl does the same as *
* ls *.com -a -s -fl *
* *
****************************************************************/
#include "bdscio.h" /* Standard header file */
#define DMABUF 0x0080 /* Default DMA buffer address */
#define MASK 0x80 /* Attribute bit mask */
#define SSIZE 16 /* No of significant fcb bytes */
#define FCBADR 0x005c /* Default fcb address */
#define FCBS 128 /* Define max number of directory entries */
int usr; /* Current user number */
int dsk; /* Currently selected disk */
int blm;
main(argc,argv)
int argc; /* argument count */
char **argv; /* argument vector */
æ
char *fcb_ptrÆFCBSÅ;
int nfcbs, count, tot;
int size_sw, attr_sw;
int sort_sw, case_sw;
int blm;
_allocp = NULL;
size_sw = attr_sw = sort_sw = case_sw = 0;
get_args(&size_sw, &attr_sw, &sort_sw, &case_sw, argc, argv);
get_params();
if ((count = save_fcb(fcb_ptr,attr_sw,&tot)) == -1)æ
printf("Warning: FCB list too large for available memoryØn");
exit();
å
else if (count == 0)æ /* no match found */
printf("No match found for %sØn",argvÆ1Å);
exit();
å
else æ /* There may be a match */
if (sort_sw)
sort_fcb(fcb_ptr,count,11);
list_fcbs(fcb_ptr, size_sw, case_sw, count, tot);
å
å
save_fcb(fcb_ptr, attr, ncnt)
char *fcb_ptrÆÅ;
char *ncnt;
int attr;
æ
int nsave,n;
char *p, *alloc(), *buf_ptr;
char ro, sys;
char cusr, fusr;
cusr = usr;
*ncnt = nsave = 0;
if ((n = bdos(17,FCBADR)) == 255)
return(0);
do æ
(*ncnt)++;
buf_ptr = DMABUF+32*n;
sys = *(buf_ptr+10) & MASK;
ro = *(buf_ptr+9) & MASK;
fusr = *buf_ptr;
if (((attr == 1 && sys) øø (attr == 2 && ro) øø
(attr == 0 && !sys) øø (attr == 3) øø
(attr == 4 && !ro)) && ((fusr ^ cusr) == 0)) æ
if ((p = alloc(SSIZE)) == NULL)
return(-1);
copy_fcb(p, buf_ptr);
fcb_ptrÆnsave++Å = p;
å
å
while ((n=bdos(18,FCBADR)) != 255);
return (nsave);
å
list_fcbs(fcb_ptr, size, ucase, count, tot)
char *fcb_ptrÆÅ;
int size, ucase;
int count, tot;
æ
int i;
char sys, ro;
char *name;
unsigned n, s, fsize();
unsigned tblks, ksize;
tblks = ksize = 0;
name = " ";
printf("Directory for Disk %c: User %2d:Øn", dsk+'A', usr);
for (i = 0; i < count; i++) æ
n = fsize(fcb_ptrÆiÅ);
s = (n/blm)*(blm/8)+((n%blm) ? blm/8 : 0);
tblks += n;
ksize += s;
strset(name, fcb_ptrÆiÅ, ucase);
switch (size) æ
case 0:
printf("%s%s", name, (i%5==4 øø i==count-1) ? "Øn" : " ø ");
break;
case 1:
printf("%s%5u", name, n);
printf("%s", (i%4==3 øø i==count-1) ? "Øn" : " ø ");
break;
case 2:
printf("%s%6u%4dK", name, n, s);
sys = *(fcb_ptrÆiÅ+10) & MASK;
ro = *(fcb_ptrÆiÅ+9) & MASK;
if (ucase)
printf("%s%s", (sys) ? " SYS" : " DIR", (ro) ? " R/O" : " R/W");
else
printf("%s%s", (sys) ? " sys" : " dir", (ro) ? " r/o" : " r/w");
printf("%s", (i%2==1 øø i==count-1) ? "Øn" : " ");
break;
å
å
printf("ØnListed %d/%d files",count,tot);
printf(" %u/%u Blocks used",tblks, ksize*8);
printf(" %uK Disk space usedØn",ksize);
å
copy_fcb(p, s) /* Copy s to p */
char *p, *s;
æ
int i;
for (i=0; i < SSIZE; i++)
*(p+i) = *(s+i);
å
strset(s, t, c) /* Copy t to s */
char *s, *t;
int c;
æ
int i;
for (i = 0; i < 12; i++)
if (i < 8)
*(s+i) = (c) ? *(t+i+1) : tolower(*(t+i+1) & üMASK);
else if (i == 8)
;
else
*(s+i) = (c) ? *(t+i) : tolower(*(t+i) & üMASK);
å
get_args (psize, pattr, psort, pcase, argc, argv)
char *psize, *pattr, *psort, *pcase;
int argc;
char *argvÆÅ;
æ
char *sptr;
while (--argc > 0)
if ((*++argv)Æ0Å == '-')
for (sptr = argvÆ0Å+1; *sptr != 'Ø0'; sptr++)
switch (*sptr) æ
case 'F':
if (*psize == 0)
*psize = 2;
else æ
printf("Warning: Size switch conflict - Default setØn");
*psize = 0;
å
break;
case 'B':
if (*psize == 0)
*psize = 1;
else æ
printf("Warning: Size switch conflict - Default setØn");
*psize = 0;
å
break;
case 'A':
if (*pattr == 0)
*pattr = 3;
else æ
printf("Warning: Attr switch conflict - Default setØn");
*pattr = 0;
å
break;
case 'N':
if (*pattr == 0)
*pattr = 1;
else æ
printf("Warning: Attr switch conflict - Default setØn");
*pattr = 0;
å
break;
case 'R':
if (*pattr == 0)
*pattr = 2;
else æ
printf("Warning: Attr switch conflict - Default setØn");
*pattr = 0;
å
break;
case 'W':
if (*pattr == 0)
*pattr = 4;
else æ
printf("Warning: Attr switch conflict - Default setØn");
*pattr = 0;
å
break;
case 'S':
*psort = 1;
break;
case 'U':
*pcase = 1;
break;
default:
printf("Warning: Illegal switch (%c) - IgnoredØn",*sptr);
å
å
sort_fcb(v, n, num)
char *vÆÅ;
int n, num;
æ
int gap, i, j;
char *temp;
for (gap = n/2; gap > 0; gap /= 2)
for (i = gap; i < n; i++)
for (j = i-gap; j >=0; j -= gap) æ
if (sstrcmp(vÆjÅ, vÆj+gapÅ, num) <= 0)
break;
temp = vÆjÅ;
vÆjÅ = vÆj+gapÅ;
vÆj+gapÅ = temp;
å
å
sstrcmp(s, t, num)
char *s, *t;
int num;
æ
int i;
i = 1;
while (*(s+i) == *(t+i))
if (++i > num)
return(0);
return (*(s+i) - *(t+i));
å
unsigned fsize(ptr)
char *ptr;
æ
char *p;
int ex;
unsigned n;
unsigned *tmptr;
ex = *(ptr+12);
n = *(ptr+15);
if (ex != 0 && n != 128)
n = ex*128+n;
else
if (n == 128) æ
if ((p = alloc(SSIZE+20)) == NULL)
return(0);
copy_fcb(p, ptr);
bdos(35,p);
tmptr = p+33;
n = *tmptr;
å
return(n);
å
get_params()
æ
char *dpb_ptr;
char *buf_ptr;
buf_ptr = 0x005c;
dsk = (*buf_ptr & 0x0f)-1;
if (dsk < 0)
dsk = bdos(25,0);
bdos(14,dsk);
dpb_ptr = bdos(31,dsk);
blm = *(dpb_ptr+3)+1;
usr = bdos(32,0x00ff);
å
«eof»