int ini_read_bool(ini_t *handler, const char *section, const char *name, bool *value, bool default_value) { char *s = NULL; int ret = ini_read_str(handler, section, name, &s, NULL); if (ret == 0) { int i; for (i = 0; s[i]; ++i) s[i] = tolower(s[i]); if (strcmp(s, "true") == 0) *value = true; else if (strcmp(s, "false") == 0) *value = false; else *value = default_value; free(s); } else if (ret > 0) { *value = default_value; } return ret; }
static int ini_read_num(ini_t *handler, const char *section, const char *name, void *value, bool is_unsigned) { char *s = NULL; int ret = ini_read_str(handler, section, name, &s, NULL); if (ret == 0) { if (is_unsigned) *(unsigned long long int*)value = strtoull(s, NULL, 0); else *(long long int *)value = strtoll(s, NULL, 0); free(s); } return ret; }
int ini_read_double(ini_t *handler, const char *section, const char *name, double *value, double default_value) { char *s = NULL; int ret = ini_read_str(handler, section, name, &s, NULL); if (ret == 0) { *value = strtod(s, NULL); free(s); } else if (ret > 0) { *value = default_value; } return ret; }
int ini_read_strn(ini_t *handler, const char *section, const char *name, char *value, size_t n, const char *default_value) { char *s = NULL; int ret = ini_read_str(handler, section, name, &s, default_value); if (ret < 0) return ret; memset(value, 0, n); if (s) { sstrncpy(value, s, n); free(s); } return ret; }
int ini_read_ipv4_addr(ini_t *handler, const char *section, const char *name, struct sockaddr_in *addr, const char *default_value) { char *s = NULL; int ret = ini_read_str(handler, section, name, &s, default_value); if (ret < 0) return ret; memset(addr, 0, sizeof(struct sockaddr_in)); if (s) { char *ip = strtok(s, ": \t"); if (ip == NULL) { free(s); return -1; } char *port = strtok(NULL, ": \t"); if (port == NULL) { free(s); return -1; } addr->sin_family = AF_INET; if (inet_aton(ip, &addr->sin_addr) == 0) { free(s); return -1; } addr->sin_port = htons((uint16_t)atoi(port)); free(s); } return ret; }
int main() { /* $ export MALLOC_TRACE=malloc.log */ mtrace(); ini_t *conf = ini_load("test.ini"); if (conf == NULL) error(1, errno, "ini_load fail"); char *type; ini_read_str(conf, "main", "type", &type, "test"); puts(type); free(type); char value[100] = { 0 }; ini_read_strn(conf, "main", "len", value, sizeof(value), NULL); puts(value); int i; ini_read_int(conf, "int", "int", &i, 0); unsigned ui; ini_read_unsigned(conf, "int", "unsigned", &ui, 0); printf("int: %d, unsigned: %u\n", i, ui); int8_t int8; ini_read_int8(conf, "int", "int8", &int8, 0); uint8_t uint8; ini_read_uint8(conf, "int", "uint8", &uint8, 0); printf("int8: %i, uint8: %u\n", int8, uint8); int16_t int16; ini_read_int16(conf, "int", "int16", &int16, 0); uint16_t uint16; ini_read_uint16(conf, "int", "uint16", &uint16, 0); printf("int16: %i, uint16: %u\n", int16, uint16); int32_t int32; ini_read_int32(conf, "int", "int32", &int32, 0); uint32_t uint32; ini_read_uint32(conf, "int", "uint32", &uint32, 0); printf("int32: %i, uint32: %u\n", int32, uint32); int64_t int64; ini_read_int64(conf, "int", "int64", &int64, 0); uint64_t uint64; ini_read_uint64(conf, "int", "uint64", &uint64, 0); printf("int64: %"PRIi64", uint64: %"PRIu64"\n", int64, uint64); float f; ini_read_float(conf, "float", "float", &f, 0); double d; ini_read_double(conf, "float", "double", &d, 0); printf("float: %f, double: %f\n", f, d); struct sockaddr_in addr; ini_read_ipv4_addr(conf, "addr", "ipv4", &addr, "127.0.0.1:0"); printf("%s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); char *proc_name = NULL; ini_read_str(conf, "global", "proc_name", &proc_name, "test.ini"); printf("proc_name: %s\n", proc_name); free(proc_name); char *phone_num = NULL; ini_read_str(conf, "damon", "phone num", &phone_num, "123456789"); printf("phone num: %s\n", phone_num); free(phone_num); char *city = NULL; ini_read_str(conf, "global", "$%^#@!", &city, "shen zhen"); puts(city); free(city); char *name = NULL; ini_read_str(conf, NULL, "名字", &name, ""); puts(name); free(name); ini_free(conf); return 0; }
int main (int argc, char *argv[]) { int r; char **optarg; int run, nomon; unsigned drive; char *cfg; ini_sct_t *sct; cfg = NULL; run = 0; nomon = 0; pce_log_init(); pce_log_add_fp (stderr, 0, MSG_INF); par_cfg = ini_sct_new (NULL); if (par_cfg == NULL) { return (1); } ini_str_init (&par_ini_str); while (1) { r = pce_getopt (argc, argv, &optarg, opts); if (r == GETOPT_DONE) { break; } if (r < 0) { return (1); } switch (r) { case '?': print_help(); return (0); case 'V': print_version(); return (0); case 'b': par_disk_delay_valid |= 1; par_disk_delay[0] = (unsigned) strtoul (optarg[0], NULL, 0); break; case 'B': drive = strtoul (optarg[0], NULL, 0); if ((drive < 1) || (drive >= SONY_DRIVES)) { fprintf (stderr, "%s: bad drive number (%u)\n", argv[0], drive ); return (1); } drive -= 1; par_disk_delay_valid |= 1U << drive; par_disk_delay[drive] = (unsigned) strtoul (optarg[1], NULL, 0); break; case 'c': cfg = optarg[0]; break; case 'd': pce_path_set (optarg[0]); break; case 'i': if (ini_read_str (par_cfg, optarg[0])) { fprintf (stderr, "%s: error parsing ini string (%s)\n", argv[0], optarg[0] ); return (1); } break; case 'I': ini_str_add (&par_ini_str, optarg[0], "\n", NULL); break; case 'l': pce_log_add_fname (optarg[0], MSG_DEB); break; case 'p': ini_str_add (&par_ini_str, "cpu.model = \"", optarg[0], "\"\n" ); break; case 'q': pce_log_set_level (stderr, MSG_ERR); break; case 'r': run = 1; break; case 'R': nomon = 1; break; case 's': ini_str_add (&par_ini_str, "cpu.speed = ", optarg[0], "\n" ); break; case 't': par_terminal = optarg[0]; break; case 'v': pce_log_set_level (stderr, MSG_DEB); break; case 0: fprintf (stderr, "%s: unknown option (%s)\n", argv[0], optarg[0] ); return (1); default: return (1); } } mac_log_banner(); if (pce_load_config (par_cfg, cfg)) { return (1); } sct = ini_next_sct (par_cfg, NULL, "macplus"); if (sct == NULL) { sct = par_cfg; } if (ini_str_eval (&par_ini_str, sct, 1)) { return (1); } atexit (mac_atexit); #ifdef PCE_ENABLE_SDL SDL_Init (0); #endif pce_path_ini (sct); signal (SIGINT, &sig_int); signal (SIGSEGV, &sig_segv); signal (SIGTERM, &sig_term); pce_console_init (stdin, stdout); par_sim = mac_new (sct); mon_init (&par_mon); mon_set_cmd_fct (&par_mon, mac_cmd, par_sim); mon_set_msg_fct (&par_mon, mac_set_msg, par_sim); mon_set_get_mem_fct (&par_mon, par_sim->mem, mem_get_uint8); mon_set_set_mem_fct (&par_mon, par_sim->mem, mem_set_uint8); mon_set_memory_mode (&par_mon, 0); cmd_init (par_sim, cmd_get_sym, cmd_set_sym); mac_cmd_init (par_sim, &par_mon); mac_reset (par_sim); if (nomon) { while (par_sim->brk != PCE_BRK_ABORT) { mac_run (par_sim); } } else if (run) { mac_run (par_sim); if (par_sim->brk != PCE_BRK_ABORT) { pce_puts ("\n"); } } else { pce_puts ("type 'h' for help\n"); } if (par_sim->brk != PCE_BRK_ABORT) { mon_run (&par_mon); } mac_del (par_sim); #ifdef PCE_ENABLE_SDL SDL_Quit(); #endif mon_free (&par_mon); pce_console_done(); pce_log_done(); return (0); }