Ejemplo n.º 1
0
 void compare_lists(boost::true_type, const List<NumberT>& left, const List<NumberT>& right)
 {
   m_arrays_equal = true;
   const Uint nb_rows = left.size();
   for(Uint i = 0; i != nb_rows; ++i)
   {
     const Real diff = compare_numbers(left[i], right[i]);
     if(diff > m_max_ulps)
     {
       m_arrays_equal = false;
       CFdebug << m_prefix << "List mismatch at index "  << i << ": distance [" << left[i] << ", " << right[i] << "] is " << right[i]-left[i] << "(" << diff << " ulps)" << CFendl;
     }
   }
 }
Ejemplo n.º 2
0
Var value_compare(Var a, Var b) {
    char *sa=0, *sb=0;
    Var r;

    if(a.type != b.type) {
        r.type = TYPE_ERR;
        r.v.err = E_TYPE;
        return r;
    }

    switch(a.type) {
    case TYPE_STR:
        sa=str_dup(a.v.str);
        sb=str_dup(b.v.str);
        makelowercase(sa);
        makelowercase(sb);
        r.v.num = strcmp(sa, sb);
        free(sa);
        free(sb);
        r.type = TYPE_INT;
        break;
    case TYPE_INT:
    case TYPE_FLOAT:
        r = compare_numbers(a,b);
        break;
    case TYPE_OBJ:
    case TYPE_ERR:
        a.type = b.type = TYPE_INT;
        r = compare_numbers(a,b);
        break;
    default:
        r.v.err = E_TYPE;
        r.type = TYPE_ERR;
    }

    return r;
}
Ejemplo n.º 3
0
static void
compare(enum bcode_compare type)
{
	int		index, elseindex;
	struct number	*a, *b;
	bool		ok;
	struct value	*v;

	elseindex = NO_ELSE;
	index = readreg();
	if (readch() == 'e')
		elseindex = readreg();
	else
		unreadch();

	a = pop_number();
	if (a == NULL)
		return;
	b = pop_number();
	if (b == NULL) {
		push_number(a);
		return;
	}

	ok = compare_numbers(type, a, b);

	if (!ok && elseindex != NO_ELSE)
		index = elseindex;

	if (index >= 0 && (ok || (!ok && elseindex != NO_ELSE))) {
		v = stack_tos(&bmachine.reg[index]);
		if (v == NULL)
			warnx("register '%c' (0%o) is empty", index, index);
		else {
			switch(v->type) {
			case BCODE_NONE:
				warnx("register '%c' (0%o) is empty",
				    index, index);
				break;
			case BCODE_NUMBER:
				warn("eval called with non-string argument");
				break;
			case BCODE_STRING:
				eval_string(bstrdup(v->u.string));
				break;
			}
		}
	}
}
Ejemplo n.º 4
0
static void
lesseq_numbers(void)
{
	struct number *a, *b, *r;

	a = pop_number();
	if (a == NULL)
		return;
	b = pop_number();
	if (b == NULL) {
		push_number(a);
		return;
	}
	r = new_number();
	bn_check(BN_set_word(r->number,
	    compare_numbers(BCODE_NOT_GREATER, a, b) ? 1 : 0));
	push_number(r);
}
Ejemplo n.º 5
0
static void
equal_numbers(void)
{
	struct number *a, *b, *r;

	a = pop_number();
	if (a == NULL) {
		return;
	}
	b = pop_number();
	if (b == NULL) {
		push_number(a);
		return;
	}
	r = new_number();
	bn_check(BN_set_word(r->number,
	    compare_numbers(BCODE_EQUAL, a, b) ? 1 : 0));
	push_number(r);
}
Ejemplo n.º 6
0
 void compare_tables(boost::true_type, const Table<NumberT>& left, const Table<NumberT>& right)
 {
   m_arrays_equal = true;
   const Uint nb_rows = left.size();
   const Uint row_size = left.row_size();
   for(Uint i = 0; i != nb_rows; ++i)
   {
     const typename Table<NumberT>::ConstRow left_row = left[i];
     const typename Table<NumberT>::ConstRow right_row = right[i];
     for(Uint j = 0; j != row_size; ++j)
     {
       const Real diff = compare_numbers(left_row[j], right_row[j]);
       if(diff > m_max_ulps)
       {
         m_arrays_equal = false;
         CFdebug << m_prefix << "Array mismatch at index ["  << i << "," << j << "]: distance [" << left_row[j] << ", " << right_row[j] << "] is " << right_row[j]-left_row[j] << "(" << diff << " ulps)" << CFendl;
       }
     }
   }
 }
