/******************************************************************************* Handle all the built-in string functions (PATMATCH INDEXSTR STRLEN SUBSTR LOOKUP) *******************************************************************************/ int strfunc(Exprnode *exprptr) { Exprnode result1, result2, result3; char *chptr; int len, newlen; /* all functions have a first argument */ result1 = *(exprptr->leftptr); evalexpr(&result1); switch (exprptr->arg.strfnc.functyp) { case PATMATCH: result2 = *(exprptr->rightptr); evalexpr(&result2); if ((result1.typ != STRING) || (result2.typ != STRING)) fatalerrlin("patmatch: both arguments must be strings"); exprptr->arg.ival = patmatch(&result1, &result2); exprptr->typ = INTEGER; break; case STRLEN: if (result1.typ != STRING) fatalerrlin("strlen: argument must be a string"); exprptr->arg.ival = strlen(result1.arg.sval); exprptr->typ = INTEGER; break; case INDEXSTR: result2 = *(exprptr->rightptr); evalexpr(&result2); if ((result1.typ != STRING) || (result2.typ != STRING)) fatalerrlin("indexstr: both arguments must be strings"); if ((chptr=strstr(result2.arg.sval, result1.arg.sval)) == NULL) { exprptr->arg.ival = 0; } else { exprptr->arg.ival = chptr - result2.arg.sval + 1; } exprptr->typ = INTEGER; break; case SUBSTR: if (result1.typ != STRING) fatalerrlin("substr: first argument must be a string"); result2 = *(exprptr->rightptr); evalexpr(&result2); result3 = *(exprptr->arg.strfnc.expr3ptr); evalexpr(&result3); if (result2.typ != INTEGER || result3.typ != INTEGER) fatalerrlin("substr: 2nd and 3rd arguments must be integers"); len = strlen(result1.arg.sval); if (result2.arg.ival < 1 || result2.arg.ival > len) { fprintf(stderr, "substr: bad index %d", result2.arg.ival); fatalerrlin(""); } if (result3.arg.ival < 1) { fprintf(stderr, "substr: bad length %d", result3.arg.ival); fatalerrlin(""); } newlen = MIN(len-result2.arg.ival+1, result3.arg.ival); chptr = (char*)malloc((size_t)(newlen+1)); strncpy(chptr, result1.arg.sval+result2.arg.ival-1, newlen); *(chptr+newlen) = '\0'; exprptr->arg.sval = chptr; exprptr->typ = STRING; break; case LOOKUP: if (result1.typ != STRING) fatalerrlin("lookup: first argument must be a string"); /* second argument */ result2 = *(exprptr->rightptr); evalexpr(&result2); if (result2.typ != STRING) fatalerrlin("lookup: second argument must be a string"); /* optional 3rd arg */ if (exprptr->arg.strfnc.expr3ptr == NULL) { result3.arg.ival = 2; } else { result3 = *(exprptr->arg.strfnc.expr3ptr); evalexpr(&result3); if (result3.typ != INTEGER) fatalerrlin("lookup: third argument must be an integer"); } exprptr->arg.sval = dolookup(result1.arg.sval, result2.arg.sval, result3.arg.ival); exprptr->typ = STRING; break; default: fatalerror("strfunc: hit default"); break; } }
int main() { struct sockaddr_in from_addr; socklen_t from_addr_len; ssize_t recvbytes; int sockfd; char buf[64*1024]; char done; #ifdef TIMEIT #endif struct timeval start_time, end_time; unsigned long long s, e; if ((sockfd = init_tracker_comm(TRACKER_PORT)) < 0) { fprintf(stderr, "main:init_tracker_comm:failed\n"); abort(); } if (init_hash_table(HASH_TABLE_ENTRIES) != 0) { fprintf(stderr, "main:init_hash_table:failed\n"); abort(); } #ifdef DEBUG fprintf(stderr, "main:starting\n"); #endif /* * needed for shuffle() */ srand(time(NULL)); done = 0; while (!done) { from_addr_len = sizeof(from_addr); recvbytes = tracker_recv(sockfd, buf, sizeof(buf), (struct sockaddr *)&from_addr, &from_addr_len, NULL); if (recvbytes > 0) { tracker_header_t *p; p = (tracker_header_t *)buf; gettimeofday(&start_time, NULL); #ifdef TIMEIT #endif fprintf(stderr, "%lld : main:op %d from %s seqno %d\n", (long long int)start_time.tv_sec, p->op, inet_ntoa(from_addr.sin_addr), p->seqno); #ifdef DEBUG #endif switch(p->op) { case LOOKUP: { tracker_lookup_req_t *req; req = (tracker_lookup_req_t *)buf; dolookup(sockfd, req->hash, req->header.seqno, &from_addr); } break; case REGISTER: register_hash(buf, &from_addr); break; case UNREGISTER: unregister_hash(buf, &from_addr); break; case PEER_DONE: unregister_all(buf, &from_addr); break; case STOP_SERVER: fprintf(stderr, "Received 'STOP_SERVER' from (%s)\n", inet_ntoa(from_addr.sin_addr)); exit(0); default: fprintf(stderr, "Unknown op (%d)\n", p->op); abort(); break; } gettimeofday(&end_time, NULL); s = (start_time.tv_sec * 1000000) + start_time.tv_usec; e = (end_time.tv_sec * 1000000) + end_time.tv_usec; fprintf(stderr, "main:svc time: %lld\n", (e - s)); #ifdef TIMEIT #endif #ifdef LATER verify_hash_table(); #endif } } return(0); }