示例#1
0
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
示例#2
0
/* @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);
  }
}