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;
}