diff options
Diffstat (limited to 'macros/inrstex/inrsdoc/indsort.c')
-rw-r--r-- | macros/inrstex/inrsdoc/indsort.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/macros/inrstex/inrsdoc/indsort.c b/macros/inrstex/inrsdoc/indsort.c new file mode 100644 index 0000000000..93b9f4dd24 --- /dev/null +++ b/macros/inrstex/inrsdoc/indsort.c @@ -0,0 +1,113 @@ +/* +This reads a an unsorted index file *.ind and writes a sorted, and converted +*.sor index file +File Names are specialized to the INRSTeX reference book +... DOS version uses strncmpi() +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <alloc.h> +#include <ctype.h> + +#define NUL ((char)0) +#define BSLASH ((char)0x5c) +#define CR ((char)0x0d) +#define LF ((char)0x0a) +#define MAX 900 +#define CS 20 +#define SS 510 +#define PL 8 +/* type def */ + +typedef struct { + char cmp_str[CS]; + char *str; +} ind; + +/* the variables */ + + FILE *outfile; /* out file. */ + FILE *infile; /* input file */ + char in_buf[512]; /* input buffer */ + ind index[MAX]; + char work[512]; + int j, k, l, cp, in_len ; /* dummy vars */ + int mem_over, op; + +/* Comparison Function */ +int sortfcn(const void *a, const void *b) + { + return (strcmpi(a,b)); + } + + + + +/***** +* The main function. +input file name is masth.ind output is masth.sor ... for inrstex ref book +*****/ +void main() + {printf("\n INRSTeX index massage and sort. \n Input file is 'masth.ind'. \n Output file is 'masth.sor'.\n"); + infile = fopen( "masth.ind", "r"); + if (infile==0) printf("\n Sorry ... I can't find the index file \n `masth.ind` \n"); + else { + outfile = fopen( "masth.sor", "w" ); + j=0; while (j<MAX) {k=0; while (k<CS) {index[j].cmp_str[k]=' '; k++;} + j++; index[j].cmp_str[CS-1]=0; + } + mem_over=0; + cp=0; + while ((fgets(in_buf, 510, infile))&&(cp<MAX)) + { in_len=strlen(in_buf); + index[cp].str=malloc(in_len); + if (index[cp].str==0) {mem_over=1; + printf("\n Memory Overflow"); + break; + } + strncpy(index[cp].str, in_buf, SS-1); + j=0; k=0; + while ((j<CS-PL-1)&&(in_buf[k]!=LF)) + { if (isalpha(in_buf[k])) { + index[cp].cmp_str[j]=in_buf[k]; + j++; + } + k++; + } + if (j==5) {j=0; while (j<5) {index[cp].cmp_str[j]=' '; j++; } } + /* fix for single non-alphabetic commands */ + cp++; + } + qsort((void *) index, cp, sizeof(ind), sortfcn); + printf("\n %d index records were read and sorted. \n", cp); + op=0; + while (op<cp) + { + strncpy(work, index[op].str, SS-1); + if (work[0]=='!') + {fputc(BSLASH,outfile);fputc('2',outfile); + k=1; while (work[k]!='!') + { if ((work[k]=='*')&&(work[k+1]=='/')&&(work[k+2]=='*')) + {fputc(LF,outfile); k++;k++;} + else + {fputc(work[k],outfile); + if (work[k]==BSLASH) fputc('1',outfile); + } + k++; + } + + k++; while ((work[k]!=LF)&&(work[k]!=0)) + {fputc(work[k],outfile); k++;} + fputc(LF,outfile); + } + op++; + } + + fclose(infile); fclose(outfile); + } + } + + +
\ No newline at end of file |