U0 BgtDataRead() { CBgtEntry *tmpb; CBgtTemplate *tmpt; I64 i, count, size; U8 *b, *ptr; I64 max_num; U8 **s = StrFileRead(bgt_string_file, &max_num); MemSet(&b_head, 0, sizeof(CBgtEntry)); QueueInit(&b_head); b_head.date = Now; MemSet(&t_head, 0, sizeof(CBgtTemplate)); QueueInit(&t_head); t_head.b.date = Now; if (ptr = b = FileRead(bgt_data_file, &size)) { count = *ptr(I64 *)++; for (i = 0; i < count; i++) { tmpb = CAlloc(sizeof(CBgtEntry)); MemCopy(&tmpb->start, ptr, BE_SIZE); tmpb->credit = StrNew(s[tmpb->credit_idx]); tmpb->debit = StrNew(s[tmpb->debit_idx]); tmpb->desc = StrNew(s[tmpb->desc_idx]); QueueInsert(tmpb, b_head.last); ptr += BE_SIZE; } count = *ptr(I64 *)++; for (i = 0; i < count; i++) { tmpt = CAlloc(sizeof(CBgtTemplate)); MemCopy(&tmpt->start, ptr, BT_SIZE); ptr += BT_SIZE; MemCopy(&tmpt->b.start, ptr, BE_SIZE); ptr += BE_SIZE; tmpt->b.credit = StrNew(s[tmpt->b.credit_idx]); tmpt->b.debit = StrNew(s[tmpt->b.debit_idx]); tmpt->b.desc = StrNew(s[tmpt->b.desc_idx]); QueueInsert(tmpt, t_head.last); } } StrFileArrDel(s, max_num); Free(b); BgtAcctsUpdate; } U0 BgtDataWrite() { I64 i, num = 0, size, count1, count2; CHashTable *table = HashTableNew(1024); CBgtEntry *tmpb; CBgtTemplate *tmpt; CHashGeneric *tmph; U8 *buf, *ptr; for (i = 0; i <= accts_table->mask; i++) { tmph=accts_table->body[i]; while (tmph) { StrFileAdd(tmph->str, &num, table); //Cosmetics -- make accts appear first. tmph = tmph->next; } } tmpb = b_head.next; count1 = 0; while (tmpb != &b_head) { if (tmpb->type != BE_TEMPLATE_COPY) { tmpb->credit_idx = StrFileAdd(tmpb->credit, &num, table); tmpb->debit_idx = StrFileAdd(tmpb->debit, &num, table); tmpb->desc_idx = StrFileAdd(tmpb->desc, &num, table); count1++; } tmpb = tmpb->next; } tmpt = t_head.next; count2 = 0; while (tmpt != &t_head) { tmpt->b.credit_idx = StrFileAdd(tmpt->b.credit, &num, table); tmpt->b.debit_idx = StrFileAdd(tmpt->b.debit, &num, table); tmpt->b.desc_idx = StrFileAdd(tmpt->b.desc, &num, table); count2++; tmpt = tmpt->next; } StrFileWrite(bgt_string_file, table); StrFileDel(table); size = sizeof(I64) * 2 + count1 * BE_SIZE + count2 * (BT_SIZE + BE_SIZE); buf = ptr = MAlloc(size); MemCopy(ptr, &count1, sizeof(I64)); ptr += sizeof(I64); tmpb=b_head.next; while (tmpb != &b_head) { if (tmpb->type != BE_TEMPLATE_COPY) { MemCopy(ptr, &tmpb->start, BE_SIZE); ptr += BE_SIZE; } tmpb = tmpb->next; } MemCopy(ptr, &count2, sizeof(I64)); ptr += sizeof(I64); tmpt=t_head.next; while (tmpt != &t_head) { MemCopy(ptr, &tmpt->start, BT_SIZE); ptr += BT_SIZE; MemCopy(ptr, &tmpt->b.start, BE_SIZE); ptr += BE_SIZE; tmpt = tmpt->next; } FileWrite(bgt_data_file, buf, size); Free(buf); } U0 BgtDel() { CBgtEntry *tmpb, *tmpb1; CBgtTemplate *tmpt, *tmpt1; tmpb = b_head.next; while (tmpb != &b_head) { tmpb1 = tmpb->next; BgtEntryDel2(tmpb); Free(tmpb); tmpb = tmpb1; } tmpt = t_head.next; while (tmpt != &t_head) { tmpt1 = tmpt->next; BgtEntryDel2(&tmpt->b); Free(tmpt); tmpt = tmpt1; } StrFileDel(accts_table); accts_table = NULL; accts_table_strs = 0; }