void do_test() { int newt; object ob; string first,second,quest; if(objectp(ob=present("cha boshi",this_object())) && living(ob)) { if(strlen(current)>2&&ans_curr==0) { last=current; last_all=current_all; ans_last=0; } newt=0; while(newt==0) { if(!find_newline()) { copy_to_old(); new_poem(); } else { if(sscanf(poem[index],"%s %s",first,second)==2 && !sscanf(poem[index],"%*s[") && !sscanf(poem[index],"%*s(") && !sscanf(poem[index],"%*s□") ) { if(strlen(first)>2&&strlen(second)>2) { newt=1; } } } } first=replace_string(first," ",""); second=replace_string(second," ",""); current_all=first+" "+second; ans_curr=0; if(strlen(first)>=14 && random(3)==0) { quest=first; } else if (strlen(second)>=14 && random(2)==0) { quest=second; } else { quest=first+second; } current=replace_string(quest,",",""); // the answer quest=mixup(quest); // the question curr_show=quest; switch(random(1)) { case 0: tell_room(this_object(), enscript("茶博士提笔在墙上写道:"+quest)+"\n"); break; } } if(sizeof(filter_array(all_inventory(this_object()), (:userp:)))) call_out("do_test",60); else
/* @brief Reads from the child process's standard out in a loop. Meant to be used * as a spawned thread. * * @param args Immediately cast to a result_params_t type struct. See that struct * for more information. * @return NULL. */ void *get_results(void *args) { int32_t fd = ((struct result_params *)args)->fd; cairo_t *cairo_context = ((struct result_params *)args)->cr; cairo_surface_t *cairo_surface = ((struct result_params *)args)->cr_surface; xcb_connection_t *connection = ((struct result_params *)args)->connection; xcb_window_t window = ((struct result_params *)args)->window; size_t res; while (1) { /* Read until a new line. */ res = 0; int ret; do { ret = read(fd, global.result_buf + res, sizeof(global.result_buf) - res); res += ret; } while(!find_newline(global.result_buf, sizeof(global.result_buf)) && ret > 0); if (res < 0) { fprintf(stderr, "Error in spawned cmd.\n"); return NULL; } else if (res == 0) { return NULL; } result_t *results = NULL; uint32_t result_count = parse_response_text(global.result_buf, res, &results); pthread_mutex_lock(&global.result_mutex); if (global.results && results != global.results) { free(global.results); } global.results = results; global.result_count = result_count; pthread_mutex_unlock(&global.result_mutex); debug("Recieved %d results.\n", result_count); draw_response_text(connection, window, cairo_context, cairo_surface, results, result_count); } }