Annotation of sbbs/sbbs2/listfile.c, revision 1.1.1.2

1.1       root        1: #line 1 "LISTFILE.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: 
                      7: int listfile(char *fname, char HUGE16 *buf, uint dirnum
                      8:        , char *search, char letter, ulong datoffset);
                      9: 
                     10: void clearline(void)
                     11: {
                     12:        int i;
                     13: 
                     14: outchar(CR);
                     15: if(useron.misc&ANSI)
                     16:        bputs("\x1b[K");
                     17: else {
                     18:        for(i=0;i<79;i++)
                     19:                outchar(SP);
                     20:        outchar(CR); }
                     21: }
                     22: 
                     23: /****************************************************************************/
                     24: /* Remove credits from uploader of file 'f'                                 */
                     25: /****************************************************************************/
                     26: void removefcdt(file_t f)
                     27: {
                     28:        char str[128];
                     29:        int u;
                     30:        long cdt;
                     31: 
                     32: if((u=matchuser(f.uler))==0) {
                     33:    bputs(text[UnknownUser]);
                     34:    return; }
                     35: cdt=0L;
                     36: if(dir[f.dir]->misc&DIR_CDTMIN && cur_cps) {
                     37:        if(dir[f.dir]->misc&DIR_CDTUL)
                     38:                cdt=((ulong)(f.cdt*(dir[f.dir]->up_pct/100.0))/cur_cps)/60;
                     39:        if(dir[f.dir]->misc&DIR_CDTDL
                     40:                && f.timesdled)  /* all downloads */
                     41:                cdt+=((ulong)((long)f.timesdled
                     42:                        *f.cdt*(dir[f.dir]->dn_pct/100.0))/cur_cps)/60;
                     43:        adjustuserrec(u,U_MIN,10,-cdt);
                     44:        sprintf(str,"%lu minute",cdt);
                     45:        sprintf(tmp,text[FileRemovedUserMsg]
                     46:                ,f.name,cdt ? str : text[No]);
                     47:        putsmsg(u,tmp); }
                     48: else {
                     49:        if(dir[f.dir]->misc&DIR_CDTUL)
                     50:                cdt=(ulong)(f.cdt*(dir[f.dir]->up_pct/100.0));
                     51:        if(dir[f.dir]->misc&DIR_CDTDL
                     52:                && f.timesdled)  /* all downloads */
                     53:                cdt+=(ulong)((long)f.timesdled
                     54:                        *f.cdt*(dir[f.dir]->dn_pct/100.0));
                     55:        adjustuserrec(u,U_CDT,10,-cdt);
                     56:        sprintf(tmp,text[FileRemovedUserMsg]
                     57:                ,f.name,cdt ? ultoac(cdt,str) : text[No]);
                     58:     putsmsg(u,tmp); }
                     59: 
                     60: adjustuserrec(u,U_ULB,10,-f.size);
                     61: adjustuserrec(u,U_ULS,5,-1);
                     62: }
                     63: 
                     64: /****************************************************************************/
                     65: /* Move file 'f' from f.dir to newdir                                       */
                     66: /****************************************************************************/
                     67: void movefile(file_t f, int newdir)
                     68: {
                     69:        char str[256],path[256],fname[128],ext[1024];
                     70:        int olddir=f.dir;
                     71: 
                     72: if(findfile(newdir,f.name)) {
                     73:        bprintf(text[FileAlreadyThere],f.name);
                     74:        return; }
                     75: getextdesc(olddir,f.datoffset,ext);
                     76: if(dir[olddir]->misc&DIR_MOVENEW)
                     77:        f.dateuled=time(NULL);
                     78: unpadfname(f.name,fname);
                     79: removefiledat(f);
                     80: f.dir=newdir;
                     81: addfiledat(&f);
                     82: bprintf(text[MovedFile],f.name
                     83:        ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                     84: sprintf(str,"Moved %s to %s %s",f.name
                     85:        ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                     86: logline(nulstr,str);
                     87: if(!f.altpath) {       /* move actual file */
                     88:        sprintf(str,"%s%s",dir[olddir]->path,fname);
                     89:        if(fexist(str)) {
                     90:                sprintf(path,"%s%s",dir[f.dir]->path,fname);
                     91:                mv(str,path,0); } }
                     92: if(f.misc&FM_EXTDESC)
                     93:        putextdesc(f.dir,f.datoffset,ext);
                     94: }
                     95: 
                     96: /****************************************************************************/
                     97: /* Batch flagging prompt for download, extended info, and archive viewing      */
                     98: /* Returns -1 if 'Q' or Ctrl-C, 0 if skip, 1 if [Enter], 2 otherwise        */
                     99: /* or 3, backwards.                                                                                                            */
                    100: /****************************************************************************/
                    101: char batchflagprompt(int dirnum, file_t bf[26], char total, long totalfiles)
                    102: {
                    103:        char ch,c,d,str[256],fname[128],*p,remcdt,remfile;
                    104:        int i,j,u,ml,md,udir,ulib;
                    105:        long cdt;
                    106:        file_t f;
                    107: 
                    108: for(ulib=0;ulib<usrlibs;ulib++)
                    109:        if(usrlib[ulib]==dir[dirnum]->lib)
                    110:                break;
                    111: for(udir=0;udir<usrdirs[ulib];udir++)
                    112:        if(usrdir[ulib][udir]==dirnum)
                    113:                break;
                    114: 
                    115: CRLF;
                    116: while(online) {
                    117:        bprintf(text[BatchFlagPrompt]
                    118:                ,ulib+1
                    119:                ,lib[dir[dirnum]->lib]->sname
                    120:                ,udir+1
                    121:                ,dir[dirnum]->sname
                    122:                ,totalfiles);
                    123:        ch=getkey(K_UPPER);
                    124:        clearline();
                    125:        if(ch=='?') {
                    126:                menu("BATFLAG");
                    127:                if(lncntr)
                    128:                        pause();
                    129:                return(2); }
                    130:        if(ch=='Q' || sys_status&SS_ABORT)
                    131:                return(-1);
                    132:        if(ch=='S')
                    133:                return(0);
                    134:        if(ch=='P')
                    135:                return(3);
                    136:        if(ch=='B') {    /* Flag for batch download */
                    137:                if(useron.rest&FLAG('D')) {
                    138:                        bputs(text[R_Download]);
                    139:                        return(2); }
                    140:                if(total==1) {
                    141:                        f.dir=dirnum;
                    142:                        strcpy(f.name,bf[0].name);
                    143:                        f.datoffset=bf[0].datoffset;
                    144:                        f.size=0;
                    145:                        getfiledat(&f);
                    146:                        addtobatdl(f);
                    147:                        CRLF;
                    148:                        return(2); }
                    149:                bputs(text[BatchDlFlags]);
                    150:                d=getstr(str,26,K_UPPER|K_LOWPRIO|K_NOCRLF);
                    151:                lncntr=0;
                    152:                if(sys_status&SS_ABORT)
                    153:                        return(-1);
                    154:                if(d) {         /* d is string length */
                    155:                        CRLF;
                    156:                        lncntr=0;
                    157:                        for(c=0;c<d;c++) {
                    158:                                if(batdn_total>=max_batdn) {
                    159:                                        bprintf(text[BatchDlQueueIsFull],str+c);
                    160:                                        break; }
                    161:                                if(strchr(str+c,'.')) {     /* filename or spec given */
                    162:                                        f.dir=dirnum;
                    163:                                        p=strchr(str+c,SP);
                    164:                                        if(!p) p=strchr(str+c,',');
                    165:                                        if(p) *p=0;
                    166:                                        for(i=0;i<total;i++) {
                    167:                                                if(batdn_total>=max_batdn) {
                    168:                                                        bprintf(text[BatchDlQueueIsFull],str+c);
                    169:                                                        break; }
                    170:                                                padfname(str+c,tmp);
                    171:                                                if(filematch(bf[i].name,tmp)) {
                    172:                                                        strcpy(f.name,bf[i].name);
                    173:                                                        f.datoffset=bf[i].datoffset;
                    174:                                                        f.size=0;
                    175:                                                        getfiledat(&f);
                    176:                                                        addtobatdl(f); } } }
                    177:                                if(strchr(str+c,'.'))
                    178:                                        c+=strlen(str+c);
                    179:                                else if(str[c]<'A'+total && str[c]>='A') {
                    180:                                        f.dir=dirnum;
                    181:                                        strcpy(f.name,bf[str[c]-'A'].name);
                    182:                                        f.datoffset=bf[str[c]-'A'].datoffset;
                    183:                                        f.size=0;
                    184:                                        getfiledat(&f);
                    185:                                        addtobatdl(f); } }
                    186:                        CRLF;
                    187:                        return(2); }
                    188:                clearline();
                    189:                continue; }
                    190: 
                    191:        if(ch=='E' || ch=='V') {    /* Extended Info */
                    192:                if(total==1) {
                    193:                        f.dir=dirnum;
                    194:                        strcpy(f.name,bf[0].name);
                    195:                        f.datoffset=bf[0].datoffset;
                    196:                        f.dateuled=bf[0].dateuled;
                    197:                        f.datedled=bf[0].datedled;
                    198:                        f.size=0;
                    199:             getfiledat(&f);
                    200:                        if(!viewfile(f,ch=='E'))
                    201:                                return(-1);
                    202:                        return(2); }
                    203:                bputs(text[BatchDlFlags]);
                    204:                d=getstr(str,26,K_UPPER|K_LOWPRIO|K_NOCRLF);
                    205:                lncntr=0;
                    206:                if(sys_status&SS_ABORT)
                    207:                        return(-1);
                    208:                if(d) {         /* d is string length */
                    209:                        CRLF;
                    210:                        lncntr=0;
                    211:                        for(c=0;c<d;c++) {
                    212:                                if(strchr(str+c,'.')) {     /* filename or spec given */
                    213:                                        f.dir=dirnum;
                    214:                                        p=strchr(str+c,SP);
                    215:                                        if(!p) p=strchr(str+c,',');
                    216:                                        if(p) *p=0;
                    217:                                        for(i=0;i<total;i++) {
                    218:                                                padfname(str+c,tmp);
                    219:                                                if(filematch(bf[i].name,tmp)) {
                    220:                                                        strcpy(f.name,bf[i].name);
                    221:                                                        f.datoffset=bf[i].datoffset;
                    222:                                                        f.dateuled=bf[i].dateuled;
                    223:                                                        f.datedled=bf[i].datedled;
                    224:                                                        f.size=0;
                    225:                                                        getfiledat(&f);
                    226:                                                        if(!viewfile(f,ch=='E'))
                    227:                                                                return(-1); } } }
                    228:                                if(strchr(str+c,'.'))
                    229:                                        c+=strlen(str+c);
                    230:                                else if(str[c]<'A'+total && str[c]>='A') {
                    231:                                        f.dir=dirnum;
                    232:                                        strcpy(f.name,bf[str[c]-'A'].name);
                    233:                                        f.datoffset=bf[str[c]-'A'].datoffset;
                    234:                                        f.dateuled=bf[str[c]-'A'].dateuled;
                    235:                                        f.datedled=bf[str[c]-'A'].datedled;
                    236:                                        f.size=0;
                    237:                                        getfiledat(&f);
                    238:                                        if(!viewfile(f,ch=='E'))
                    239:                                                return(-1); } }
                    240:                        return(2); }
                    241:                clearline();
                    242:                continue; }
                    243: 
                    244:        if((ch=='D' || ch=='M')     /* Delete or Move */
                    245:                && !(useron.rest&FLAG('R'))
                    246:                && (dir_op(dirnum) || useron.exempt&FLAG('R'))) {
                    247:                if(total==1) {
                    248:                        strcpy(str,"A");
                    249:                        d=1; }
                    250:                else {
                    251:                        bputs(text[BatchDlFlags]);
                    252:                        d=getstr(str,26,K_UPPER|K_LOWPRIO|K_NOCRLF); }
                    253:                lncntr=0;
                    254:                if(sys_status&SS_ABORT)
                    255:                        return(-1);
                    256:                if(d) {         /* d is string length */
                    257:                        CRLF;
                    258:                        if(ch=='D') {
                    259:                                if(noyes(text[AreYouSureQ]))
                    260:                                        return(2);
                    261:                                remcdt=remfile=1;
                    262:                                if(dir_op(dirnum)) {
                    263:                                        remcdt=!noyes(text[RemoveCreditsQ]);
                    264:                                        remfile=!noyes(text[DeleteFileQ]); } }
                    265:                        else if(ch=='M') {
                    266:                                CRLF;
                    267:                                for(i=0;i<usrlibs;i++)
                    268:                     bprintf(text[MoveToLibLstFmt],i+1,lib[usrlib[i]]->lname);
                    269:                 SYNC;
                    270:                 bprintf(text[MoveToLibPrompt],dir[dirnum]->lib+1);
                    271:                                if((ml=getnum(usrlibs))==-1)
                    272:                                        return(2);
                    273:                                if(!ml)
                    274:                                        ml=dir[dirnum]->lib;
                    275:                 else
                    276:                                        ml--;
                    277:                 CRLF;
                    278:                                for(j=0;j<usrdirs[ml];j++)
                    279:                     bprintf(text[MoveToDirLstFmt]
                    280:                                                ,j+1,dir[usrdir[ml][j]]->lname);
                    281:                 SYNC;
                    282:                                bprintf(text[MoveToDirPrompt],usrdirs[ml]);
                    283:                                if((md=getnum(usrdirs[ml]))==-1)
                    284:                                        return(2);
                    285:                                if(!md)
                    286:                                        md=usrdirs[ml]-1;
                    287:                                else md--;
                    288:                                CRLF; }
                    289:                        lncntr=0;
                    290:                        for(c=0;c<d;c++) {
                    291:                                if(strchr(str+c,'.')) {     /* filename or spec given */
                    292:                                        f.dir=dirnum;
                    293:                                        p=strchr(str+c,SP);
                    294:                                        if(!p) p=strchr(str+c,',');
                    295:                                        if(p) *p=0;
                    296:                                        for(i=0;i<total;i++) {
                    297:                                                padfname(str+c,tmp);
                    298:                                                if(filematch(bf[i].name,tmp)) {
                    299:                                                        strcpy(f.name,bf[i].name);
                    300:                                                        unpadfname(f.name,fname);
                    301:                                                        f.datoffset=bf[i].datoffset;
                    302:                                                        f.dateuled=bf[i].dateuled;
                    303:                                                        f.datedled=bf[i].datedled;
                    304:                                                        f.size=0;
                    305:                                                        getfiledat(&f);
                    306:                                                        if(f.opencount) {
                    307:                                                                bprintf(text[FileIsOpen]
                    308:                                                                        ,f.opencount,f.opencount>1 ? "s":nulstr);
                    309:                                                                continue; }
                    310:                                                        if(ch=='D') {
                    311:                                                                removefiledat(f);
                    312:                                                                if(remfile) {
                    313:                                                                        sprintf(tmp,"%s%s",dir[f.dir]->path,fname);
                    314:                                                                        remove(tmp); }
                    315:                                                                if(remcdt)
                    316:                                                                        removefcdt(f); }
                    317:                                                        else if(ch=='M')
                    318:                                                                movefile(f,usrdir[ml][md]); } } }
                    319:                                if(strchr(str+c,'.'))
                    320:                                        c+=strlen(str+c);
                    321:                                else if(str[c]<'A'+total && str[c]>='A') {
                    322:                                        f.dir=dirnum;
                    323:                                        strcpy(f.name,bf[str[c]-'A'].name);
                    324:                                        unpadfname(f.name,fname);
                    325:                                        f.datoffset=bf[str[c]-'A'].datoffset;
                    326:                                        f.dateuled=bf[str[c]-'A'].dateuled;
                    327:                                        f.datedled=bf[str[c]-'A'].datedled;
                    328:                                        f.size=0;
                    329:                                        getfiledat(&f);
                    330:                                        if(f.opencount) {
                    331:                                                bprintf(text[FileIsOpen]
                    332:                                                        ,f.opencount,f.opencount>1 ? "s":nulstr);
                    333:                                                continue; }
                    334:                                        if(ch=='D') {
                    335:                                                removefiledat(f);
                    336:                                                if(remfile) {
                    337:                                                        sprintf(tmp,"%s%s",dir[f.dir]->path,fname);
                    338:                                                        remove(tmp); }
                    339:                                                if(remcdt)
                    340:                                                        removefcdt(f); }
                    341:                                        else if(ch=='M')
                    342:                                                movefile(f,usrdir[ml][md]); } }
                    343:                        return(2); }
                    344:                clearline();
                    345:         continue; }
                    346: 
                    347:        return(1); }
                    348: 
                    349: return(-1);
                    350: }
                    351: 
                    352: /*****************************************************************************/
                    353: /* List files in directory 'dir' that match 'filespec'. Filespec must be        */
                    354: /* padded. ex: FILE*   .EXT, not FILE*.EXT. 'mode' determines other critiria */
                    355: /* the files must meet before they'll be listed. 'mode' bit FL_NOHDR doesn't */
                    356: /* list the directory header.                                                */
                    357: /* Returns -1 if the listing was aborted, otherwise total files listed          */
                    358: /*****************************************************************************/
                    359: int listfiles(uint dirnum, char *filespec, int tofile, char mode)
                    360: {
                    361:        uchar str[256],hdr[256],cmd[129],c,d,letter='A',*buf,*p,ext[513];
                    362:        uchar HUGE16 *datbuf,HUGE16 *ixbbuf,flagprompt=0;
                    363:        int i,j,file,found=0,lastbat=0,disp;
                    364:        ulong l,m=0,n,length,anchor,next,datbuflen;
                    365:        file_t f,bf[26];        /* bf is batch flagged files */
                    366: 
                    367: if(mode&FL_ULTIME) {
                    368:        last_ns_time=now;
                    369:     sprintf(str,"%s%s.DAB",dir[dirnum]->data_dir,dir[dirnum]->code);
                    370:        if((file=nopen(str,O_RDONLY))!=-1) {
                    371:                read(file,&l,4);
                    372:                close(file);
                    373:                if(ns_time>l)
                    374:                        return(0); } }
                    375: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code);
                    376: if((file=nopen(str,O_RDONLY))==-1)
                    377:        return(0);
                    378: l=filelength(file);
                    379: if(!l) {
                    380:        close(file);
                    381:        return(0); }
                    382: if((ixbbuf=(char *)MALLOC(l))==NULL) {
                    383:        close(file);
                    384:        errormsg(WHERE,ERR_ALLOC,str,l);
                    385:        return(0); }
                    386: if(lread(file,ixbbuf,l)!=l) {
                    387:        close(file);
                    388:        errormsg(WHERE,ERR_READ,str,l);
                    389:        FREE((char *)ixbbuf);
                    390:        return(0); }
                    391: close(file);
                    392: sprintf(str,"%s%s.DAT",dir[dirnum]->data_dir,dir[dirnum]->code);
                    393: if((file=nopen(str,O_RDONLY))==-1) {
                    394:        errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
                    395:        FREE((char *)ixbbuf);
                    396:        return(0); }
                    397: datbuflen=filelength(file);
                    398: if((datbuf=MALLOC(datbuflen))==NULL) {
                    399:        close(file);
                    400:        errormsg(WHERE,ERR_ALLOC,str,datbuflen);
                    401:        FREE((char *)ixbbuf);
                    402:        return(0); }
                    403: if(lread(file,datbuf,datbuflen)!=datbuflen) {
                    404:        close(file);
                    405:        errormsg(WHERE,ERR_READ,str,datbuflen);
                    406:        FREE((char *)datbuf);
                    407:        FREE((char *)ixbbuf);
                    408:        return(0); }
                    409: close(file);
                    410: if(!tofile) {
                    411:        action=NODE_LFIL;
                    412:        getnodedat(node_num,&thisnode,0);
                    413:        if(thisnode.action!=NODE_LFIL) {        /* was a sync */
                    414:                getnodedat(node_num,&thisnode,1);
                    415:                thisnode.action=NODE_LFIL;
                    416:                putnodedat(node_num,thisnode); } }
                    417: while(online && found<MAX_FILES) {
                    418:        if(found<0)
                    419:                found=0;
                    420:        if(m>=l || flagprompt) {                  /* End of list */
                    421:                if(useron.misc&BATCHFLAG && !tofile && found && found!=lastbat
                    422:                        && !(mode&(FL_EXFIND|FL_VIEW))) {
                    423:                        flagprompt=0;
                    424:                        lncntr=0;
                    425:                        if((i=batchflagprompt(dirnum,bf,letter-'A',l/F_IXBSIZE))==2) {
                    426:                                m=anchor;
                    427:                                found-=letter-'A';
                    428:                                letter='A'; }
                    429:                        else if(i==3) {
                    430:                                if((long)anchor-((letter-'A')*F_IXBSIZE)<0) {
                    431:                                        m=0;
                    432:                                        found=0; }
                    433:                                else {
                    434:                                        m=anchor-((letter-'A')*F_IXBSIZE);
                    435:                                        found-=letter-'A'; }
                    436:                                letter='A'; }
                    437:                        else if(i==-1) {
                    438:                                FREE((char *)ixbbuf);
                    439:                                FREE((char *)datbuf);
                    440:                                return(-1); }
                    441:                        else
                    442:                                break;
                    443:                        getnodedat(node_num,&thisnode,0);
                    444:                        nodesync(); }
                    445:                else
                    446:                        break; }
                    447: 
                    448:        if(letter>'Z')
                    449:                letter='A';
                    450:        if(letter=='A')
                    451:                anchor=m;
                    452: 
                    453:        if(msgabort()) {                 /* used to be !tofile && msgabort() */
                    454:                FREE((char *)ixbbuf);
                    455:                FREE((char *)datbuf);
                    456:                return(-1); }
                    457:        for(j=0;j<12 && m<l;j++)
                    458:                if(j==8)
                    459:                        str[j]='.';
                    460:                else
                    461:                        str[j]=ixbbuf[m++];             /* Turns FILENAMEEXT into FILENAME.EXT */
                    462:        str[j]=0;
                    463:        if(!(mode&(FL_FINDDESC|FL_EXFIND)) && filespec[0]
                    464:                && !filematch(str,filespec)) {
                    465:                m+=11;
                    466:                continue; }
                    467:        n=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16);
                    468:        if(n>=datbuflen) {      /* out of bounds */
                    469:                m+=11;
                    470:                continue; }
                    471:        if(mode&(FL_FINDDESC|FL_EXFIND)) {
                    472:                getrec((char *)&datbuf[n],F_DESC,LEN_FDESC,tmp);
                    473:                strupr(tmp);
                    474:                p=strstr(tmp,filespec);
                    475:                if(!(mode&FL_EXFIND) && p==NULL) {
                    476:                        m+=11;
                    477:                        continue; }
                    478:                getrec((char *)&datbuf[n],F_MISC,1,tmp);
                    479:                j=tmp[0];  /* misc bits */
                    480:                if(j) j-=SP;
                    481:                if(mode&FL_EXFIND && j&FM_EXTDESC) { /* search extended description */
                    482:                        getextdesc(dirnum,n,ext);
                    483:                        strupr(ext);
                    484:                        if(!strstr(ext,filespec) && !p) {       /* not in description or */
                    485:                                m+=11;                                           /* extended description */
                    486:                                continue; } }
                    487:                else if(!p) {                    /* no extended description and not in desc */
                    488:                        m+=11;
                    489:                        continue; } }
                    490:        if(mode&FL_ULTIME) {
                    491:                if(ns_time>(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)|((long)ixbbuf[m+5]<<16)
                    492:                        |((long)ixbbuf[m+6]<<24))) {
                    493:                        m+=11;
                    494:                        continue; } }
                    495:        if(useron.misc&BATCHFLAG && letter=='A' && found && !tofile
                    496:                && !(mode&(FL_EXFIND|FL_VIEW))
                    497:                && (!mode || !(useron.misc&EXPERT)))
                    498:         bputs(text[FileListBatchCommands]);
                    499:        m+=11;
                    500:        if(!found && !(mode&(FL_EXFIND|FL_VIEW))) {
                    501:                for(i=0;i<usrlibs;i++)
                    502:                        if(usrlib[i]==dir[dirnum]->lib)
                    503:                                break;
                    504:                for(j=0;j<usrdirs[i];j++)
                    505:                        if(usrdir[i][j]==dirnum)
                    506:                                break;                                          /* big header */
                    507:                if((!mode || !(useron.misc&EXPERT)) && !tofile && (!filespec[0]
                    508:                        || (strchr(filespec,'*') || strchr(filespec,'?')))) {
                    509:                        sprintf(hdr,"%s%s.HDR",dir[dirnum]->data_dir,dir[dirnum]->code);
                    510:                        if(fexist(hdr))
                    511:                                printfile(hdr,0);       /* Use DATA\DIRS\<CODE>.HDR */
                    512:                        else {
                    513:                                if(useron.misc&BATCHFLAG)
                    514:                                        bputs(text[FileListBatchCommands]);
                    515:                                else {
                    516:                                        CLS;
                    517:                                        d=strlen(lib[usrlib[i]]->lname)>strlen(dir[dirnum]->lname) ?
                    518:                                                strlen(lib[usrlib[i]]->lname)+17
                    519:                                                : strlen(dir[dirnum]->lname)+17;
                    520:                                        if(i>8 || j>8) d++;
                    521:                                        attr(color[clr_filelsthdrbox]);
                    522:                                        bputs("��");            /* use to start with \r\n */
                    523:                                        for(c=0;c<d;c++)
                    524:                                                outchar('�');
                    525:                                        bputs("�\r\n� ");
                    526:                                        sprintf(hdr,text[BoxHdrLib],i+1,lib[usrlib[i]]->lname);
                    527:                                        bputs(hdr);
                    528:                                        for(c=bstrlen(hdr);c<d;c++)
                    529:                                                outchar(SP);
                    530:                                        bputs("�\r\n� ");
                    531:                                        sprintf(hdr,text[BoxHdrDir],j+1,dir[dirnum]->lname);
                    532:                                        bputs(hdr);
                    533:                                        for(c=bstrlen(hdr);c<d;c++)
                    534:                                                outchar(SP);
                    535:                                        bputs("�\r\n� ");
                    536:                                        sprintf(hdr,text[BoxHdrFiles],l/F_IXBSIZE);
                    537:                                        bputs(hdr);
                    538:                                        for(c=bstrlen(hdr);c<d;c++)
                    539:                                                outchar(SP);
                    540:                                        bputs("�\r\n��");
                    541:                                        for(c=0;c<d;c++)
                    542:                                                outchar('�');
                    543:                                        bputs("�\r\n"); } } }
                    544:                else {                                  /* short header */
                    545:                        if(tofile) {
                    546:                                sprintf(hdr,"(%u) %s ",i+1,lib[usrlib[i]]->sname);
                    547:                                write(tofile,crlf,2);
                    548:                                write(tofile,hdr,strlen(hdr)); }
                    549:                        else {
                    550:                                sprintf(hdr,text[ShortHdrLib],i+1,lib[usrlib[i]]->sname);
                    551:                                bputs("\r\1>\r\n");
                    552:                                bputs(hdr); }
                    553:                        c=bstrlen(hdr);
                    554:                        if(tofile) {
                    555:                                sprintf(hdr,"(%u) %s",j+1,dir[dirnum]->lname);
                    556:                                write(tofile,hdr,strlen(hdr)); }
                    557:                        else {
                    558:                                sprintf(hdr,text[ShortHdrDir],j+1,dir[dirnum]->lname);
                    559:                                bputs(hdr); }
                    560:                        c+=bstrlen(hdr);
                    561:                        if(tofile) {
                    562:                                write(tofile,crlf,2);
                    563:                                sprintf(hdr,"%*s",c,nulstr);
                    564:                                strset(hdr,'�');
                    565:                                strcat(hdr,crlf);
                    566:                                write(tofile,hdr,strlen(hdr)); }
                    567:                        else {
                    568:                                CRLF;
                    569:                                attr(color[clr_filelstline]);
                    570:                                while(c--)
                    571:                                        outchar('�');
                    572:                                CRLF; } } }
                    573:        next=m;
                    574:        disp=1;
                    575:        if(mode&(FL_EXFIND|FL_VIEW)) {
                    576:                f.dir=dirnum;
                    577:                strcpy(f.name,str);
                    578:                m-=11;
                    579:                f.datoffset=n;
                    580:                f.dateuled=ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)
                    581:                        |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24);
                    582:                f.datedled=ixbbuf[m+7]|((long)ixbbuf[m+8]<<8)
                    583:                        |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24);
                    584:                m+=11;
                    585:                f.size=0;
                    586:                getfiledat(&f);
                    587:                if(!found)
                    588:                        bputs("\r\1>");
                    589:                if(mode&FL_EXFIND) {
                    590:                        if(!viewfile(f,1)) {
                    591:                                FREE((char *)ixbbuf);
                    592:                                FREE((char *)datbuf);
                    593:                                return(-1); } }
                    594:                else {
                    595:                        if(!viewfile(f,0)) {
                    596:                                FREE((char *)ixbbuf);
                    597:                                FREE((char *)datbuf);
                    598:                                return(-1); } } }
                    599: 
                    600:        else if(tofile)
                    601:                listfiletofile(str,&datbuf[n],dirnum,tofile);
                    602:        else if(mode&FL_FINDDESC)
                    603:                disp=listfile(str,&datbuf[n],dirnum,filespec,letter,n);
                    604:        else
                    605:                disp=listfile(str,&datbuf[n],dirnum,nulstr,letter,n);
                    606:        if(!disp && letter>'A') {
                    607:                next=m-F_IXBSIZE;
                    608:                letter--; }
                    609:        else {
                    610:                disp=1;
                    611:                found++; }
                    612:        if(sys_status&SS_ABORT) {
                    613:                FREE((char *)ixbbuf);
                    614:                FREE((char *)datbuf);
                    615:                return(-1); }
                    616:        if(mode&(FL_EXFIND|FL_VIEW))
                    617:                continue;
                    618:        if(useron.misc&BATCHFLAG && !tofile) {
                    619:                if(disp) {
                    620:                        strcpy(bf[letter-'A'].name,str);
                    621:                        m-=11;
                    622:                        bf[letter-'A'].datoffset=n;
                    623:                        bf[letter-'A'].dateuled=ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)
                    624:                                |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24);
                    625:                        bf[letter-'A'].datedled=ixbbuf[m+7]|((long)ixbbuf[m+8]<<8)
                    626:                                |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24); }
                    627:         m+=11;
                    628:                if(flagprompt || letter=='Z' || !disp ||
                    629:                        (filespec[0] && !strchr(filespec,'*') && !strchr(filespec,'?')
                    630:                        && !(mode&FL_FINDDESC))
                    631:                        || (useron.misc&BATCHFLAG && !tofile && lncntr>=rows-2)
                    632:                        ) {
                    633:                        flagprompt=0;
                    634:                        lncntr=0;
                    635:                        lastbat=found;
                    636:                        if((i=batchflagprompt(dirnum,bf,letter-'A'+1,l/F_IXBSIZE))<1) {
                    637:                                FREE((char *)ixbbuf);
                    638:                                FREE((char *)datbuf);
                    639:                                if(i==-1)
                    640:                                        return(-1);
                    641:                                else
                    642:                                        return(found); }
                    643:                        if(i==2) {
                    644:                                next=anchor;
                    645:                                found-=(letter-'A')+1; }
                    646:                        else if(i==3) {
                    647:                                if((long)anchor-((letter-'A'+1)*F_IXBSIZE)<0) {
                    648:                                        next=0;
                    649:                                        found=0; }
                    650:                                else {
                    651:                                        next=anchor-((letter-'A'+1)*F_IXBSIZE);
                    652:                                        found-=letter-'A'+1; } }
                    653:                        getnodedat(node_num,&thisnode,0);
                    654:                        nodesync();
                    655:                        letter='A';     }
                    656:                else letter++; }
                    657:        if(useron.misc&BATCHFLAG && !tofile
                    658:                && lncntr>=rows-2) {
                    659:                lncntr=0;               /* defeat pause() */
                    660:                flagprompt=1; }
                    661:        m=next;
                    662:        if(mode&FL_FINDDESC) continue;
                    663:        if(filespec[0] && !strchr(filespec,'*') && !strchr(filespec,'?') && m)
                    664:                break; }
                    665: 
                    666: FREE((char *)ixbbuf);
                    667: FREE((char *)datbuf);
                    668: return(found);
                    669: }
                    670: 
                    671: int cntlines(char *str)
                    672: {
                    673:        int i,lc,last;
                    674: 
                    675: for(i=lc=last=0;str[i];i++)
                    676:        if(str[i]==LF || i-last>LEN_FDESC) {
                    677:                lc++;
                    678:                last=i; }
                    679: return(lc);
                    680: }
                    681: 
                    682: /****************************************************************************/
                    683: /* Prints one file's information on a single line                           */
                    684: /* Return 1 if displayed, 0 otherwise                                                                          */
                    685: /****************************************************************************/
                    686: int listfile(char *fname, char HUGE16 *buf, uint dirnum
                    687:        , char *search, char letter, ulong datoffset)
                    688: {
                    689:        char str[256],ext[513]="",*ptr,*cr,*lf,exist=1;
                    690:     uchar alt;
                    691:     int i,j;
                    692:     ulong cdt;
                    693: 
                    694: if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC && useron.misc&EXTDESC) {
                    695:        getextdesc(dirnum,datoffset,ext);
1.1.1.2 ! root      696:        if(useron.misc&BATCHFLAG && lncntr+cntlines(ext)>=rows-2 && letter!='A')
1.1       root      697:                return(0); }
                    698: attr(color[clr_filename]);
                    699: bputs(fname);
                    700: if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC) {
                    701:        if(!(useron.misc&EXTDESC))
                    702:                outchar('+');
                    703:        else
                    704:                outchar(SP); }
                    705: else
                    706:     outchar(SP);
                    707: if(useron.misc&BATCHFLAG) {
                    708:     attr(color[clr_filedesc]);
                    709:     bprintf("%c",letter); }
                    710: getrec((char *)buf,F_ALTPATH,2,str);
                    711: alt=(uchar)ahtoul(str);
                    712: sprintf(str,"%s%s",alt>0 && alt<=altpaths ? altpath[alt-1]:dir[dirnum]->path
                    713:     ,unpadfname(fname,tmp));
                    714: if(dir[dirnum]->misc&DIR_FCHK && !fexist(str)) {
                    715:     exist=0;
                    716:     attr(color[clr_err]); }
                    717: else
                    718:     attr(color[clr_filecdt]);
                    719: getrec((char *)buf,F_CDT,LEN_FCDT,str);
                    720: cdt=atol(str);
                    721: if(useron.misc&BATCHFLAG) {
                    722:     if(!cdt) {
                    723:         attr(curatr^(HIGH|BLINK));
                    724:         bputs("  FREE"); }
                    725:     else {
                    726:         if(cdt<1024)    /* 1k is smallest size */
                    727:             cdt=1024;
                    728:                bprintf("%5luk",cdt/1024L); } }
                    729: else {
                    730:     if(!cdt) {  /* FREE file */
                    731:         attr(curatr^(HIGH|BLINK));
                    732:         bputs("   FREE"); }
                    733:        else if(cdt>9999999L)
                    734:                bprintf("%6luk",cdt/1024L);
                    735:        else
                    736:         bprintf("%7lu",cdt); }
                    737: if(exist)
                    738:     outchar(SP);
                    739: else
                    740:     outchar('-');
                    741: getrec((char *)buf,F_DESC,LEN_FDESC,str);
                    742: attr(color[clr_filedesc]);
                    743: if(!ext[0]) {
                    744:        if(search[0]) { /* high-light string in string */
                    745:                strcpy(tmp,str);
                    746:                strupr(tmp);
                    747:                ptr=strstr(tmp,search);
                    748:                i=strlen(search);
                    749:                j=ptr-tmp;
                    750:                bprintf("%.*s",j,str);
                    751:                attr(color[clr_filedesc]^HIGH);
                    752:                bprintf("%.*s",i,str+j);
                    753:                attr(color[clr_filedesc]);
                    754:                bprintf("%.*s",strlen(str)-(j+i),str+j+i); }
                    755:        else
                    756:                bputs(str);
                    757:        CRLF; }
                    758: ptr=ext;
                    759: while(*ptr && ptr<ext+512 && !msgabort()) {
                    760:        cr=strchr(ptr,CR);
                    761:        lf=strchr(ptr,LF);
                    762:        if(lf && (lf<cr || !cr)) cr=lf;
                    763:        if(cr>ptr+LEN_FDESC)
                    764:                cr=ptr+LEN_FDESC;
                    765:        else if(cr)
                    766:                *cr=0;
                    767: //       bprintf("%.*s\r\n",LEN_FDESC,ptr);
                    768:        sprintf(str,"%.*s\r\n",LEN_FDESC,ptr);
                    769:        putmsg(str,P_NOATCODES|P_SAVEATR);
                    770:        if(!cr) {
                    771:                if(strlen(ptr)>LEN_FDESC)
                    772:                        cr=ptr+LEN_FDESC;
                    773:                else
                    774:                        break; }
                    775:        if(!(*(cr+1)) || !(*(cr+2)))
                    776:                break;
                    777:        bprintf("%21s",nulstr);
                    778:        ptr=cr;
                    779:        if(!(*ptr)) ptr++;
                    780:        while(*ptr==LF || *ptr==CR) ptr++; }
                    781: return(1);
                    782: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.