/*
* This routine simply generates index files for all the virtual numbers.
* The output format is one per line, <vnum> <line> <byte-offset>
*/
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
#include "include/bug.h"
#include "include/structs.h"
#include "include/main.h"
#include "include/utils.h"
#define _MAKE_INDEX_C
#include "include/make_index.h"
vnum_index *make_index(char *infile, char *outfile)
{
FILE *ifp,
*ofp = NULL;
vnum_index *VIndex;
/*
* vnum *VNum;
*/
register int i,
j;
/*
* register long OldPos;
*/
long Line,
Pos;
char *tmp;
if (!infile || !*infile)
return NULL;
VIndex = (vnum_index *)get_mem(1, sizeof(vnum_index));
bzero(VIndex, sizeof(vnum_index));
VIndex->VNum = (vnum *)get_mem(1, sizeof(vnum));
bzero(VIndex->VNum, sizeof(vnum));
ifp = open_file(infile, "r");
if (!Quiet) {
fprintf(stderr, "Indexing %s...", infile);
fflush(stderr);
}
for (i = Line = Pos = 0; (tmp = get_line(ifp, &Line, &Pos, 1));) {
if (!Quiet)
spin(stderr);
if (*tmp == '#') {
sscanf(tmp + 1, "%d", &(VIndex->VNum[i].Number));
VIndex->VNum[i].Line = Line;
VIndex->VNum[i].Pos = Pos;
if (!verify_pos(ifp, Pos, '#')) {
log_error("Sanity check failed! Wrong byte position!");
fclose(ofp);
fclose(ifp);
exit(__LINE__);
}
i++;
VIndex->VNum = (vnum *)get_more_mem((char *)VIndex->VNum, i + 1, sizeof(vnum));
bzero(&(VIndex->VNum[i]), sizeof(vnum));
}
}
if (!Quiet)
fprintf(stderr, "done.\n");
if (!outfile || !*outfile) {
VIndex->Count = i;
} else {
ofp = open_file(outfile, "w");
fprintf(ofp, "Found %d Virtual numbers in %s.\n", i, infile);
for (j = 0; j < i; j++)
fprintf(ofp, "#%05d Line % 6ld Byte % 8ld\n",
VIndex->VNum[j].Number, VIndex->VNum[j].Line, VIndex->VNum[j].Pos);
fclose(ofp);
}
fclose(ifp);
return VIndex;
}