Esempio n. 1
0
/*******************************************************************************
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;
    }
}
Esempio n. 2
0
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);
}