1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
/*
* LIB/ACTIVE.C - dactive.kp active file support
*
*/
#include "defs.h"
Prototype void InitDActive(const char *fileName);
Prototype void GenerateXRef(Buffer *b, const char *nglist, const char *npName);
KPDB *DActiveDB;
void
InitDActive(const char *fileName)
{
DActiveDB = KPDBOpen(fileName, O_RDWR);
if (DActiveDB == NULL) {
syslog(LOG_CRIT, "InitDActive, open failed: %s", fileName);
exit(1);
}
}
void
GenerateXRef(Buffer *b, const char *nglist, const char *npName)
{
const char *p = nglist;
char group[MAXGNAME];
bwrite(b, "Xref: ", 6);
bwrite(b, npName, strlen(npName));
while (*p) {
int i;
for (i = 0; p[i] && p[i] != ',' && p[i] != ' ' && p[i] != '\t'; ++i)
;
if (i == 0)
break;
if (i < sizeof(group)) {
const char *rec;
int recLen;
bcopy(p, group, i);
group[i] = 0;
rec = KPDBReadRecord(DActiveDB, group, KP_LOCK, &recLen);
if (rec != NULL) {
int flen;
const char *f = KPDBGetField(rec, recLen, "NE", &flen, NULL);
if (f) {
int n = (strtol(f, NULL, 10) + 1) & 0x7FFFFFFF;
char buf[16];
sprintf(buf, "%010d", n);
KPDBWrite(DActiveDB, group, "NE", buf, KP_UNLOCK);
bwrite(b, " ", 1);
bwrite(b, group, i);
bwrite(b, ":", 1);
sprintf(buf, "%d", n);
bwrite(b, buf, strlen(buf));
} else {
KPDBUnlock(DActiveDB, rec);
}
}
}
p += i;
if (*p != ',')
break;
++p;
}
bwrite(b, "\n", 1);
}
|