void frontnet_session_create(struct GuiButton *gbtn) { struct TbNetworkSessionNameEntry *nsname; unsigned long plyr_num; void *conn_options; char *text; char *txpos; long i,idx; idx = 0; for (i=0; i < net_number_of_sessions; i++) { nsname = net_session[i]; if (nsname == NULL) continue; text = buf_sprintf("%s",nsname->text); txpos = strchr(text, '\''); if (txpos != NULL) *txpos = '\0'; if (strcmp(text, net_player_name) != 0) idx++; } if (idx > 0) text = buf_sprintf("%s (%d)", net_player_name, idx+1); else text = buf_sprintf("%s", net_player_name); switch (net_service_index_selected) { case 1: modem_dev.field_0 = 0; modem_dev.field_4 = 0; strcpy(modem_dev.field_58, net_config_info.str_join); modem_dev.field_AC = modem_initialise_callback; modem_dev.field_B0 = modem_connect_callback; conn_options = &modem_dev; break; default: conn_options = NULL; break; } if (LbNetwork_Create(text, net_player_name, &plyr_num, conn_options)) { if (net_service_index_selected == 1) process_network_error(modem_dev.field_A8); else process_network_error(-801); return; } frontend_set_player_number(plyr_num); fe_computer_players = 0; frontend_set_state(FeSt_NET_START); }
void case_buf_sprintf() { struct buf *buf = buf(NULL); assert(buf_sprintf(buf, "%s %s!", "hello", "world") == BUF_OK); assert(strcmp(buf_str(buf), "hello world!") == 0); buf_free(buf); }
/*! * @brief キャラクタダンプを作って BUFに保存 * @param dumpbuf 伝送内容バッファ * @return エラーコード */ static errr make_dump(BUF* dumpbuf) { char buf[1024]; FILE *fff; char file_name[1024]; /* Open a new file */ fff = my_fopen_temp(file_name, 1024); if (!fff) { #ifdef JP msg_format("一時ファイル %s を作成できませんでした。", file_name); #else msg_format("Failed to create temporary file %s.", file_name); #endif msg_print(NULL); return 1; } /* 一旦一時ファイルを作る。通常のダンプ出力と共通化するため。 */ (void)make_character_dump(fff); /* Close the file */ my_fclose(fff); /* Open for read */ fff = my_fopen(file_name, "r"); while (fgets(buf, 1024, fff)) { (void)buf_sprintf(dumpbuf, "%s", buf); } /* Close the file */ my_fclose(fff); /* Remove the file */ fd_kill(file_name); /* Success */ return (0); }
static void http_post(int sd, cptr url, BUF *buf) { BUF *output; output = buf_new(); buf_sprintf(output, "POST %s HTTP/1.0\n", url); buf_sprintf(output, "User-Agent: Hengband %d.%d.%d\n", FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); buf_sprintf(output, "Content-Length: %d\n", buf->size); buf_sprintf(output, "Content-Encoding: binary\n"); buf_sprintf(output, "Content-Type: application/octet-stream\n"); buf_sprintf(output, "\n"); buf_append(output, buf->data, buf->size); soc_write(sd, output->data, output->size); }
/** * Displays easter egg messages on screen. */ void draw_eastegg(void) { char *text; static long px[2]={0,0},py[2]={0,0}; static long vx[2]={0,0},vy[2]={0,0}; long i,k; SYNCDBG(5,"Starting"); LbTextSetWindow(0, 0, MyScreenWidth, MyScreenHeight); if (eastegg_skeksis_cntr >= eastegg_skeksis_codes.length) { unsigned char pos; eastegg_skeksis_cntr++; LbTextSetFont(winfont); text=buf_sprintf("Dene says a big 'Hello' to Goth Buns, Tarts and Barbies"); lbDisplay.DrawFlags = Lb_TEXT_ONE_COLOR; for (i=0; i<30; i+=2) { pos = game.play_gameturn - i; lbDisplay.DrawColour = pos; LbTextDraw((LbCosL(16*(long)pos) / 512 + 120) / pixel_size, (LbSinL(32*(long)pos) / 512 + 200) / pixel_size, text); } set_flag_word(&lbDisplay.DrawFlags,Lb_TEXT_ONE_COLOR,false); pos=game.play_gameturn; LbTextDraw((LbCosL(16*(long)pos) / 512 + 120) / pixel_size, (LbSinL(32*(long)pos) / 512 + 200) / pixel_size, text); if (eastegg_skeksis_cntr >= 255) eastegg_skeksis_cntr = 0; } if (game.eastegg01_cntr >= eastegg_feckoff_codes.length) { LbTextSetWindow(0/pixel_size, 0/pixel_size, MyScreenWidth/pixel_size, MyScreenHeight/pixel_size); lbDisplay.DrawFlags &= ~Lb_TEXT_ONE_COLOR; LbTextSetFont(winfont); i = 0; text = buf_sprintf("Simon says Hi to everyone he knows..."); px[i] += vx[i]; if (px[i] < 0) { px[i] = 0; vx[i] = -vx[i]; } py[i] += vy[i]; if (py[i] < 0) { py[i] = 0; vy[i] = -vy[i]; } k = pixel_size*LbTextStringWidth(text); if (px[i]+k >= MyScreenWidth) { vx[i] = -vx[i]; px[i] = MyScreenWidth-k-1; } k = pixel_size*LbTextStringHeight(text); if (py[i]+k >= MyScreenHeight) { vy[i] = -vy[i]; py[i] = MyScreenHeight-k-1; } if (LbScreenIsLocked()) { LbTextDraw(px[i]/pixel_size, py[i]/pixel_size, text); } play_non_3d_sample_no_overlap(90); } if ((game.flags_font & FFlg_AlexCheat) == 0) return; if (game.eastegg02_cntr >= eastegg_jlw_codes.length) { LbTextSetWindow(0/pixel_size, 0/pixel_size, MyScreenWidth/pixel_size, MyScreenHeight/pixel_size); lbDisplay.DrawFlags &= ~Lb_TEXT_ONE_COLOR; LbTextSetFont(winfont); i = 1; text = buf_sprintf("Alex, hopefully lying on a beach with Jo, says Hi"); px[i] += vx[i]; if (px[i] < 0) { px[i] = 0; vx[i] = -vx[i]; } py[i] += vy[i]; if (py[i] < 0) { py[i] = 0; vy[i] = -vy[i]; } k = pixel_size * LbTextStringWidth(text); if (px[i]+k >= MyScreenWidth) { vx[i] = -vx[i]; px[i] = MyScreenWidth-k-1; } k = pixel_size * LbTextStringHeight(text); if (py[i]+k >= MyScreenHeight) { vy[i] = -vy[i]; py[i] = MyScreenHeight-k-1; } if (LbScreenIsLocked()) LbTextDraw(px[i]/pixel_size, py[i]/pixel_size, text); play_non_3d_sample_no_overlap(90); } }
errr report_score(void) { #ifdef MACINTOSH OSStatus err; #else errr err = 0; #endif #ifdef WINDOWS WSADATA wsaData; WORD wVersionRequested =(WORD) (( 1) | ( 1 << 8)); #endif BUF *score; int sd; char seikakutmp[128]; score = buf_new(); sprintf(seikakutmp, "%s ", ap_ptr->title); buf_sprintf(score, "name: %s\n", player_name); buf_sprintf(score, "version: Hengband %d.%d.%d\n", FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); buf_sprintf(score, "score: %d\n", total_points()); buf_sprintf(score, "level: %d\n", p_ptr->lev); buf_sprintf(score, "depth: %d\n", dun_level); buf_sprintf(score, "maxlv: %d\n", p_ptr->max_plv); buf_sprintf(score, "maxdp: %d\n", max_dlv[DUNGEON_ANGBAND]); buf_sprintf(score, "au: %d\n", p_ptr->au); buf_sprintf(score, "turns: %d\n", turn_real(turn)); buf_sprintf(score, "sex: %d\n", p_ptr->psex); buf_sprintf(score, "race: %s\n", rp_ptr->title); buf_sprintf(score, "class: %s\n", cp_ptr->title); buf_sprintf(score, "seikaku: %s\n", seikakutmp); buf_sprintf(score, "realm1: %s\n", realm_names[p_ptr->realm1]); buf_sprintf(score, "realm2: %s\n", realm_names[p_ptr->realm2]); buf_sprintf(score, "killer: %s\n", p_ptr->died_from); buf_sprintf(score, "-----charcter dump-----\n"); make_dump(score); if (screen_dump) { buf_sprintf(score, "-----screen shot-----\n"); buf_append(score, screen_dump, strlen(screen_dump)); } #ifdef WINDOWS if (WSAStartup(wVersionRequested, &wsaData)) { msg_print("Report: WSAStartup failed."); goto report_end; } #endif #ifdef MACINTOSH #if TARGET_API_MAC_CARBON err = InitOpenTransportInContext(kInitOTForApplicationMask, NULL); #else err = InitOpenTransport(); #endif if (err != noErr) { msg_print("Report: OpenTransport failed."); return 1; } #endif Term_clear(); while (1) { char buff[160]; prt("connecting...", 0, 0); Term_fresh(); /* プロキシを設定する */ set_proxy(HTTP_PROXY, HTTP_PROXY_PORT); /* Connect to the score server */ sd = connect_server(HTTP_TIMEOUT, SCORE_SERVER, SCORE_PORT); if (!(sd < 0)) break; sprintf(buff, "Failed to connect to the score server.(%s)", soc_err()); prt(buff, 0, 0); (void)inkey(); if (!get_check_strict("Try again? ", CHECK_NO_HISTORY)) { err = 1; goto report_end; } } prt("Sending the score...", 0, 0); Term_fresh(); http_post(sd, SCORE_PATH, score); disconnect_server(sd); report_end: #ifdef WINDOWS WSACleanup(); #endif #ifdef MACINTOSH #if TARGET_API_MAC_CARBON CloseOpenTransportInContext(NULL); #else CloseOpenTransport(); #endif #endif return err; }
/* * Make screen dump to buffer */ cptr make_screen_dump(void) { BUF *screen_buf; int y, x, i; cptr ret; byte a = 0, old_a = 0; char c = ' '; static cptr html_head[] = { "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n", "<pre>", 0, }; static cptr html_foot[] = { "</pre>\n", "</body>\n</html>\n", 0, }; bool old_use_graphics = use_graphics; int wid, hgt; Term_get_size(&wid, &hgt); /* Alloc buffer */ screen_buf = buf_new(); if (screen_buf == NULL) return (NULL); if (old_use_graphics) { /* Clear -more- prompt first */ msg_print(NULL); use_graphics = FALSE; reset_visuals(); /* Redraw everything */ p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY); /* Hack -- update */ handle_stuff(); } for (i = 0; html_head[i]; i++) buf_sprintf(screen_buf, html_head[i]); /* Dump the screen */ for (y = 0; y < hgt; y++) { /* Start the row */ if (y != 0) buf_sprintf(screen_buf, "\n"); /* Dump each row */ for (x = 0; x < wid - 1; x++) { int rv, gv, bv; cptr cc = NULL; /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); switch (c) { case '&': cc = "&"; break; case '<': cc = "<"; break; case '>': cc = ">"; break; #ifdef WINDOWS case 0x1f: c = '.'; break; case 0x7f: c = (a == 0x09) ? '%' : '#'; break; #endif } a = a & 0x0F; if ((y == 0 && x == 0) || a != old_a) { rv = angband_color_table[a][1]; gv = angband_color_table[a][2]; bv = angband_color_table[a][3]; buf_sprintf(screen_buf, "%s<font color=\"#%02x%02x%02x\">", ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv); old_a = a; } if (cc) buf_sprintf(screen_buf, "%s", cc); else buf_sprintf(screen_buf, "%c", c); } } buf_sprintf(screen_buf, "</font>"); for (i = 0; html_foot[i]; i++) buf_sprintf(screen_buf, html_foot[i]); /* Screen dump size is too big ? */ if (screen_buf->size + 1> SCREEN_BUF_SIZE) { ret = NULL; } else { /* Terminate string */ buf_append(screen_buf, "", 1); ret = string_make(screen_buf->data); } /* Free buffer */ buf_delete(screen_buf); if (old_use_graphics) { use_graphics = TRUE; reset_visuals(); /* Redraw everything */ p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY); /* Hack -- update */ handle_stuff(); } return ret; }
int main(int argc, char** argv) { /* * Standard command-line parsing. */ HASH_T *options = parse_cmdline(argc, argv, arg_opts); if(options == NULL || hash_get(options, "help") != NULL) { show_usage(argc, argv, arg_opts); return EXIT_FAILURE; } char *url = hash_get(options, "url"); const char *principal = hash_get(options, "principal"); CREDENTIALS_T *credentials = NULL; const char *password = hash_get(options, "credentials"); if(password != NULL) { credentials = credentials_create_password(password); } // Setup for condition variable apr_initialize(); apr_pool_create(&pool, NULL); apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_UNNESTED, pool); apr_thread_cond_create(&cond, pool); // Setup for session SESSION_T *session; DIFFUSION_ERROR_T error = { 0 }; session = session_create(url, principal, credentials, NULL, NULL, &error); if(session == NULL) { fprintf(stderr, "TEST: Failed to create session\n"); fprintf(stderr, "ERR : %s\n", error.message); return EXIT_FAILURE; } // Common params for all add_topic() functions. ADD_TOPIC_PARAMS_T common_params = { .on_topic_added = on_topic_added, .on_topic_add_failed = on_topic_add_failed, .on_discard = on_topic_add_discard }; /* * Create a stateless topic. */ TOPIC_DETAILS_T *topic_details = create_topic_details_stateless(); ADD_TOPIC_PARAMS_T stateless_params = common_params; stateless_params.topic_path = "stateless"; stateless_params.details = topic_details; apr_thread_mutex_lock(mutex); add_topic(session, stateless_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Create a topic with single value string data, but with * containing no default data. */ TOPIC_DETAILS_T *string_topic_details = create_topic_details_single_value(M_DATA_TYPE_STRING); ADD_TOPIC_PARAMS_T string_params = common_params; string_params.topic_path = "string"; string_params.details = string_topic_details; apr_thread_mutex_lock(mutex); add_topic(session, string_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Create a topic with single value string data and containing * some default data. */ ADD_TOPIC_PARAMS_T string_data_params = common_params; string_data_params.topic_path = "string-data"; string_data_params.details = string_topic_details; BUF_T *sample_data_buf = buf_create(); buf_write_string(sample_data_buf, "Hello, world"); string_data_params.content = content_create(CONTENT_ENCODING_NONE, sample_data_buf); apr_thread_mutex_lock(mutex); add_topic(session, string_data_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Create a topic with single value integer data, and with a * default value. */ TOPIC_DETAILS_T *integer_topic_details = create_topic_details_single_value(M_DATA_TYPE_INTEGER_STRING); integer_topic_details->topic_details_params.integer.default_value = 999; ADD_TOPIC_PARAMS_T integer_params = common_params; integer_params.topic_path = "integer"; integer_params.details = integer_topic_details; apr_thread_mutex_lock(mutex); add_topic(session, integer_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Create a topic with integer data, but using a CONTENT_T to * specify the initial data. */ ADD_TOPIC_PARAMS_T integer_data_params = common_params; integer_data_params.topic_path = "integer-data"; integer_data_params.details = integer_topic_details; BUF_T *integer_data_buf = buf_create(); buf_sprintf(integer_data_buf, "%d", 123); integer_data_params.content = content_create(CONTENT_ENCODING_NONE, integer_data_buf); apr_thread_mutex_lock(mutex); add_topic(session, integer_data_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Create a topic with single value decimal data, with a * default value and specifying the scale (i.e. positions * after the decimal place). */ TOPIC_DETAILS_T *decimal_topic_details = create_topic_details_single_value(M_DATA_TYPE_DECIMAL_STRING); decimal_topic_details->topic_details_params.decimal.default_value = 123.456; decimal_topic_details->topic_details_params.decimal.scale = 4; ADD_TOPIC_PARAMS_T decimal_params = common_params; decimal_params.topic_path = "decimal"; decimal_params.details = decimal_topic_details; apr_thread_mutex_lock(mutex); add_topic(session, decimal_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Create a topic with decimal data, using a CONTENT_T to * specify the initial data. */ ADD_TOPIC_PARAMS_T decimal_data_params = common_params; decimal_data_params.topic_path = "decimal-data"; decimal_data_params.details = decimal_topic_details; BUF_T *decimal_data_buf = buf_create(); buf_sprintf(decimal_data_buf, "%f", 987.654); decimal_data_params.content = content_create(CONTENT_ENCODING_NONE, decimal_data_buf); apr_thread_mutex_lock(mutex); add_topic(session, decimal_data_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Record topic data. * * The C API does not have the concept of "builders" for * creating record topic data, but requires you to build a * string containing XML that describes the structure of the * messages. */ /* * First of all, this adds a topic equivalent to single-value * strings, but defined with XML. */ BUF_T *manual_schema = buf_create(); buf_write_string(manual_schema, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"); buf_write_string(manual_schema, "<field name=\"x\" type=\"string\" default=\"xyzzy\" allowsEmpty=\"true\"/>"); TOPIC_DETAILS_T *manual_topic_details = create_topic_details_single_value(M_DATA_TYPE_STRING); manual_topic_details->user_defined_schema = manual_schema; ADD_TOPIC_PARAMS_T string_manual_params = common_params; string_manual_params.topic_path = "string-manual"; string_manual_params.details = manual_topic_details; apr_thread_mutex_lock(mutex); add_topic(session, string_manual_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * This adds a topic with a record containing multiple fields * of different types. */ BUF_T *record_schema = buf_create(); buf_write_string(record_schema, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"); buf_write_string(record_schema, "<message topicDataType=\"record\" name=\"MyContent\">"); buf_write_string(record_schema, "<record name=\"Record1\">"); buf_write_string(record_schema, "<field type=\"string\" default=\"\" allowsEmpty=\"true\" name=\"Field1\"/>"); buf_write_string(record_schema, "<field type=\"integerString\" default=\"0\" allowsEmpty=\"false\" name=\"Field2\"/>"); buf_write_string(record_schema, "<field type=\"decimalString\" default=\"0.00\" scale=\"2\" allowsEmpty=\"false\" name=\"Field3\"/>"); buf_write_string(record_schema, "</record>"); buf_write_string(record_schema, "</message>"); TOPIC_DETAILS_T *record_topic_details = create_topic_details_record(); record_topic_details->user_defined_schema = record_schema; ADD_TOPIC_PARAMS_T record_params = common_params; record_params.topic_path = "record"; record_params.details = record_topic_details; apr_thread_mutex_lock(mutex); add_topic(session, record_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * We can also remove topics. First, add a couple of topics * and then remove their parent topic. All child topics are * removed with the parent. */ puts("Adding topics remove_me/1 and remove_me/2"); ADD_TOPIC_PARAMS_T topic_params = common_params; topic_params.details = topic_details; topic_params.topic_path = "remove_me/1"; apr_thread_mutex_lock(mutex); add_topic(session, topic_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); topic_params.topic_path = "remove_me/2"; apr_thread_mutex_lock(mutex); add_topic(session, topic_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); puts("Removing topics in 5 seconds..."); sleep(5); REMOVE_TOPICS_PARAMS_T remove_params = { .on_removed = on_topic_removed, .on_discard = on_topic_remove_discard, .topic_selector = ">remove_me" }; apr_thread_mutex_lock(mutex); remove_topics(session, remove_params); apr_thread_cond_wait(cond, mutex); apr_thread_mutex_unlock(mutex); /* * Close our session, and release resources and memory. */ session_close(session, NULL); session_free(session); apr_thread_mutex_destroy(mutex); apr_thread_cond_destroy(cond); apr_pool_destroy(pool); apr_terminate(); return EXIT_SUCCESS; }