/* Description: search the device in dongleselect.conf input: output:true(the input device is found in devicesTable) false(not found) */ bool UsbSelect::findDevice(char *vid, char *pid, struct usbdevice *tmpdevice) { FILE *file; char buf[256]; char vendorid[5], productid[5], libpath[30]; bool found = false, ret = false; if (NULL == vid || NULL == pid || NULL == tmpdevice) { SLOGE(" param is wrong"); } SLOGE("idvendor:%s, idproduct:%s\n", vid, pid); file = fopen ("/system/etc/dongleselect.conf", "r"); if (file) { while (fgets(buf, 256, file)) { memset (vendorid, 0, sizeof(vendorid)); ret = searchParam(buf, "VID", vendorid, sizeof(vendorid)); if (!ret) { SLOGE("It's not VID"); continue; } if (strtoul(vid, NULL, 16) != strtoul(vendorid, NULL, 16)) { continue; } memset (productid, 0, sizeof(productid)); ret = searchParam(buf, "PID", productid, sizeof(productid)); if (!ret) { SLOGE("It's not PID"); continue; } if (strtoul(pid, NULL, 16) != strtoul(productid, NULL, 16) && strcmp(productid, "0")) { continue; } memset (libpath, 0, sizeof(libpath)); ret = searchParam(buf, "LIBPATH", libpath, sizeof(libpath)); if (!ret) { SLOGE("It's not LIBPATH"); continue; } found = true; memset(tmpdevice->VID, 0, sizeof(tmpdevice->VID)); memset(tmpdevice->PID, 0, sizeof(tmpdevice->PID)); memset(tmpdevice->libpath, 0, sizeof(tmpdevice->libpath)); strcpy(tmpdevice->VID, vendorid); strcpy(tmpdevice->PID, productid); strcpy(tmpdevice->libpath, libpath); break; } } return found; }
int params() { int enumerator; if ((error = testToken(T_ID)) != E_OK) return error; // "ID_parametru" - mozna specifikovat strInit(&IDstr); strCopystring(&IDstr, &T.s); gettoken(); if ((error = testToken(T_COLON)) != E_OK) return error; // ":" gettoken(); if ((error = testToken(T_DATATYPE)) != E_OK) return error; if(!(strCmpConstStr(&(T.s), "boolean"))) enumerator = O_BOOL; else if(!(strCmpConstStr(&(T.s), "integer"))) enumerator = O_INT; else if(!(strCmpConstStr(&(T.s), "real"))) enumerator = O_REAL; else if(!(strCmpConstStr(&(T.s), "string"))) enumerator = O_STRING; else return E_SEMA; gettoken(); pc++; if(strCmpstring(&IDstr, &ActFun) == 0) return E_SEMA; //ADDED if (searchParam(paramlist, &IDstr) != NULL) return E_SEMA; if ((error = insertParam(paramlist,&IDstr, enumerator)) != E_OK) return error;; //strFree(&IDstr); if (testToken(T_SEMICOLON) == E_OK) { gettoken(); if((error = params()) != E_OK) return error; //vice parametru - rekurze } return E_OK; }
int writefun() { if((error = testToken(T_ID)) == E_OK){ if(afun == 1){ if(strCmpstring(&(T.s), &ActFun) != 0){ //added: Jmeno fkce, params, global, local if (searchParam(paramlist, &(T.s)) == NULL){ if((TempVar = BSTSearch (TempTreeL, T.s)) == NULL){ if((TempVar = BSTSearch(TempTree, T.s)) == NULL) return E_SEMA; } } } } else{ if((TempVar = BSTSearch(TempTree, T.s)) == NULL) return E_SEMA; } gettoken(); if((error = testToken(T_RB)) == E_OK){ return E_OK; } else if((error = testToken(T_COMMA)) == E_OK){ gettoken(); if((error = writefun()) != E_OK) return error; } else return error; } else if((error = testToken(T_STRING)) == E_OK){ gettoken(); if((error = testToken(T_RB)) == E_OK){ return E_OK; } else if((error = testToken(T_COMMA)) == E_OK){ gettoken(); if((error = testToken(T_STRING)) == E_OK) return error; if((error = writefun()) != E_OK) return error; } else return error; } else return error; return E_OK; }
int localDecl() { //za decl nebrat token if ((error = testToken(T_ID)) != E_OK) return error; //ID if (searchParam(paramlist, &(T.s)) != NULL){ //zde budu muset nejspis dat jen jmenu aktualni fkce return E_SEMA; } if(strCmpstring(&(T.s), &ActFun) == 0){ //ADDED return E_SEMA; } if(BSTSearch (TempTreeL, T.s) != NULL){ return E_SEMA; } strInit(&IDstr); strCopystring(&IDstr, &T.s); gettoken(); if ((error = testToken(T_COLON)) != E_OK) return error; gettoken(); if ((error = testToken(T_DATATYPE)) != E_OK) return error; // typ /******************************************INSERT***************************************************************/ if(!(strCmpConstStr(&(T.s), "boolean"))) TempVar->type = O_BOOL; if(!(strCmpConstStr(&(T.s), "integer"))) TempVar->type = O_INT; if(!(strCmpConstStr(&(T.s), "real"))) TempVar->type = O_REAL; if(!(strCmpConstStr(&(T.s), "string"))){ TempVar->type = O_STRING; strInit(&TempVar->value.sval); } BSTInsert (&TempTreeL, IDstr, TempVar); /******************************************INSERT***************************************************************/ gettoken(); if ((error = testToken(T_SEMICOLON)) != E_OK) return error; // ";" gettoken(); //strFree(&IDstr); if (testToken(T_ID) == E_OK) if ((error = localDecl()) != E_OK) return error; //dalsia promena? return E_OK; }
int commands() { tVariable *glob = NULL; tVariable *loc = NULL; tParamList *par = NULL; string *name = allocate(sizeof(string)); tTapeItem *previous = Tape->last; tVariable *op1 = allocate(sizeof(tVariable)); tVariable *op2 = allocate(sizeof(tVariable)); tVariable *result = allocate(sizeof(tVariable)); if((name == NULL) || (op1 == NULL) || (op2 == NULL) || (result == NULL)) return E_INTERN; switch(T.type){ case T_ID: /* if(afun == 1){ //ADDED pokud neni ve funkci kontroluje jen global if ((par = searchParam(paramlist, &(T.s))) == NULL){ //added if(strCmpstring(&(T.s), &ActFun) != 0){ //zde budu muset nejspis dat jen jmenu aktualni fkce if((loc = BSTSearch (TempTreeL, T.s)) == NULL){ if((glob = BSTSearch (TempTree, T.s)) == NULL){ return E_SEMA; }*/ // else{ // Tape->last->op1 = glob; // } // } // else{ // Tape->last->op1 = loc; // } // } // else{ // Tape->last->op1 = item; // } //} // else{ // Tape->last->op1 = par; // } // } /* else {*/ if((glob = BSTSearch (TempTree, T.s)) == NULL){ return E_SEMA; } /*else{ Tape->last->op1 = glob; }*/ //} gettoken(); if ((error = testToken(T_ASSIGN)) != E_OK) return error; if ((error = ExpParser()) != E_OK) return error; //if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = ASSIGN; if (loc != NULL){ Tape->last->op1 = loc; } else if (glob != NULL){ Tape->last->op1 = glob; } if (res != Tape->last->op1->type ) return E_SEMB; Tape->last->op2 = Tape->last->previous->result; Tape->last->result = Tape->last->op1; printf("parser adresa resultu v parseri %d \n",Tape->last->op2); if ((strCmpConstStr (&(T.s), "end"))) { if ((error = testToken(T_SEMICOLON)) != E_OK) return error; semi = 1; } break; case T_KEYWORD: if(!strCmpConstStr (&(T.s), "begin")){ gettoken(); if((error = blockList()) != E_OK) return error; gettoken(); if ((strCmpConstStr (&(T.s), "end"))) { if ((error = testToken(T_SEMICOLON)) != E_OK) return error; semi = 1; } break; } if(!strCmpConstStr (&(T.s), "if")){ //if tTapeItem *label; tTapeItem *endelse; tVariable *op11 = allocate(sizeof(tVariable)); tVariable *op22 = allocate(sizeof(tVariable)); if((op11 == NULL) || (op22 == NULL)) return E_INTERN; if((error = ExpParser()) != E_OK) return error; //vyraz if (res != 3 ) return E_SEMB; //ZAKONECNTOVANO if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = JUMPN; Tape->last->op1 = Tape->last->previous->result; Tape->last->op2 = op2; Tape->last->op2->type = TAPE_POINTER; label = Tape->last; if((error = testToken(T_KEYWORD)) == E_OK){ if(strCmpConstStr (&(T.s),"then")) return E_SYN; //then } else return error; gettoken(); if((error = testToken(T_KEYWORD)) == E_OK){ if(strCmpConstStr (&(T.s),"begin")) return E_SYN; //begin slozeneho prikazu } else return error; gettoken(); if((error = blockList()) != E_OK) return error; //blocklist gettoken(); Tape->last->instruction = JUMPN; Tape->last->op1 = op11; Tape->last->op1->type = O_BOOL; Tape->last->op1->value.bval = false; if(strInit(&(Tape->last->op1->name)) != STR_SUCCESS) return E_INTERN; Tape->last->op2 = op22; Tape->last->op2->type = TAPE_POINTER; endelse = Tape->last; if((error = testToken(T_KEYWORD)) != E_OK) return error; if(strCmpConstStr (&(T.s),"else")) return E_SYN; if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = NOP; label->op2->value.tape_pointer = Tape->last; gettoken(); if((error = testToken(T_KEYWORD)) != E_OK) return error; if(strCmpConstStr (&(T.s),"begin")) return E_SYN; //begin slozeneho prikazu gettoken(); if((error = blockList()) != E_OK) return error; //blocklist gettoken(); if ((strCmpConstStr (&(T.s), "end"))) { if (testToken(T_SEMICOLON) != E_OK) return E_SYN; semi = 1; } if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = NOP; endelse->op2->value.tape_pointer = Tape->last; break; } if(!strCmpConstStr (&(T.s), "while")){ if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = NOP; tTapeItem *label1; tTapeItem *label2 = Tape->last; // ukazatel na pasku kam se bude cyklus vracet tVariable *op11 = allocate(sizeof(tVariable)); tVariable *op22 = allocate(sizeof(tVariable)); if((op11 == NULL) || (op22 == NULL)) return E_INTERN; if((error = ExpParser()) != E_OK) return error; //vyraz if (res != 3 ) return E_SEMB; //ZAKONECNTOVANO if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = JUMPN; Tape->last->op1 = Tape->last->previous->result; Tape->last->op2 = op22; Tape->last->op2->type = TAPE_POINTER; label1 = Tape->last; if((error = testToken(T_KEYWORD)) == E_OK){ if(strCmpConstStr (&(T.s),"do")) return E_SYN; //begin slozeneho prikazu } else return error; gettoken(); if((error = testToken(T_KEYWORD)) == E_OK){ if(strCmpConstStr (&(T.s),"begin")) return E_SYN; //begin slozeneho prikazu } else{ return error; } gettoken(); if((error = blockList()) != E_OK) return error; //blocklist gettoken(); if ((strCmpConstStr (&(T.s), "end"))) { if ((error = testToken(T_SEMICOLON)) != E_OK) return error; semi = 1; } if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = JUMP; Tape->last->op1 = op1; Tape->last->op1->type = O_BOOL; Tape->last->op1->value.bval = false; if(strInit(&(Tape->last->op1->name)) != STR_SUCCESS) return E_INTERN; Tape->last->op2 = op2; Tape->last->op2->type = TAPE_POINTER; Tape->last->op2->value.tape_pointer = label2; // nepodmineny skok zpet na zacatek vyhodnocovani podminky cyklu if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = NOP; // instrukce, na kterou se skoci v pripade nesplneni podminky whilu label1->op2->value.tape_pointer = Tape->last; break; } if (!strCmpConstStr (&(T.s), "readln")) { gettoken(); if((error = testToken(T_LB)) != E_OK) return error; gettoken(); if((error = testToken(T_ID)) != E_OK) return error; if(afun == 1){ if(strCmpstring(&(T.s), &ActFun) != 0){ //added: Jmeno fkce, params, global, local if (searchParam(paramlist, &(T.s)) == NULL){ if((TempVar = BSTSearch (TempTreeL, T.s)) == NULL){ if((TempVar = BSTSearch(TempTree, T.s)) == NULL) return E_SEMA; } } } } else{ if((TempVar = BSTSearch(TempTree, T.s)) == NULL) return E_SEMA; } if (TempVar->type == O_BOOL){ TempVar = NULL; return E_SEMB; } gettoken(); if((error = testToken(T_RB)) != E_OK){ TempVar = NULL; return error; } gettoken(); if ((strCmpConstStr (&(T.s), "end"))) { if ((error = testToken(T_SEMICOLON)) != E_OK){ TempVar = NULL; return error; } semi = 1; } TempVar = NULL; break; } if (!strCmpConstStr (&(T.s), "write")) { //write(ID) !!! integer or real !!! gettoken(); if(InsertEmptyItemTape() != E_OK) return E_INTERN; Tape->last->instruction = JUMP; Tape->last->op1 = op1; Tape->last->op1->type = O_BOOL; Tape->last->op1->value.bval = false; if((error = testToken(T_LB)) != E_OK) return error; gettoken(); if((error = writefun()) != E_OK) return error; gettoken(); if ((strCmpConstStr (&(T.s), "end"))) { if ((error = testToken(T_SEMICOLON)) != E_OK) return error; semi = 1; } break; } default: return E_SYN; } return E_OK; }