#include #include #ifdef __MSDOS__ /* here goes MS-DOS header files inclusion */ #else # include # include #endif #include int __fsort(const char*filename,int(*fsfnc)(const char*,const char*),__FSORT_MODE mode){ register int fsorted; FILE *f, *ftmp; char buf[FSORT_LINESIZE+1],buftmp[FSORT_LINESIZE+1]; #ifdef __MSDOS__ char ftmpname[L_tmpnam + 1]; tmpnam(ftmpname); #else /* This case is not possible for MS-DOS systems because maximum length of filename is 12 (8 + 3 + 1) */ char ftmpname[] = "_libplaton_platon_misc_fileplus_c_XXXXXX"; close(mkstemp(ftmpname)); #endif /* * Main loop of function __fsort() */ while(1){ if((f=fopen(filename,"rt"))==NULL)return(-1); if((ftmp=fopen(ftmpname,"wt"))==NULL)return(-1); /* Sorting of temporary file. */ if(fgets(buf,sizeof(buf),f)==NULL)break; while(1){ if(fgets(buftmp,sizeof(buftmp),f)==NULL){ if(fputs(buf,ftmp)==EOF)return(-1); break; } if(fsfnc(buf,buftmp)<0){ if(fputs(buf,ftmp)==EOF)return(-1); strcpy(buf,buftmp); } else if(mode==__FSORT_SORTONLY||fsfnc(buf,buftmp)>0)fputs(buftmp,ftmp); } fclose(f); fclose(ftmp); if((f=fopen(filename,"wt"))==NULL)return(-1); if((ftmp=fopen(ftmpname,"rt"))==NULL)return(-1); /* Sorting of output file. */ fsorted=1; if(fgets(buf,sizeof(buf),ftmp)==NULL)break; while(1){ if(fgets(buftmp,sizeof(buftmp),ftmp)==NULL){ if(fputs(buf,f)==EOF)return(-1); break; } if(fsfnc(buf,buftmp)<0){ if(fputs(buf,f)==EOF)return(-1); strcpy(buf,buftmp); } else{ if(mode==__FSORT_SORTONLY||fsfnc(buf,buftmp)>0){ fsorted=0; fputs(buftmp,f); } } } fclose(f); fclose(ftmp); if(fsorted)break; } if(remove(ftmpname))return(-1); return(0); } #if defined(SELF) || defined(SELFTEST) || defined(SELF_FILEPLUS) int main(void) { puts(__FILE__ ": no self-test"); return 0; } #endif