Annotation of sbbs/src/sbbs3/sortdir.cpp, revision 1.1

1.1     ! root        1: /* sortdir.cpp */
        !             2: 
        !             3: /* Synchronet file database sorting routines */
        !             4: 
        !             5: /* $Id: sortdir.cpp,v 1.6 2005/09/20 03:39:52 deuce Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            12:  *                                                                                                                                                     *
        !            13:  * This program is free software; you can redistribute it and/or                       *
        !            14:  * modify it under the terms of the GNU General Public License                         *
        !            15:  * as published by the Free Software Foundation; either version 2                      *
        !            16:  * of the License, or (at your option) any later version.                                      *
        !            17:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            19:  *                                                                                                                                                     *
        !            20:  * Anonymous FTP access to the most recent released source is available at     *
        !            21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            22:  *                                                                                                                                                     *
        !            23:  * Anonymous CVS access to the development source and modification history     *
        !            24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            26:  *     (just hit return, no password is necessary)                                                     *
        !            27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            28:  *                                                                                                                                                     *
        !            29:  * For Synchronet coding style and modification guidelines, see                                *
        !            30:  * http://www.synchro.net/source.html                                                                          *
        !            31:  *                                                                                                                                                     *
        !            32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            33:  * format) via e-mail to [email protected]                                                                      *
        !            34:  *                                                                                                                                                     *
        !            35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            36:  ****************************************************************************/
        !            37: 
        !            38: #include "sbbs.h"
        !            39: 
        !            40: /****************************************************************************/
        !            41: /* Re-sorts file directory 'dirnum' according to dir[dirnum]->sort type     */
        !            42: /****************************************************************************/
        !            43: void sbbs_t::resort(uint dirnum)
        !            44: {
        !            45:        char    str[25],ixbfname[128],datfname[128],exbfname[128],txbfname[128]
        !            46:                        ,ext[512],nulbuf[512];
        !            47:        char    tmp[512];
        !            48:        uchar*  ixbbuf, *datbuf;
        !            49:        uchar*  ixbptr[MAX_FILES];
        !            50:        int             ixbfile,datfile,exbfile,txbfile,i,j;
        !            51:        long    ixblen,datlen,offset,newoffset,l;
        !            52: 
        !            53:        memset(nulbuf,0,512);
        !            54:        bprintf(text[ResortLineFmt],cfg.lib[cfg.dir[dirnum]->lib]->sname,cfg.dir[dirnum]->sname);
        !            55:        sprintf(ixbfname,"%s%s.ixb",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code);
        !            56:        sprintf(datfname,"%s%s.dat",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code);
        !            57:        sprintf(exbfname,"%s%s.exb",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code);
        !            58:        sprintf(txbfname,"%s%s.txb",cfg.dir[dirnum]->data_dir,cfg.dir[dirnum]->code);
        !            59: 
        !            60:        if(flength(ixbfname)<1L || flength(datfname)<1L) {
        !            61:                remove(exbfname);
        !            62:                remove(txbfname);
        !            63:                remove(ixbfname);
        !            64:                remove(datfname);
        !            65:                bputs(text[ResortEmptyDir]);
        !            66:                return; }
        !            67:        bputs(text[Sorting]);
        !            68:        if((ixbfile=nopen(ixbfname,O_RDONLY))==-1) {
        !            69:                errormsg(WHERE,ERR_OPEN,ixbfname,O_RDONLY);
        !            70:                return; }
        !            71:        if((datfile=nopen(datfname,O_RDONLY))==-1) {
        !            72:                close(ixbfile);
        !            73:                errormsg(WHERE,ERR_OPEN,datfname,O_RDONLY);
        !            74:                return; }
        !            75:        ixblen=filelength(ixbfile);
        !            76:        datlen=filelength(datfile);
        !            77:        if((ixbbuf=(uchar *)malloc(ixblen))==NULL) {
        !            78:                close(ixbfile);
        !            79:                close(datfile);
        !            80:                errormsg(WHERE,ERR_ALLOC,ixbfname,ixblen);
        !            81:                return; }
        !            82:        if((datbuf=(uchar *)malloc(datlen))==NULL) {
        !            83:                close(ixbfile);
        !            84:                close(datfile);
        !            85:                free((char *)ixbbuf);
        !            86:                errormsg(WHERE,ERR_ALLOC,datfname,datlen);
        !            87:                return; }
        !            88:        if(lread(ixbfile,ixbbuf,ixblen)!=ixblen) {
        !            89:                close(ixbfile);
        !            90:                close(datfile);
        !            91:                free((char *)ixbbuf);
        !            92:                free((char *)datbuf);
        !            93:                errormsg(WHERE,ERR_READ,ixbfname,ixblen);
        !            94:                return; }
        !            95:        if(lread(datfile,datbuf,datlen)!=datlen) {
        !            96:                close(ixbfile);
        !            97:                close(datfile);
        !            98:                free((char *)ixbbuf);
        !            99:                free((char *)datbuf);
        !           100:                errormsg(WHERE,ERR_READ,datfname,datlen);
        !           101:                return; }
        !           102:        close(ixbfile);
        !           103:        close(datfile);
        !           104:        if((ixbfile=nopen(ixbfname,O_WRONLY|O_TRUNC))==-1) {
        !           105:                free((char *)ixbbuf);
        !           106:                free((char *)datbuf);
        !           107:                errormsg(WHERE,ERR_OPEN,ixbfname,O_WRONLY|O_TRUNC);
        !           108:                return; }
        !           109:        if((datfile=nopen(datfname,O_WRONLY|O_TRUNC))==-1) {
        !           110:                close(ixbfile);
        !           111:                free((char *)ixbbuf);
        !           112:                free((char *)datbuf);
        !           113:                errormsg(WHERE,ERR_OPEN,datfname,O_WRONLY|O_TRUNC);
        !           114:                return; }
        !           115:        for(l=0,i=0;l<ixblen && i<MAX_FILES;l+=F_IXBSIZE,i++)
        !           116:                ixbptr[i]=ixbbuf+l;
        !           117:        switch(cfg.dir[dirnum]->sort) {
        !           118:                case SORT_NAME_A:
        !           119:                        qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
        !           120:                                ,(int(*)(const void*, const void*))fnamecmp_a);
        !           121:                        break;
        !           122:                case SORT_NAME_D:
        !           123:                        qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
        !           124:                                ,(int(*)(const void*, const void*))fnamecmp_d);
        !           125:                        break;
        !           126:                case SORT_DATE_A:
        !           127:                        qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
        !           128:                                ,(int(*)(const void*, const void*))fdatecmp_a);
        !           129:                        break;
        !           130:                case SORT_DATE_D:
        !           131:                        qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0])
        !           132:                                ,(int(*)(const void*, const void*))fdatecmp_d);
        !           133:                        break; }
        !           134: 
        !           135:        if((exbfile=nopen(exbfname,O_RDWR|O_CREAT))==-1) {
        !           136:                close(ixbfile);
        !           137:                close(datfile);
        !           138:                free((char *)ixbbuf);
        !           139:                free((char *)datbuf);
        !           140:                errormsg(WHERE,ERR_OPEN,exbfname,O_RDWR|O_CREAT);
        !           141:                return; }
        !           142:        if((txbfile=nopen(txbfname,O_RDWR|O_CREAT))==-1) {
        !           143:                close(exbfile);
        !           144:                close(datfile);
        !           145:                close(exbfile);
        !           146:                free((char *)ixbbuf);
        !           147:                free((char *)datbuf);
        !           148:                errormsg(WHERE,ERR_OPEN,txbfname,O_RDWR|O_CREAT);
        !           149:                return; }
        !           150: 
        !           151:        for(i=0;i<ixblen/F_IXBSIZE;i++) {
        !           152:                offset=ixbptr[i][11]|((long)ixbptr[i][12]<<8)|((long)ixbptr[i][13]<<16);
        !           153:                lwrite(datfile,&datbuf[offset],F_LEN);
        !           154: 
        !           155:                newoffset=(ulong)i*(ulong)F_LEN;
        !           156: 
        !           157:                j=datbuf[offset+F_MISC];  /* misc bits */
        !           158:                if(j!=ETX) j-=' ';
        !           159:                if(j&FM_EXTDESC) { /* extended description */
        !           160:                        lseek(exbfile,(offset/F_LEN)*512L,SEEK_SET);
        !           161:                        memset(ext,0,512);
        !           162:                        read(exbfile,ext,512);
        !           163:                        while(filelength(txbfile)<(newoffset/F_LEN)*512L) {
        !           164:        //                        lseek(txbfile,0L,SEEK_END);
        !           165:                                write(txbfile,nulbuf,512); }
        !           166:                        lseek(txbfile,(newoffset/F_LEN)*512L,SEEK_SET);
        !           167:                        write(txbfile,ext,512); }
        !           168: 
        !           169:                str[0]=newoffset&0xff;     /* Get offset within DAT file for IXB file */
        !           170:                str[1]=(newoffset>>8)&0xff;
        !           171:                str[2]=(newoffset>>16)&0xff;
        !           172:                lwrite(ixbfile,ixbptr[i],11);       /* filename */
        !           173:                lwrite(ixbfile,str,3);              /* offset */
        !           174:                lwrite(ixbfile,ixbptr[i]+14,8); }   /* upload and download times */
        !           175:        close(exbfile);
        !           176:        close(txbfile);
        !           177:        close(ixbfile);
        !           178:        close(datfile);
        !           179:        remove(exbfname);
        !           180:        rename(txbfname,exbfname);
        !           181:        if(!flength(exbfname))
        !           182:                remove(exbfname);
        !           183:        free((char *)ixbbuf);
        !           184:        free((char *)datbuf);
        !           185:        if(ixblen/F_IXBSIZE==datlen/F_LEN)
        !           186:                bputs(text[Sorted]);
        !           187:        else
        !           188:                bprintf(text[Compressed]
        !           189:                        ,(uint)((datlen/F_LEN)-(ixblen/F_IXBSIZE))
        !           190:                        ,ultoac(((datlen/F_LEN)-(ixblen/F_IXBSIZE))*F_LEN,tmp));
        !           191: }
        !           192: 
        !           193: /****************************************************************************/
        !           194: /* Compares filenames for ascending name sort                                                          */
        !           195: /****************************************************************************/
        !           196: int fnamecmp_a(char **str1, char **str2)
        !           197: {
        !           198:        return(strnicmp(*str1,*str2,11));
        !           199: }
        !           200: 
        !           201: /****************************************************************************/
        !           202: /* Compares filenames for descending name sort                                                         */
        !           203: /****************************************************************************/
        !           204: int fnamecmp_d(char **str1, char **str2)
        !           205: {
        !           206:        return(strnicmp(*str2,*str1,11));
        !           207: }
        !           208: 
        !           209: /****************************************************************************/
        !           210: /* Compares file upload dates for ascending date sort                                          */
        !           211: /****************************************************************************/
        !           212: int fdatecmp_a(uchar **buf1, uchar **buf2)
        !           213: {
        !           214:        time_t date1,date2;
        !           215: 
        !           216:        date1=((*buf1)[14]|((long)(*buf1)[15]<<8)|((long)(*buf1)[16]<<16)
        !           217:                |((long)(*buf1)[17]<<24));
        !           218:        date2=((*buf2)[14]|((long)(*buf2)[15]<<8)|((long)(*buf2)[16]<<16)
        !           219:                |((long)(*buf2)[17]<<24));
        !           220:        if(date1>date2) return(1);
        !           221:        if(date1<date2) return(-1);
        !           222:        return(0);
        !           223: }
        !           224: 
        !           225: /****************************************************************************/
        !           226: /* Compares file upload dates for descending date sort                                         */
        !           227: /****************************************************************************/
        !           228: int fdatecmp_d(uchar **buf1, uchar **buf2)
        !           229: {
        !           230:        time_t date1,date2;
        !           231: 
        !           232:        date1=((*buf1)[14]|((long)(*buf1)[15]<<8)|((long)(*buf1)[16]<<16)
        !           233:                |((long)(*buf1)[17]<<24));
        !           234:        date2=((*buf2)[14]|((long)(*buf2)[15]<<8)|((long)(*buf2)[16]<<16)
        !           235:                |((long)(*buf2)[17]<<24));
        !           236:        if(date1>date2) return(-1);
        !           237:        if(date1<date2) return(1);
        !           238:        return(0);
        !           239: }

unix.superglobalmegacorp.com

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