Beispiel #1
0
void doFunDec(Type type, TreeNode *p) {
	//printf("doFunDec\n");
	//printf("TreeNode->state:%s\n", p->state);
	TreeNode *p1 = p->firstChild;
	char * funcname = (char *)malloc(sizeof(char*)*(strlen((p1->value).idValue)+1));
	strcpy(funcname, p1->value.idValue);	//得到函数名
	if (searchFunc(funcname) != NULL) {
		printf("Error type 4 at line %d '&&': function redefined\n", p->line);	//函数重复定义
		return;	
	}
	funcTableElement *elem = (funcTableElement *)malloc(sizeof(funcTableElement));
	elem->name = funcname;
	elem->type = type;
	elem->argListHeader = NULL;
	switch (p->productionRule) {
		case 1: {
			TreeNode *p3 = p1->rightBrother->rightBrother;
			elem->argListHeader = doVarList(p3);
			insertFunc(elem);
			//if (funcTableHeader == NULL) printf("null in doFunDec");
			break;
			}
		case 2: {
			insertFunc(elem);
			break;
			}
	}
}
Beispiel #2
0
void init(){
	/*
	 *插入read(),write()函数
	 */
	char *read_name = (char*)malloc(20);
	char *write_name = (char*)malloc(20);
	char *field_name = (char*)malloc(20);
	strcpy(read_name,"read");
	strcpy(write_name,"write");
	strcpy(field_name,"a");
	Type read_type = (Type)malloc(sizeof(struct Type_));
	read_type->kind = basic;
	read_type->u.basic = 0;
	FieldList read_func = (FieldList)malloc(sizeof(struct FieldList_));
	read_func->name = read_name;
	read_func->type = read_type;
	read_func->tail = NULL;
	insertFunc(read_func);

	Type write_type = (Type)malloc(sizeof(struct Type_));
	write_type->kind = basic;
	write_type->u.basic = 0;
	Type field_type = (Type)malloc(sizeof(struct Type_));
	field_type->kind = basic;
	field_type->u.basic = 0;
	FieldList write_func = (FieldList)malloc(sizeof(struct FieldList_));
	FieldList write_field = (FieldList)malloc(sizeof(struct FieldList_));
	write_field->name = field_name;
	write_field->type = field_type;
	write_field->tail = NULL;
	write_func->name = write_name;
	write_func->type = write_type;
	write_func->tail = write_field;
	insertFunc(write_func);
}
Beispiel #3
0
static void finishClass(void)
{
    SYMBOL *self = makeID(sc_localstatic, &stdpointer, NULL, "$self");
    HASHREC *lst;
    if (lambdas->captureThis && lambdas->next)
    {
        SYMBOL *parent = makeID(sc_member, &stdpointer, NULL, "$parent");
        lambda_insert(parent, lambdas);
    }
    self->label = nextLabel++;
    insert(self, lambdas->cls->tp->syms);    
    insertInitSym(self);
    createConstructorsForLambda(lambdas->cls);
    insertFunc(lambdas->cls, lambdas->func);
    createConverter(self);
    if (!lambdas->isMutable)
    {
        TYPE *tp2 = Alloc(sizeof(TYPE));
        tp2->type = bt_const;
        tp2->size = lambdas->func->tp->size;
        tp2->btp = lambdas->func->tp;
        lambdas->func->tp = tp2;
    }
    createCaller();
}
Beispiel #4
0
static void createCaller(void)
{
    FUNCTIONCALL *params = Alloc(sizeof(FUNCTIONCALL));
    TYPE *args = realArgs(lambdas->func);
    SYMBOL *func = makeID(sc_member, args, NULL, overloadNameTab[CI_FUNC]);
    SYMBOL *lambdaCall = search(isstructured(basetype(lambdas->func->tp)->btp) ? "__lambdaCallS" : "__lambdaCall", globalNameSpace->syms);
    BLOCKDATA block1, block2;
    STATEMENT *st;
    lambdaCall = (SYMBOL *)lambdaCall->tp->syms->table[0]->p;
    func->parentClass = lambdas->cls;
    func->linkage = lk_virtual;
    func->isInline = FALSE;
    func->omitFrame = TRUE;
    memset(&block1, 0, sizeof(BLOCKDATA));
    memset(&block2, 0, sizeof(BLOCKDATA));
    insertFunc(lambdas->cls, func);
    InsertInline(func);
    st = stmtNode(NULL, &block2, isstructured(basetype(lambdas->func->tp)->btp) ? st_expr : st_return);
    st->select = varNode(en_func, NULL);
    st->select->v.func = params;
    params->arguments = Alloc(sizeof(INITLIST));
    params->arguments->exp = varNode(en_pc, lambdas->func);
    params->arguments->tp = &stdpointer;
    params->ascall = TRUE;
    params->sp = func;
    params->fcall = varNode(en_pc, lambdaCall);
    params->functp = func->tp;
    st = stmtNode(NULL, &block1, st_block);
    st->lower = block2.head;
    st->blockTail = block2.blockTail;
    func->inlineFunc.stmt = stmtNode(NULL, NULL, st_block);
    func->inlineFunc.stmt->lower = block1.head;
    func->inlineFunc.stmt->blockTail = block1.blockTail;
}
Beispiel #5
0
// these next two rely on the CONST specifier on the func not being set up yet.
static SYMBOL *createPtrCaller(SYMBOL *self)
{
    // if the closure is copied then used on another thread yes the resulting
    // code can get into a race condition...
    INITLIST *args;
    FUNCTIONCALL *params = Alloc(sizeof(FUNCTIONCALL));
    TYPE *pargs = realArgs(lambdas->func);
    SYMBOL *func = makeID(sc_static, pargs, NULL, "$ptrcaller");
    SYMBOL *lambdaCall = search(isstructured(basetype(lambdas->func->tp)->btp) ? "__lambdaPtrCallS" : "__lambdaPtrCall", globalNameSpace->syms);
    BLOCKDATA block1, block2;
    STATEMENT *st;
    EXPRESSION *exp = varNode(en_label, self);
    lambdaCall = (SYMBOL *)lambdaCall->tp->syms->table[0]->p;
    func->parentClass = lambdas->cls;
    func->linkage = lk_virtual;
    func->isInline = FALSE;
    func->omitFrame = TRUE;
    deref(&stdpointer, &exp);
    memset(&block1, 0, sizeof(BLOCKDATA));
    memset(&block2, 0, sizeof(BLOCKDATA));
    insertFunc(lambdas->cls, func);
    st = stmtNode(NULL, &block2, isstructured(basetype(lambdas->func->tp)->btp) ? st_expr : st_return);
    st->select = varNode(en_func, NULL);
    st->select->v.func = params;
    params->arguments = Alloc(sizeof(INITLIST));
    params->arguments->exp = varNode(en_pc, lambdas->func);
    params->arguments->tp = &stdpointer;
    args = Alloc(sizeof(INITLIST));
    args->next = params->arguments;
    params->arguments = args;
    params->arguments->exp = exp;
    params->arguments->tp = &stdpointer;
    params->ascall = TRUE;
    params->sp = func;
    params->fcall = varNode(en_pc, lambdaCall);
    params->functp = func->tp;
    st = stmtNode(NULL, &block1, st_block);
    st->lower = block2.head;
    st->blockTail = block2. blockTail;
    func->inlineFunc.stmt = stmtNode(NULL, NULL, st_block);
    func->inlineFunc.stmt->lower = block1.head;
    func->inlineFunc.stmt->blockTail = block1.blockTail;
    return func;
}
Beispiel #6
0
static void createConverter(SYMBOL *self)
{
    SYMBOL *caller = createPtrCaller(self);
    TYPE *args = realArgs(lambdas->func);
    SYMBOL *func = makeID(sc_member, Alloc(sizeof(TYPE)), NULL, overloadNameTab[CI_CAST]);
    BLOCKDATA block1, block2;
    STATEMENT *st;
    EXPRESSION *exp;
    SYMBOL *sym = makeID(sc_parameter, &stdvoid, NULL, AnonymousName());
    HASHREC *hr = Alloc(sizeof(HASHREC));
    func->tp->type = bt_func;
    func->tp->btp = Alloc(sizeof(TYPE));
    func->tp->btp->type = bt_pointer;
    func->tp->btp->size = getSize(bt_pointer);
    func->tp->btp->btp = args;
    func->tp->syms = CreateHashTable(1);
    func->linkage = lk_virtual;
    func->isInline = FALSE;
    hr->p = (struct _hrintern_ *)sym;
    func->tp->syms->table[0] = hr;
    func->parentClass = lambdas->cls;
    memset(&block1, 0, sizeof(BLOCKDATA));
    memset(&block2, 0, sizeof(BLOCKDATA));
    func->castoperator = TRUE;
    insertFunc(lambdas->cls, func);
    InsertInline(func);
    InsertInline(caller);
    st = stmtNode(NULL, &block2, st_return);
    st->select = varNode(en_pc, caller);
    st = stmtNode(NULL, &block1, st_block);
    st->lower = block2.head;
    st->blockTail = block2. blockTail;
    func->inlineFunc.stmt = stmtNode(NULL, NULL, st_block);
    func->inlineFunc.stmt->lower = block1.head;
    func->inlineFunc.stmt->blockTail = block1.blockTail;
}
Beispiel #7
0
int main(int argc,char *argv[]){
	char *tok,line[MAX],*filename=argv[1],*initTree="InitTree",*insert="Insert",*delete="Delete",*find="Find",*height="Height",*printTree="PrintTree";	
	BST **T=(BST**)malloc(sizeof(BST*));
	int numOper=2,numLines=0;

	//FILE *fileCountLines=fopen(filename,"r");
	//while(fgets(line,sizeof line,fileCountLines)!=NULL){
	//	numLines++;
	//}
	//fclose(fileCountLines);

	numOper=numLines-1;
	
	FILE *file=fopen(filename,"r");
	while(fgets(line,sizeof line,file)!=NULL){
		
		trim(line);
		tok=strtok(line," ");

		if(strcmp(line,initTree)==0){
			char *initTreeParam;

                        tok=strtok(NULL," ");
			initTreeParam=tok;
                        *T=initTreeFunc(initTreeParam);
			tok=strtok(NULL," ");
		}
		
		else if(strcmp(line,insert)==0){
			char *insertParam;
			tok=strtok(NULL," ");
			insertParam=tok;
			insertFunc(insertParam,T);
			tok=strtok(NULL," ");
		}
		
		else if(strcmp(line,delete)==0){
			char *deleteParam;
			tok=strtok(NULL," ");
			deleteParam=tok;
			deleteFunc(deleteParam,T);
			tok=strtok(NULL," ");
		}
			
		else if(strcmp(line,find)==0){
			char *findParam;
			tok=strtok(NULL," ");
			findParam=tok;
			findFunc(findParam,(*T));
			tok=strtok(NULL," ");
		}
		
		else if(strcmp(line,height)==0){
           		int height=heightFunc(*T);
			printf("%d\n",height);
                        tok=strtok(NULL," ");
                }
		
		else if(strcmp(line,printTree)==0){
                        int printTreeParam;
                        tok=strtok(NULL," ");
                        printTreeParam=atoi(tok);
                        printTreeFunc(*T,printTreeParam);
                        tok=strtok(NULL," ");
			printf("\n");
                }
	}
Beispiel #8
0
void socketMode(tArvoreBB **tree, FILE **arq)
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);
    
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    char buf[32] = {0}, op = 1;
    
    
    
    if(sock != INVALID_SOCKET)
    {
        struct sockaddr_in serv_addr = {0};

        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(PORT);

        if(bind(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == 0)
        {
            int len;
            struct sockaddr_in cli_addr;
            SOCKET newsock;
            
            listen(sock, BACKLOG);
            len = sizeof(struct sockaddr_in);
            newsock = accept(sock, (struct sockaddr *) &cli_addr, &len);
            // if (newsock != INVALID_SOCKET)
            //    printf("Nova conexao: %s:%d\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
            while(op != 0)
            {
                if (newsock != INVALID_SOCKET)
                {
                    while(recv(newsock, buf, sizeof(buf)-1, 0) <=0);
                    //printf("received: %s\n", buf);
                    op = buf[strlen(buf)-1] - 48;
                    
                    tfunc func;
                    char buffer[30]={0};
                        
                    strncpy(buffer, buf, 3);
                    buffer[3] = '\0';
                    func.mat = atoi(buffer);
                    strncpy(func.nome,buf+3,20);
                    func.nome[20] = '\0';
                    strncpy(buffer,buf+23,7);
                    buffer[7] = '\0';
                    func.sal = atof(buffer);
                    
                    switch(op)
                    {
                        
                        case 1:
                        {
                            insertFunc(*arq, tree, func);
                            break;
                        }
                        case 2:
                        {
                            alterSalary(arq, *tree, func.mat, func.sal);
                            break;
                        }
                        case 3:
                        {
                            deleteFunc(tree,func.mat);
                            break;
                        }
                        case 4:
                        {
                            listFunc(*arq, *tree, func.mat);  
                            break;
                        }
                        case 5:
                            listAll(*arq, *tree);
                            break;
                        case 6:
                            listStruct(*tree);
                            break;
                        case 7:
                            reindex(arq, tree);
                            break;
                        case 8:
                            deleteAll(tree, arq);
                            break;
                    }
                    
                }
                else
                {
                    printf("Erro ao conectar\n");
                }
            }
        }
        else
        {
            printf("Erro no bind()\n");
        }
    }
    
}
Beispiel #9
0
/**
** main function to start the execution 
**/   
int main(int argc, char *argv[]){

	printf("\n\t"
        "*********************************************** \n\t"
        "      Program to implement a hast-table.  \n\t"
        "(Values inserted from the mentioned input file) \n\t"
        "*********************************************** \n \n");
		
	char *filename="input", line[MAX], *tok, *name;
	int foundHashSize=0, key, userSelectedOption, isExit=0, searchKey;

	/* Just to calculate the size of HashTable */	
	FILE *file=fopen(filename, "r");
	while(fgets(line, sizeof line, file) != NULL){
		
		/* fetching the size of hashTable and breaking */
		if(!foundHashSize){
                        hashSize=atoi(line);
                        foundHashSize=1;
                        break;
                }
	}
	fclose(file);

	/* Creating the hashTable with the userDefined Size */
	foundHashSize=0;
	struct myHashTable hashTable[hashSize];	
	
	/* Initializing the Bucket with NULL */
	int index;
	for(index=0;index<hashSize;index++)
		hashTable[index].first=NULL;

	/* Insert operation of hashtable, is a mandatory operation */
	FILE *fileRem=fopen(filename, "r");

	printf("\tFollowing elements are inserted with their corresponding bucket number.\n\tCalculated from the hashfunction:- Marks mod %d \n\n",hashSize);
	printf("\tHash\n\t");
	while(fgets(line, sizeof line, file) != NULL){
		
		/* Skipping the very first line, sice this is just the size of hashTable */
		if(!foundHashSize){
			foundHashSize=1;
			continue;
		}
		else{
			/* tokenizing the line with colon (:) */
			tok=strtok(line, ":");
			name=tok;
			tok=strtok(NULL, " ");
			key=atoi(tok);
			tok=strtok(NULL, " ");

			/* inserting the tokenized values i.e name and key of the student */
			insertFunc(hashTable, name, key);	
		}
	}
	fclose(fileRem);	
	printf("NULL\n\n");

	do{
		printf("\t"
		"Please choose anyone of the options below:- \n\t"
		"1] Delete any element. \n\t"
		"2] Print the hashTable. \n\t"
		"3] Do you want to exit?? \n");
		printf("\n\tYour option number: ");
		scanf("%d",&userSelectedOption);
		printf("\n");
	
		switch(userSelectedOption){
			case 1:{
				printf("\tPlease enter the key to search: ");
				scanf("%d",&searchKey);
				deleteFunc(hashTable,searchKey,hashSize);
			}
			break;
		
			case 2:{
				printHashFunc(hashTable,hashSize);
				printf("\n\n");
                        }
                        break;
	
			case 3:
				isExit=1;
				break;
			
			default:
				printf("Please choose a valid option!!!");
				break;		
		}
	}while(!isExit);
	return 0;
}