Ejemplo n.º 1
0
void SalinKata (void) {
/*	Mengakuisisi kata, menyimpan dalam CKata
	I.S.	: CC adalah karakter pertama dari kata
	F.S.	: CKata berisi kata yang sudah diakuisisi, jika karakternya melebihi NMax,
			  sisa "kata" dibuang; CC = BLANK atau CC = MARK; CC adalah karakter 
			  sesudah karakter terakhir yang diakuisisi */  
	/*	Kamus */
	int i=1;
	/*	Algoritma */
	for (;;) {
		CKata.TabKata[i]=CC;
		ADV();
		if (EOP()||(CC==BLANK)||(i==NMax)) {
			break;
		} else {
			i++;
		}
	}
	if (i==NMax) { /* abaikan sisa kata */
		while ((CC!=BLANK)&&(!EOP())) {
			ADV();
		}
	}
	CKata.length=i;
}
Ejemplo n.º 2
0
/*	Primitif-Primitif Mesin Kata */
void Ignore_Blank (void) {
/*	Mengabaikan satu atau beberapa BLANK
	I.S.	: CC sembarang
	F.S. 	: CC ≠ BLANK atau CC = MARK */
	/*	Kamus */
	/*	Algoritma */
	while ((CC==BLANK)&&(!EOP())) {
		ADV();
	}
}
Ejemplo n.º 3
0
void ADVKATA (void)
{
        //algoritma
        Ignore_Blank();
        if (!EOP()) {
                SalinKata();
        } else {
                EndKata = true;
        }
}
Ejemplo n.º 4
0
void  SalinKata (void)
{
        //kamus lokal
       // int i =0;
        //algoritma
        CKata.Length=0;
        while (CC != BLANK && !EOP()) {
                CKata.TabKata[CKata.Length] = CC;
                CKata.Length++;
                CKata.TabKata[CKata.Length]=0;
                ADV();
        }

        if (CC == EOP() && CKata.Length<NMax)
        {
            EndKata = true;
        } else {
                EndKata = false;
        }
}
Ejemplo n.º 5
0
void  STARTKATA(void)
{
        /* Kamus Lokal */
        // Algoritma
        START();
        Ignore_Blank();
        if (EOP() || CC == BLANK ) {
                EndKata = true;
        } else {
                SalinKata();
        }
}
Ejemplo n.º 6
0
void ADVKATA (void) {
/*	I.S.	: EndKata = false; CC adalah karakter sesudah karakter terakhir dari kata
			  yang sudah diakuisisi
	F.S.	: Jika CC = MARK, maka EndKata = true atau EndKata = false,
			  CKata adalah kata terakhir yang sudah diakuisisi;
			  CC karakter pertama sesudah karakter terakhir kata */
	/*	Kamus */
	/*	Algoritma */
	Ignore_Blank();
	if (EOP()) {
		EndKata=true;
	} else {
		SalinKata();
	}
}  
Ejemplo n.º 7
0
Archivo: main.c Proyecto: amaceh/KULIAH
int main()
{
	char pita[50];
	scanf("%[^\n]s", pita);

	START(pita);

	while(EOP()!=0){
		INC(pita);
		CTBS(pita);
		DBS();
	}
	printf("%d\n", GC());
	return 0;
}
Ejemplo n.º 8
0
void STARTKATA (void) {
/*	I.S.	: CC sembarang
	F.S.	: EndKata = true, dan CC = Mark, atau EndKata = false,
			  CKata adalah kata yang sudah diakuisisi,
			  CC karakter pertama sesudah karakter terakhir kata */
	/*	Kamus */
	/*	Algoritma */
	START();
	Ignore_Blank();
	if (EOP()) {
		EndKata=true;
	} else {
		EndKata=false;
		SalinKata();
	}
}
Ejemplo n.º 9
0
Archivo: main.c Proyecto: amaceh/KULIAH
int main()
{
	char pita[50];
	scanf("%[^\n]s", pita);

	START(pita);
	printf("%c\n", GETCC());

	while(EOP()!=0){
		//INC(pita);
		ADV(pita);
		printf("%c\n", GETCC());
		//sebaiknya titik(EOP) tidak di print
	}
	return 0;
}
Ejemplo n.º 10
0
int main()
{
    printf("=========================");
    printf("=Program Mesin Karakter =");
    printf("=========================");
    printf("\n\nIsi file krktrdsp.txt...\n");
    printf("===========================");
    printf("=========================\n\n");

    START();
    while(!EOP())
    {
        printf("%c",CC);
        DSP+=CountHuruf(CC);
        DSPA+=CountHurufA(CC);
        DSPAN+=CountAN(CC);
        DSPV+=CountVokal(CC);
        DSPK+=CountKonsonan(CC);
        DSP1+=Count_1(CC);
        ADV();
    }

    printf("\n\n===========================");
    printf("=========================\n");
    printf("\nAkhir Pembacaan pita...\n");
    printf("\nJumlah Total Karakter    :%d\n",DSP);
    printf("\nJumlah Karakter A        :%d\n",DSPA);
    printf("\nJumlah Karakter AN       :%d\n",DSPAN);
    printf("\nJumlah Karakter Vokal    :%d\n",DSPV);
    printf("\nJumlah Karakter Konsonan :%d\n",DSPK);
    printf("\nJumlah Karakter 1        :%d\n",DSP1);

    printf("=========================");
    printf("=Copyright by @dyarsa_SP=");
    printf("=========================");

    return 0;
}
Ejemplo n.º 11
0
STATIC void touchlvalue(elem *e)
{ register int i;

  if (e->Eoper == OPind)                /* if indirect store            */
  {
        /* NOTE: Some types of array assignments do not need
         * to touch all variables. (Like a[5], where a is an
         * array instead of a pointer.)
         */

        touchfunc(0);
        return;
  }

  for (i = hcstop; --i >= 0;)
  {     if (hcstab[i].Helem &&
#if TARGET_MAC  // Vsym should be valid before compare
            !EOP(hcstab[i].Helem) &&
            hcstab[i].Helem->Eoper != OPconst &&
#endif
            hcstab[i].Helem->EV.sp.Vsym == e->EV.sp.Vsym)
                hcstab[i].Helem = NULL;
  }

    assert(e->Eoper == OPvar || e->Eoper == OPrelconst);
    switch (e->EV.sp.Vsym->Sclass)
    {
        case SCregpar:
        case SCregister:
        case SCtmp:
        case SCpseudo:
            break;
        case SCauto:
        case SCparameter:
#if TX86
        case SCfastpar:
        case SCbprel:
#endif
            if (e->EV.sp.Vsym->Sflags & SFLunambig)
                break;
            /* FALL-THROUGH */
        case SCstatic:
        case SCextern:
        case SCglobal:
        case SClocstat:
        case SCcomdat:
        case SCinline:
        case SCsinline:
        case SCeinline:
#if TX86
        case SCcomdef:
#endif
            touchstar();
            break;
        default:
#ifdef DEBUG
            elem_print(e);
            symbol_print(e->EV.sp.Vsym);
#endif
            assert(0);
    }
}
Ejemplo n.º 12
0
Archivo: cgxmm.c Proyecto: davispuh/dmd
code *xmmpost(elem *e,regm_t *pretregs)
{
    elem *e1 = e->E1;
    elem *e2 = e->E2;
    tym_t ty1 = tybasic(e1->Ety);

    CodeBuilder cdb;

    regm_t retregs;
    unsigned reg;
    bool regvar = FALSE;
    if (config.flags4 & CFG4optimized)
    {
        // Be careful of cases like (x = x+x+x). We cannot evaluate in
        // x if x is in a register.
        unsigned varreg;
        regm_t varregm;
        if (isregvar(e1,&varregm,&varreg) &&    // if lvalue is register variable
            doinreg(e1->EV.sp.Vsym,e2)          // and we can compute directly into it
           )
        {
            regvar = TRUE;
            retregs = varregm;
            reg = varreg;                       // evaluate directly in target register
            cdb.append(getregs(retregs));       // destroy these regs
        }
    }

    code cs;
    if (!regvar)
    {
        code *c = getlvalue(&cs,e1,0);          // get EA
        cdb.append(c);
        retregs = XMMREGS & ~*pretregs;
        if (!retregs)
            retregs = XMMREGS;
        c = allocreg(&retregs,&reg,ty1);
        cdb.append(c);
        cs.Iop = xmmload(ty1, true);            // MOVSD xmm,xmm_m64
        code_newreg(&cs,reg - XMM0);
        cdb.gen(&cs);
        checkSetVex(cdb.last(), ty1);
    }

    // Result register
    regm_t resultregs = XMMREGS & *pretregs & ~retregs;
    if (!resultregs)
        resultregs = XMMREGS & ~retregs;
    unsigned resultreg;
    code *c = allocreg(&resultregs, &resultreg, ty1);
    cdb.append(c);

    cdb.gen2(xmmload(ty1,true),modregxrmx(3,resultreg-XMM0,reg-XMM0));   // MOVSS/D resultreg,reg
    checkSetVex(cdb.last(), ty1);

    regm_t rretregs = XMMREGS & ~(*pretregs | retregs | resultregs);
    if (!rretregs)
        rretregs = XMMREGS & ~(retregs | resultregs);
    c = codelem(e2,&rretregs,FALSE); // eval right leaf
    cdb.append(c);
    unsigned rreg = findreg(rretregs);

    unsigned op = xmmoperator(e1->Ety, e->Eoper);
    cdb.gen2(op,modregxrmx(3,reg-XMM0,rreg-XMM0));  // ADD reg,rreg
    checkSetVex(cdb.last(), e1->Ety);

    if (!regvar)
    {
        cs.Iop = xmmstore(ty1,true);      // reverse operand order of MOVS[SD]
        cdb.gen(&cs);
        checkSetVex(cdb.last(), ty1);
    }

    if (e1->Ecount ||                     // if lvalue is a CSE or
        regvar)                           // rvalue can't be a CSE
    {
        cdb.append(getregs_imm(retregs)); // necessary if both lvalue and
                                        //  rvalue are CSEs (since a reg
                                        //  can hold only one e at a time)
        cssave(e1,retregs,EOP(e1));     // if lvalue is a CSE
    }

    cdb.append(fixresult(e,resultregs,pretregs));
    freenode(e1);
    return cdb.finish();
}
Ejemplo n.º 13
0
Archivo: cgxmm.c Proyecto: davispuh/dmd
code *xmmeq(elem *e, unsigned op, elem *e1, elem *e2,regm_t *pretregs)
{
    tym_t tymll;
    unsigned reg;
    int i;
    code cs;
    elem *e11;
    bool regvar;                  /* TRUE means evaluate into register variable */
    regm_t varregm;
    unsigned varreg;
    targ_int postinc;

    //printf("xmmeq(e1 = %p, e2 = %p, *pretregs = %s)\n", e1, e2, regm_str(*pretregs));
    int e2oper = e2->Eoper;
    tym_t tyml = tybasic(e1->Ety);              /* type of lvalue               */
    regm_t retregs = *pretregs;

    if (!(retregs & XMMREGS))
        retregs = XMMREGS;              // pick any XMM reg

    bool aligned = xmmIsAligned(e1);
    cs.Iop = (op == OPeq) ? xmmstore(tyml, aligned) : op;
    regvar = FALSE;
    varregm = 0;
    if (config.flags4 & CFG4optimized)
    {
        // Be careful of cases like (x = x+x+x). We cannot evaluate in
        // x if x is in a register.
        if (isregvar(e1,&varregm,&varreg) &&    // if lvalue is register variable
            doinreg(e1->EV.sp.Vsym,e2) &&       // and we can compute directly into it
            varregm & XMMREGS
           )
        {   regvar = TRUE;
            retregs = varregm;
            reg = varreg;       /* evaluate directly in target register */
        }
    }
    if (*pretregs & mPSW && !EOP(e1))     // if evaluating e1 couldn't change flags
    {   // Be careful that this lines up with jmpopcode()
        retregs |= mPSW;
        *pretregs &= ~mPSW;
    }
    CodeBuilder cdb;
    cdb.append(scodelem(e2,&retregs,0,TRUE));    // get rvalue

    // Look for special case of (*p++ = ...), where p is a register variable
    if (e1->Eoper == OPind &&
        ((e11 = e1->E1)->Eoper == OPpostinc || e11->Eoper == OPpostdec) &&
        e11->E1->Eoper == OPvar &&
        e11->E1->EV.sp.Vsym->Sfl == FLreg
       )
    {
        postinc = e11->E2->EV.Vint;
        if (e11->Eoper == OPpostdec)
            postinc = -postinc;
        cdb.append(getlvalue(&cs,e11,RMstore | retregs));
        freenode(e11->E2);
    }
    else
    {   postinc = 0;
        cdb.append(getlvalue(&cs,e1,RMstore | retregs));       // get lvalue (cl == CNIL if regvar)
    }

    cdb.append(getregs_imm(regvar ? varregm : 0));

    reg = findreg(retregs & XMMREGS);
    cs.Irm |= modregrm(0,(reg - XMM0) & 7,0);
    if ((reg - XMM0) & 8)
        cs.Irex |= REX_R;

    // Do not generate mov from register onto itself
    if (!(regvar && reg == XMM0 + ((cs.Irm & 7) | (cs.Irex & REX_B ? 8 : 0))))
    {
        cdb.gen(&cs);         // MOV EA+offset,reg
        if (op == OPeq)
            checkSetVex(cdb.last(), tyml);
    }

    if (e1->Ecount ||                     // if lvalue is a CSE or
        regvar)                           // rvalue can't be a CSE
    {
        cdb.append(getregs_imm(retregs));        // necessary if both lvalue and
                                        //  rvalue are CSEs (since a reg
                                        //  can hold only one e at a time)
        cssave(e1,retregs,EOP(e1));     // if lvalue is a CSE
    }

    cdb.append(fixresult(e,retregs,pretregs));
Lp:
    if (postinc)
    {
        int reg = findreg(idxregm(&cs));
        if (*pretregs & mPSW)
        {   // Use LEA to avoid touching the flags
            unsigned rm = cs.Irm & 7;
            if (cs.Irex & REX_B)
                rm |= 8;
            cdb.genc1(0x8D,buildModregrm(2,reg,rm),FLconst,postinc);
            if (tysize(e11->E1->Ety) == 8)
                code_orrex(cdb.last(), REX_W);
        }
        else if (I64)
        {
            cdb.genc2(0x81,modregrmx(3,0,reg),postinc);
            if (tysize(e11->E1->Ety) == 8)
                code_orrex(cdb.last(), REX_W);
        }
        else
        {
            if (postinc == 1)
                cdb.gen1(0x40 + reg);         // INC reg
            else if (postinc == -(targ_int)1)
                cdb.gen1(0x48 + reg);         // DEC reg
            else
            {
                cdb.genc2(0x81,modregrm(3,0,reg),postinc);
            }
        }
    }
    freenode(e1);
    return cdb.finish();
}
Ejemplo n.º 14
0
Archivo: cgxmm.c Proyecto: dsagal/dmd
code *xmmopass(elem *e,regm_t *pretregs)
{   elem *e1 = e->E1;
    elem *e2 = e->E2;
    tym_t ty1 = tybasic(e1->Ety);
    unsigned sz1 = tysize[ty1];
    regm_t rretregs = XMMREGS & ~*pretregs;
    if (!rretregs)
        rretregs = XMMREGS;

    code *cr = codelem(e2,&rretregs,FALSE); // eval right leaf
    unsigned rreg = findreg(rretregs);

    code cs;
    code *cl,*cg;

    regm_t retregs;
    unsigned reg;
    bool regvar = FALSE;
    if (config.flags4 & CFG4optimized)
    {
        // Be careful of cases like (x = x+x+x). We cannot evaluate in
        // x if x is in a register.
        unsigned varreg;
        regm_t varregm;
        if (isregvar(e1,&varregm,&varreg) &&    // if lvalue is register variable
            doinreg(e1->EV.sp.Vsym,e2)          // and we can compute directly into it
           )
        {   regvar = TRUE;
            retregs = varregm;
            reg = varreg;                       // evaluate directly in target register
            cl = NULL;
            cg = getregs(retregs);              // destroy these regs
        }
    }

    if (!regvar)
    {
        cl = getlvalue(&cs,e1,rretregs);        // get EA
        retregs = *pretregs & XMMREGS & ~rretregs;
        if (!retregs)
            retregs = XMMREGS & ~rretregs;
        cg = allocreg(&retregs,&reg,ty1);
        cs.Iop = xmmload(ty1);                  // MOVSD xmm,xmm_m64
        code_newreg(&cs,reg - XMM0);
        cg = gen(cg,&cs);
    }

    unsigned op = xmmoperator(e1->Ety, e->Eoper);
    code *co = gen2(CNIL,op,modregxrmx(3,reg-XMM0,rreg-XMM0));

    if (!regvar)
    {
        cs.Iop = xmmstore(ty1);           // reverse operand order of MOVS[SD]
        gen(co,&cs);
    }

    if (e1->Ecount ||                     // if lvalue is a CSE or
        regvar)                           // rvalue can't be a CSE
    {
        cl = cat(cl,getregs_imm(retregs));        // necessary if both lvalue and
                                        //  rvalue are CSEs (since a reg
                                        //  can hold only one e at a time)
        cssave(e1,retregs,EOP(e1));     // if lvalue is a CSE
    }

    co = cat(co,fixresult(e,retregs,pretregs));
    freenode(e1);
    return cat4(cr,cl,cg,co);
}
Ejemplo n.º 15
0
void ADV(){
	if(!EOP()){
		CC = getchar();
	}
}	
Ejemplo n.º 16
0
Archivo: cgcs.c Proyecto: Abscissa/dmd
STATIC void ecom(elem **pe)
{ int i,op,hcstopsave;
  unsigned hash;
  elem *e,*ehash;
  tym_t tym;

  e = *pe;
  assert(e);
  elem_debug(e);
#ifdef DEBUG
  assert(e->Ecount == 0);
  //assert(e->Ecomsub == 0);
#endif
  tym = tybasic(e->Ety);
  op = e->Eoper;
  switch (op)
  {
    case OPconst:
    case OPvar:
    case OPrelconst:
        break;
    case OPstreq:
    case OPpostinc:
    case OPpostdec:
    case OPeq:
    case OPaddass:
    case OPminass:
    case OPmulass:
    case OPdivass:
    case OPmodass:
    case OPshrass:
    case OPashrass:
    case OPshlass:
    case OPandass:
    case OPxorass:
    case OPorass:
#if TX86
        /* Reverse order of evaluation for double op=. This is so that  */
        /* the pushing of the address of the second operand is easier.  */
        /* However, with the 8087 we don't need the kludge.             */
        if (op != OPeq && tym == TYdouble && !config.inline8087)
        {       if (EOP(e->E1))
                        ecom(&e->E1->E1);
                ecom(&e->E2);
        }
        else
#endif
        {
            /* Don't mark the increment of an i++ or i-- as a CSE, if it */
            /* can be done with an INC or DEC instruction.               */
            if (!(OTpost(op) && elemisone(e->E2)))
                ecom(&e->E2);           /* evaluate 2nd operand first   */
    case OPnegass:
            if (EOP(e->E1))             /* if lvalue is an operator     */
            {
#ifdef DEBUG
                if (e->E1->Eoper != OPind)
                    elem_print(e);
#endif
                assert(e->E1->Eoper == OPind);
                ecom(&(e->E1->E1));
            }
        }
        touchlvalue(e->E1);
        if (!OTpost(op))                /* lvalue of i++ or i-- is not a cse*/
        {
            hash = cs_comphash(e->E1);
            vec_setbit(hash % CSVECDIM,csvec);
            addhcstab(e->E1,hash);              // add lvalue to hcstab[]
        }
        return;

    case OPbtc:
    case OPbts:
    case OPbtr:
        ecom(&e->E1);
        ecom(&e->E2);
        touchfunc(0);                   // indirect assignment
        return;

    case OPandand:
    case OPoror:
        ecom(&e->E1);
        hcstopsave = hcstop;
        ecom(&e->E2);
        hcstop = hcstopsave;            /* no common subs by E2         */
        return;                         /* if comsub then logexp() will */
                                        /* break                        */
    case OPcond:
        ecom(&e->E1);
        hcstopsave = hcstop;
        ecom(&e->E2->E1);               /* left condition               */
        hcstop = hcstopsave;            /* no common subs by E2         */
        ecom(&e->E2->E2);               /* right condition              */
        hcstop = hcstopsave;            /* no common subs by E2         */
        return;                         /* can't be a common sub        */
    case OPcall:
    case OPcallns:
        ecom(&e->E2);                   /* eval right first             */
        /* FALL-THROUGH */
    case OPucall:
    case OPucallns:
        ecom(&e->E1);
        touchfunc(1);
        return;
    case OPstrpar:                      /* so we don't break logexp()   */
#if TX86
    case OPinp:                 /* never CSE the I/O instruction itself */
#endif
    case OPdctor:
        ecom(&e->E1);
        /* FALL-THROUGH */
    case OPasm:
    case OPstrthis:             // don't CSE these
    case OPframeptr:
    case OPgot:
    case OPctor:
    case OPdtor:
    case OPmark:
        return;

    case OPddtor:
        return;

    case OPparam:
#if TX86
    case OPoutp:
#endif
        ecom(&e->E1);
    case OPinfo:
        ecom(&e->E2);
        return;
    case OPcomma:
    case OPremquo:
        ecom(&e->E1);
        ecom(&e->E2);
        break;
#if TARGET_SEGMENTED
    case OPvp_fp:
    case OPcvp_fp:
        ecom(&e->E1);
        touchaccess(e);
        break;
#endif
    case OPind:
        ecom(&e->E1);
        /* Generally, CSEing a *(double *) results in worse code        */
        if (tyfloating(tym))
            return;
        break;
#if TX86
    case OPstrcpy:
    case OPstrcat:
    case OPmemcpy:
    case OPmemset:
        ecom(&e->E2);
    case OPsetjmp:
        ecom(&e->E1);
        touchfunc(0);
        return;
#endif
    default:                            /* other operators */
#if TX86
#ifdef DEBUG
        if (!EBIN(e)) WROP(e->Eoper);
#endif
        assert(EBIN(e));
    case OPadd:
    case OPmin:
    case OPmul:
    case OPdiv:
    case OPor:
    case OPxor:
    case OPand:
    case OPeqeq:
    case OPne:
    case OPscale:
    case OPyl2x:
    case OPyl2xp1:
        ecom(&e->E1);
        ecom(&e->E2);
        break;
#else
#ifdef DEBUG
        if (!EOP(e)) WROP(e->Eoper);
#endif
        assert(EOP(e));
        ecom(&e->E1);
        if (EBIN(e))
                ecom(&e->E2);           /* eval left first              */
        break;
#endif
    case OPstring:
    case OPaddr:
    case OPbit:
#ifdef DEBUG
        WROP(e->Eoper);
        elem_print(e);
#endif
        assert(0);              /* optelem() should have removed these  */
        /* NOTREACHED */

    // Explicitly list all the unary ops for speed
    case OPnot: case OPcom: case OPneg: case OPuadd:
    case OPabs: case OPsqrt: case OPrndtol: case OPsin: case OPcos: case OPrint:
    case OPpreinc: case OPpredec:
    case OPbool: case OPstrlen: case OPs16_32: case OPu16_32:
    case OPd_s32: case OPd_u32:
    case OPs32_d: case OPu32_d: case OPd_s16: case OPs16_d: case OP32_16:
    case OPd_f: case OPf_d:
    case OPd_ld: case OPld_d:
    case OPc_r: case OPc_i:
    case OPu8_16: case OPs8_16: case OP16_8:
    case OPu32_64: case OPs32_64: case OP64_32: case OPmsw:
    case OPu64_128: case OPs64_128: case OP128_64:
    case OPd_s64: case OPs64_d: case OPd_u64: case OPu64_d:
    case OPstrctor: case OPu16_d: case OPd_u16:
    case OParrow:
    case OPvoid: case OPnullcheck:
    case OPbsf: case OPbsr: case OPbswap:
    case OPld_u64:
#if TARGET_SEGMENTED
    case OPoffset: case OPnp_fp: case OPnp_f16p: case OPf16p_np:
#endif
        ecom(&e->E1);
        break;
    case OPhalt:
        return;
  }

  /* don't CSE structures or unions or volatile stuff   */
  if (tym == TYstruct ||
      tym == TYvoid ||
      e->Ety & mTYvolatile
#if TX86
    // don't CSE doubles if inline 8087 code (code generator can't handle it)
      || (tyfloating(tym) && config.inline8087)
#endif
     )
        return;

  hash = cs_comphash(e);                /* must be AFTER leaves are done */

  /* Search for a match in hcstab[].
   * Search backwards, as most likely matches will be towards the end
   * of the list.
   */

#ifdef DEBUG
  if (debugx) dbg_printf("elem: %p hash: %6d\n",e,hash);
#endif
  int csveci = hash % CSVECDIM;
  if (vec_testbit(csveci,csvec))
  {
    for (i = hcstop; i--;)
    {
#ifdef DEBUG
        if (debugx)
            dbg_printf("i: %2d Hhash: %6d Helem: %p\n",
                i,hcstab[i].Hhash,hcstab[i].Helem);
#endif
        if (hash == hcstab[i].Hhash && (ehash = hcstab[i].Helem) != NULL)
        {
            /* if elems are the same and we still have room for more    */
            if (el_match(e,ehash) && ehash->Ecount < 0xFF)
            {
                /* Make sure leaves are also common subexpressions
                 * to avoid false matches.
                 */
                if (!OTleaf(op))
                {
                    if (!e->E1->Ecount)
                        continue;
                    if (OTbinary(op) && !e->E2->Ecount)
                        continue;
                }
                ehash->Ecount++;
                *pe = ehash;
#ifdef DEBUG
                if (debugx)
                        dbg_printf("**MATCH** %p with %p\n",e,*pe);
#endif
                el_free(e);
                return;
            }
        }
    }
  }
  else
    vec_setbit(csveci,csvec);
  addhcstab(e,hash);                    // add this elem to hcstab[]
}
List Read_Board_File (char filename[])
{
	Kata Kota;

	Kota.Length = 4;
	Kota.TabKata[0] = 'k';
	Kota.TabKata[1] = 'o';
	Kota.TabKata[2] = 't';
	Kota.TabKata[3] = 'a';

	Kata Pariwisata;

	Pariwisata.Length = 10;
	Pariwisata.TabKata[0] = 'p';
	Pariwisata.TabKata[1] = 'a';
	Pariwisata.TabKata[2] = 'r';
	Pariwisata.TabKata[3] = 'i';
	Pariwisata.TabKata[4] = 'w';
	Pariwisata.TabKata[5] = 'i';
	Pariwisata.TabKata[6] = 's';
	Pariwisata.TabKata[7] = 'a';
	Pariwisata.TabKata[8] = 't';
	Pariwisata.TabKata[9] = 'a';

	Kata Start;

	Start.Length = 5;
	Start.TabKata[0] = 's';
	Start.TabKata[1] = 't';
	Start.TabKata[2] = 'r';
	Start.TabKata[3] = 'a';
	Start.TabKata[4] = 't';

	Kata Bonus;
	
	Bonus.Length = 5;
	Bonus.TabKata[0] = 'b';
	Bonus.TabKata[1] = 'o';
	Bonus.TabKata[2] = 'n';
	Bonus.TabKata[3] = 'u';
	Bonus.TabKata[4] = 's';
	
	Kata Chance;
	
	Chance.Length = 6;
	Chance.TabKata[0] = 'c';
	Chance.TabKata[1] = 'h';
	Chance.TabKata[2] = 'a';
	Chance.TabKata[3] = 'n';
	Chance.TabKata[4] = 'c';
	Chance.TabKata[5] = 'e';
	
	Kata Penjara;
	
	Penjara.Length = 7;
	Penjara.TabKata[0] = 'p';
	Penjara.TabKata[1] = 'e';
	Penjara.TabKata[2] = 'n';
	Penjara.TabKata[3] = 'j';
	Penjara.TabKata[4] = 'a';
	Penjara.TabKata[5] = 'r';
	Penjara.TabKata[6] = 'a';
	
	Kata Worldcup;
	
	Worldcup.Length = 8;
	Worldcup.TabKata[0] = 'w';
	Worldcup.TabKata[1] = 'o';
	Worldcup.TabKata[2] = 'r';
	Worldcup.TabKata[3] = 'l';
	Worldcup.TabKata[4] = 'd';
	Worldcup.TabKata[5] = 'c';
	Worldcup.TabKata[6] = 'u';
	Worldcup.TabKata[7] = 'p';
	
	Kata Worldtravel;
	
	Worldtravel.Length = 11;
	Worldtravel.TabKata[0]='w';
	Worldtravel.TabKata[1]='o';
	Worldtravel.TabKata[2]='r';
	Worldtravel.TabKata[3]='l';
	Worldtravel.TabKata[4]='d';
	Worldtravel.TabKata[5]='t';
	Worldtravel.TabKata[6]='r';
	Worldtravel.TabKata[7]='a';
	Worldtravel.TabKata[8]='v';
	Worldtravel.TabKata[9]='e';
	Worldtravel.TabKata[10]='l';
	
	Kata Tax;
	
	Tax.Length = 3;
	Tax.TabKata[0]='t';
	Tax.TabKata[1]='a';
	Tax.TabKata[2]='x';
	
	int i,j=0,counter1=0;
	Infotype X;
	List BoardL;
	
	CreateList(&BoardL);
	
	while (!EOP())
	{
		if (counter1==0)
		{
			START(filename);
		}
		
		for (i=1; i<=3; i++)
		{
			ADVKATA(filename);
			if (i==1) 
			{
				X.ptk.nama = CopyKata(CKata);					
			}
			else
			if (i==2) 
			{
				X.ptk.tipe = CopyKata(CKata);
			}
			else
			if (i==3) 
			{
				X.ptk.currentplayer = CopyKata(CKata);
			}			
		}
		
		if (IsKataSama(X.ptk.tipe,Kota))
		{
			for (i=1; i<=travkota-3; i++)
			{
				ADVKATA(filename);
				if (i==1) 
				{
					X.ptk.kotapariwisata.kepemilikan = CopyKata(CKata);
				}
				else if (i==2) 
				{
					X.ptk.kotapariwisata.harga.beli = ConvertToBilangan(CKata);
				}
				else if (i==3) 
				{
					X.ptk.kotapariwisata.harga.sewa = ConvertToBilangan(CKata);
				}
				else if (i==4) 
				{
					X.ptk.kotapariwisata.harga.belipaksa = ConvertToBilangan(CKata);
				}
				else if (i==5) 
				{
					X.ptk.kotapariwisata.harga.listoffered = ConvertToBilangan(CKata);
				}
				else if (i==6) 
				{
					X.ptk.kotapariwisata.lvlbangunan = ConvertToBilangan(CKata);
				}
				else if (i==7) 
				{
					X.ptk.kotapariwisata.harga.biayaupgrade[i-6] = ConvertToBilangan(CKata);
				}
				else if (i==8) 
				{
					X.ptk.kotapariwisata.harga.biayaupgrade[i-6] = ConvertToBilangan(CKata);
				}
				else if (i==9)
				{
					X.ptk.kotapariwisata.harga.biayaupgrade[i-6] = ConvertToBilangan(CKata);
				}
			}
		}
		else if (IsKataSama(X.ptk.tipe,Pariwisata))
		{
			for (i=1; i<=travpariwisata-3; i++)
			{
				ADVKATA(filename);
				if (i==1) 
				{
					X.ptk.kotapariwisata.kepemilikan = CopyKata(CKata);
				}
				else if (i==2) 
				{
					X.ptk.kotapariwisata.harga.beli = ConvertToBilangan(CKata);
				}
				else if (i==3) 
				{
					X.ptk.kotapariwisata.harga.sewa = ConvertToBilangan(CKata);
				}
				else if (i==4) 
				{
					X.ptk.kotapariwisata.harga.belipaksa = ConvertToBilangan(CKata);
				}
				else if (i==5) 
				{
					X.ptk.kotapariwisata.harga.listoffered = ConvertToBilangan(CKata);
				}
				else if (i==6) 
				{
					X.ptk.kotapariwisata.lvlbangunan = ConvertToBilangan(CKata);
				}
				else if (i==7) 
				{
					X.ptk.kotapariwisata.harga.biayaupgrade[i-6] = ConvertToBilangan(CKata);
				}
			}
		}
		else if (IsKataSama(X.ptk.tipe,Start))
		{
	
		}
		else if (IsKataSama(X.ptk.tipe,Bonus))
		{
			
		}
		else if (IsKataSama(X.ptk.tipe,Chance))
		{
			
		}
		else if (IsKataSama(X.ptk.tipe,Penjara))
		{
			
		}
		else if (IsKataSama(X.ptk.tipe,Worldcup))
		{
			
		}
		else if (IsKataSama(X.ptk.tipe,Worldtravel))
		{
			
		}
		else if (IsKataSama(X.ptk.tipe,Tax))
		{
			
		}
		
		if (counter1<1)
		{
			counter1++;
		}
		
		ADVKATA(filename);
		X.ptk.id = ConvertToBilangan(CKata);
			
		j++;	
		if (j>0)
		{
			InsVLast(&BoardL,X);
		}
		
		if(!EOP())
		{
			ADV(filename);
			ADV(filename);
		}		
	}
	return BoardL;
}