Ejemplo n.º 7
0
int
cmp_expr(U *p1, U *p2)
{
	int n;

	if (p1 == p2)
		return 0;

	if (p1 == symbol(NIL))
		return -1;

	if (p2 == symbol(NIL))
		return 1;

	if (isnum(p1) && isnum(p2))
		return sign(compare_numbers(p1, p2));

	if (isnum(p1))
		return -1;

	if (isnum(p2))
		return 1;

	if (isstr(p1) && isstr(p2))
		return sign(strcmp(p1->u.str, p2->u.str));

	if (isstr(p1))
		return -1;

	if (isstr(p2))
		return 1;

	if (issymbol(p1) && issymbol(p2))
		return sign(strcmp(get_printname(p1), get_printname(p2)));

	if (issymbol(p1))
		return -1;

	if (issymbol(p2))
		return 1;

	if (istensor(p1) && istensor(p2))
		return compare_tensors(p1, p2);

	if (istensor(p1))
		return -1;

	if (istensor(p2))
		return 1;

	while (iscons(p1) && iscons(p2)) {
		n = cmp_expr(car(p1), car(p2));
		if (n != 0)
			return n;
		p1 = cdr(p1);
		p2 = cdr(p2);
	}

	if (iscons(p2))
		return -1;

	if (iscons(p1))
		return 1;

	return 0;
}
Ejemplo n.º 8
0
int
hb_main(const char* conninfo)
{
	PGconn	   *conn;
	PGresult   *res;
	PGnotify   *notify;
	int			nnotifies;
	int checked;
	int result;

	char number[5];
	char notify_buf[1024];

	srand((unsigned)time(NULL));

	/* Make a connection to the database */
	conn = PQconnectdb(conninfo);

	/* Check to see that the backend connection was successfully made */
	if (PQstatus(conn) != CONNECTION_OK)
	{
		elog(WARNING, "Connection to database failed: %s",
				PQerrorMessage(conn));
		exit_nicely(conn);
	}

	/*
	 * Issue LISTEN command to enable notifications from the rule's NOTIFY.
	 */
	res = PQexec(conn, "LISTEN HB_SV");
	if (PQresultStatus(res) != PGRES_COMMAND_OK)
	{
		elog(WARNING, "LISTEN command failed: %s", PQerrorMessage(conn));
		PQclear(res);
		exit_nicely(conn);
	}

	/*
	 * should PQclear PGresult whenever it is no longer needed to avoid memory
	 * leaks
	 */
	PQclear(res);

	/* Set Secret Number */
	memset(number, 0x00, 5);
	create_random_number(number);
	elog(LOG , "hb_worker: set secret number=%s\n", number);

	/* Quit after four notifies are received. */
	nnotifies = 0;
	while (1)
	{
		/*
		 * Sleep until something happens on the connection.  We use select(2)
		 * to wait for input, but you could also use poll() or similar
		 * facilities.
		 */
		int			sock;
		fd_set		input_mask;

		sock = PQsocket(conn);

		if (sock < 0)
			break;				/* shouldn't happen */

		FD_ZERO(&input_mask);
		FD_SET(sock, &input_mask);

		if (select(sock + 1, &input_mask, NULL, NULL, NULL) < 0)
		{
			elog(WARNING, "select() failed: %s\n", strerror(errno));
			exit_nicely(conn);
		}

		/* Now check for input */
		PQconsumeInput(conn);
		while ((notify = PQnotifies(conn)) != NULL)
		{
			checked = check_number(notify->extra);
			switch (checked) {
				case NUMBER_COMMAND:
					result = compare_numbers(number, notify->extra);
					if (GET_HITS(result) == 4) {
						// Notify Game Clear, and Set new number.
						elog(LOG, "hb_worker: NOTIFY HB_CL,'4 Hit! Conguratulatoins!, next new game.'\n");
						strcpy(notify_buf, "NOTIFY HB_CL,'4 Hit! Conguratulatoins!, next new game.'");
						PQexec(conn, notify_buf);
						create_random_number(number);
						elog(LOG, "hb_worker: set secret number=%s\n", number);

					} else {
						// Notify Hit&blow
						elog(LOG, "NOTIFY HB_CL,'%d Hit / %d Blow.'",
							GET_HITS(result), GET_BLOWS(result));
						sprintf(notify_buf, "NOTIFY HB_CL,'%d Hit / %d Blow.'",
							GET_HITS(result), GET_BLOWS(result));
						PQexec(conn, notify_buf);
					}
					break;
				case START_COMMAND:
					// Set New number.
					elog(LOG, "hb_worker: Set New number.");
					create_random_number(number);
					break;
				case QUIT_COMMAND:
					// nop
					break;
				case INVALID_COMMAND:
				default:
					// NOTIFY error status
					sprintf(notify_buf, "NOTIFY HB_CL,'Invalid data.(%s)'", notify->extra);
					PQexec(conn, notify_buf);
					break;
			}
			

			PQfreemem(notify);
			nnotifies++;
		}
	}

	elog(LOG, "Done.\n");

	/* close the connection to the database and cleanup */
	PQfinish(conn);

	return 0;
}