/* BASL2DBF konverterar svenska baslistan till DBF-format */
/* L�nka i LARGE MODEL med BULLET_L.LIB                   */


#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <bullet.h>

struct memorypack MP;
struct initpack IP;
struct exitpack EP;
struct createdatapack CDP;
struct createkeypack CKP;
struct dosfilepack DFP;
struct openpack OP;
struct accesspack AP;
struct statdatapack SDP;
struct exitpack EP;


struct blrectype {
       char tag[1];
       char telnr[11];
       char basnamn[21];
       char prog[2];
       char hastighet[13];
       char sysop[17];
       char nodnr[8];
       char komment[3][58];
};
struct blrectype blrec;

struct fielddesctype fieldlist1[9];

FILE* basdatf;

char blDATname[] = "BASLISTA.DBF";
unsigned blDAThandle;

char basdats[80];

#define TRUE  1
#define FALSE 0

int firsttime;
int rez,level;

main(int argc, char **argv)
{
int i;
char *p;

       if(argc > 1)
       {
               if( ! (basdatf = fopen(argv[1],"rt"))){
                       printf("Couldn't find %s!\n",argv[1]);
                       exit(1);
               }

               init();
               make_dbf();
               clear_fields();
               i = 0;

               firsttime = TRUE;

               while(fgets(basdats,80,basdatf))
               {
                       if(strnicmp(&basdats[2],"- ",2) != 0)
                       {
                               if(! firsttime) {
                                       add_record();
                                       clear_fields();
                                       i = 0;
                               }
                               else
                                       firsttime = FALSE;

                               strncpy(blrec.telnr,&basdats[0],11);
                               strncpy(blrec.basnamn,&basdats[12],21);
                               strncpy(blrec.prog,&basdats[34],2);
                               strncpy(blrec.hastighet,&basdats[37],13);
                               strncpy(blrec.sysop,&basdats[51],17);
                               strncpy(blrec.nodnr,&basdats[69],8);

                               if(blrec.nodnr[6] == 10)
                                         strncpy(&blrec.nodnr[6],"  ",2);
                               else
                                       if(blrec.nodnr[7] == 10)
                                               blrec.nodnr[7] = 32;
                       }
                       else
                       {
                               blrec.komment[i][0] = 0;
                               strcpy(blrec.komment[i],basdats+13);
                               strncpy(&blrec.komment[i][strlen(blrec.komment[i])-1],"  ",2);
                               i++;
                       }
               }
               add_record();

               fclose(basdatf);

               EP.func = EXITXB;
               rez = BULLET(&EP);
       }
       else
       {
               printf("BASL2DBF konverterar BASLISTA till Dbase DBF\n");
               printf("usage: basl2dbf <baslistefilnamn>\n");
       }
}

init()
{
       level = 100;
       MP.func = MEMORYXB;
       rez = BULLET(&MP);
       if (MP.memory < 40000l) {
               rez = 8;
               error();
       }

       level = 110;
       IP.func = INITXB;
       IP.jftmode = 0;
       if((rez = BULLET(&IP)) != 0) error();
}

make_dbf()
{
FILE* dummy;

       if((dummy = fopen(blDATname,"rt"))) {
               fclose(dummy);
               unlink(blDATname);
       }

       strcpy(fieldlist1[0].fieldname,"TELNR");
       strcpy(fieldlist1[0].fieldtype,"C");
       fieldlist1[0].fieldlen = 11;
       fieldlist1[0].fielddc = 0;

       strcpy(fieldlist1[1].fieldname,"BASNAMN");
       strcpy(fieldlist1[1].fieldtype,"C");
       fieldlist1[1].fieldlen = 21;
       fieldlist1[1].fielddc = 0;

       strcpy(fieldlist1[2].fieldname,"PROG");
       strcpy(fieldlist1[2].fieldtype,"C");
       fieldlist1[2].fieldlen = 2;
       fieldlist1[2].fielddc = 0;

       strcpy(fieldlist1[3].fieldname,"HASTIGHET");
       strcpy(fieldlist1[3].fieldtype,"C");
       fieldlist1[3].fieldlen = 13;
       fieldlist1[3].fielddc = 0;

       strcpy(fieldlist1[4].fieldname,"SYSOP");
       strcpy(fieldlist1[4].fieldtype,"C");
       fieldlist1[4].fieldlen = 17;
       fieldlist1[4].fielddc = 0;

       strcpy(fieldlist1[5].fieldname,"NODNR");
       strcpy(fieldlist1[5].fieldtype,"C");
       fieldlist1[5].fieldlen = 8;
       fieldlist1[5].fielddc = 0;

       strcpy(fieldlist1[6].fieldname,"KOMMENT1");
       strcpy(fieldlist1[6].fieldtype,"C");
       fieldlist1[6].fieldlen = 58;
       fieldlist1[6].fielddc = 0;

       strcpy(fieldlist1[7].fieldname,"KOMMENT2");
       strcpy(fieldlist1[7].fieldtype,"C");
       fieldlist1[7].fieldlen = 58;
       fieldlist1[7].fielddc = 0;

       strcpy(fieldlist1[8].fieldname,"KOMMENT3");
       strcpy(fieldlist1[8].fieldtype,"C");
       fieldlist1[8].fieldlen = 58;
       fieldlist1[8].fielddc = 0;

       createdbf(blDATname,9,&fieldlist1);
       opendbf(blDATname,&blDAThandle);
}


createdbf(char far *fname,unsigned nofields,char far *fieldlist)
{
       CDP.func = CREATEDXB;
       CDP.filenameptr = fname;
       CDP.nofields = nofields;
       CDP.fieldlistptr = fieldlist;
       CDP.fileid = 3;

       if((rez = BULLET(&CDP)) != 0) error();
}


opendbf(char far *fname,unsigned *handle)
{
       level = 1010;
       OP.func = OPENDXB;
       OP.filenameptr = fname;
       OP.asmode = READWRITE | DENYNONE;
       if((rez = BULLET(&OP)) != 0) error();
       *handle = OP.handle;
}

add_record()
{
       AP.func = ADDRECORDXB;
       AP.handle = blDAThandle;
       AP.recptr = &blrec;
       rez = BULLET(&AP);
       if(rez != 0) error();
}

clear_fields()
{
       memset(blrec.telnr,32,11);
       memset(blrec.basnamn,32,21);
       memset(blrec.prog,32,2);
       memset(blrec.hastighet,32,13);
       memset(blrec.sysop,32,17);
       memset(blrec.nodnr,32,8);
       memset(blrec.komment[0],32,58);
       memset(blrec.komment[1],32,58);
       memset(blrec.komment[2],32,58);
}

error()
{
       printf("Error: %u at level %u while performing ",rez,level);
       switch (level) {
       case 100:
         printf("a memory request of 140K.\n");
         break;
       default:
         printf("(See source)\n");    /* just check the source */
       }
       exit(1);
}