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; } } }
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; }
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; } } } }
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); }
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); }
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; } } } }
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; }
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; }