/* ---------------------------------------------------------------------- * fill the param_t struct * return 1 on (acceptable) termination * 0 on continue * -1 on error */ int process_opts(param_t * params, int argc, char * argv[] ) { int ac, ival; ENTRY("process_opts"); memset(params, 0, sizeof(param_t)); /* init everything to 0 */ params->inputs = NULL; params->prefix = "combined_mask"; init_int_list(¶ms->IND, 0); init_int_list(¶ms->RESD, 0); params->frac = -1.0; params->datum = MRI_byte; params->verb = 1; params->ndsets = 0; if( argc < 2 ) { show_help(); RETURN(1); } ac = 1; while( ac < argc ) { /* check for terminal options */ if( strcmp(argv[ac],"-help") == 0 ) { show_help(); RETURN(1); } else if( strcmp(argv[ac],"-hist") == 0 ) { int c, len = sizeof(g_history)/sizeof(char *); for( c = 0; c < len; c++) fputs(g_history[c], stdout); putchar('\n'); RETURN(1); } else if( strcmp(argv[ac],"-ver") == 0 ) { puts(g_version); RETURN(1); } /* the remaining options are alphabetical */ else if( strcmp(argv[ac],"-count") == 0 ) { params->count = 1; ac++; continue; } else if( strcmp(argv[ac],"-datum") == 0 ) { if( ++ac >= argc ) ERROR_exit("need argument after '-datum'"); /* output datum can be byte, short or float */ if ( ! strcmp(argv[ac],"byte") ) params->datum = MRI_byte; else if( ! strcmp(argv[ac],"short") ) params->datum = MRI_short; else if( ! strcmp(argv[ac],"float") ) params->datum = MRI_float; else ERROR_exit("-datum '%s' is not supported", argv[ac]); ac++; continue; } /* read in a list of dilations (negatives are erosions) */ else if( strncmp(argv[ac],"-dilate_in", 10) == 0 ) { char * rptr; /* return pointer for strtol */ int ndilates = 0; if( ++ac >= argc ) ERROR_exit("need argument after '-dilate_inputs'"); ival = strtol(argv[ac], &rptr, 10); while( ac < argc && rptr > argv[ac] ) { if( ! add_to_int_list(¶ms->IND, ival, 1) ) RETURN(-1); ndilates++; if( ++ac >= argc ) break; ival = strtol(argv[ac], &rptr, 10); } if( ndilates == 0 ) ERROR_exit("no integral dilations found after -dilate_inputs"); /* ac is already past last number */ continue; } /* read in a list of dilations (negatives are erosions) */ else if( strncmp(argv[ac],"-dilate_result", 11) == 0 ) { char * rptr; /* return pointer for strtol */ int ndilates = 0; if( ++ac >= argc ) ERROR_exit("need argument after '-dilate_result'"); ival = strtol(argv[ac], &rptr, 10); while( ac < argc && rptr > argv[ac] ) { if( ! add_to_int_list(¶ms->RESD, ival, 1) ) RETURN(-1); ndilates++; if( ++ac >= argc ) break; ival = strtol(argv[ac], &rptr, 10); } if( ndilates == 0 ) ERROR_exit("no integral dilations found after -dilate_result"); /* ac is already past last number */ continue; } /* overlap: -frac, -inter, -union */ else if( strncmp(argv[ac],"-frac", 5) == 0 ) { if( ++ac >= argc ) ERROR_exit("need argument after '-frac'"); params->frac = atof(argv[ac]); if( params->frac < 0.0 ) ERROR_exit("have -frac < 0 (from %s)", argv[ac]); ac++; continue; } else if( strncmp(argv[ac],"-inter", 6) == 0 ) { params->frac = 1.0; ac++; continue; } else if( strcmp(argv[ac],"-union") == 0 ) { params->frac = 0.0; ac++; continue; } else if( strcmp(argv[ac],"-fill_holes") == 0 ) { params->fill = 1; ac++; continue; } else if( strncmp(argv[ac],"-inputs", 4) == 0 ) { /* store list of names from argv */ ac++; params->inputs = argv+ac; /* pointer to first name */ params->ndsets = 0; /* number of datasets */ while( ac < argc && argv[ac][0] != '-' ){ params->ndsets++; ac++; } if( params->ndsets == 0 ) ERROR_exit("need datasets after '-inputs'"); /* already incremented: ac++; */ continue; } else if( strcmp(argv[ac],"-prefix") == 0 ) { if( ++ac >= argc ) ERROR_exit("need argument after '-prefix'"); params->prefix = argv[ac]; if( !THD_filename_ok(params->prefix) ) ERROR_exit("Illegal name after -prefix: %s", argv[ac]); ac++; continue; } else if( strcmp(argv[ac],"-quiet") == 0 ) { /* -quiet means -verb 0 */ params->verb = 0; ac++; continue; } else if( strcmp(argv[ac],"-verb") == 0 ) { if( ++ac >= argc ) ERROR_exit("need argument after '-verb'"); params->verb = atoi(argv[ac]); ac++; continue; } ERROR_message("** unknown option '%s'\n",argv[ac]); RETURN(-1); } if( !dilations_are_valid(& params->IND) || !dilations_are_valid(& params->RESD) ) RETURN(-1); if( params->ndsets <= 0 ) ERROR_exit("missing -input dataset list"); if( !params->prefix ) ERROR_exit("missing -prefix option"); if( params->frac < 0.0 ) { if( params->verb ) INFO_message("no -frac option: defaulting to -union"); params->frac = 0.0; } if( params->verb > 1 ) INFO_message("%d datasets, frac = %g, %d IN dilation(s), %d OUT D(s)\n", params->ndsets, params->frac, params->IND.num, params->RESD.num); RETURN(0); }
void sedit_parse(struct descriptor_data *d, char *arg) { int i; if (OLC_MODE(d) > SEDIT_NUMERICAL_RESPONSE) { if (!isdigit(arg[0]) && ((*arg == '-') && (!isdigit(arg[1])))) { write_to_output(d, "Field must be numerical, try again : "); return; } } switch (OLC_MODE(d)) { /*-------------------------------------------------------------------*/ case SEDIT_CONFIRM_SAVESTRING: switch (*arg) { case 'y': case 'Y': sedit_save_internally(d); mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits shop %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { sedit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); write_to_output(d, "Shop saved to disk.\r\n"); } else write_to_output(d, "Shop saved to memory.\r\n"); cleanup_olc(d, CLEANUP_STRUCTS); return; case 'n': case 'N': cleanup_olc(d, CLEANUP_ALL); return; default: write_to_output(d, "Invalid choice!\r\nDo you wish to save your changes? : "); return; } break; /*-------------------------------------------------------------------*/ case SEDIT_MAIN_MENU: i = 0; switch (*arg) { case 'q': case 'Q': if (OLC_VAL(d)) { /* Anything been changed? */ write_to_output(d, "Do you wish to save your changes? : "); OLC_MODE(d) = SEDIT_CONFIRM_SAVESTRING; } else cleanup_olc(d, CLEANUP_ALL); return; case '0': OLC_MODE(d) = SEDIT_KEEPER; write_to_output(d, "Enter vnum number of shop keeper : "); return; case '1': OLC_MODE(d) = SEDIT_OPEN1; i++; break; case '2': OLC_MODE(d) = SEDIT_CLOSE1; i++; break; case '3': OLC_MODE(d) = SEDIT_OPEN2; i++; break; case '4': OLC_MODE(d) = SEDIT_CLOSE2; i++; break; case '5': OLC_MODE(d) = SEDIT_BUY_PROFIT; i++; break; case '6': OLC_MODE(d) = SEDIT_SELL_PROFIT; i++; break; case '7': OLC_MODE(d) = SEDIT_NOITEM1; i--; break; case '8': OLC_MODE(d) = SEDIT_NOITEM2; i--; break; case '9': OLC_MODE(d) = SEDIT_NOCASH1; i--; break; case 'a': case 'A': OLC_MODE(d) = SEDIT_NOCASH2; i--; break; case 'b': case 'B': OLC_MODE(d) = SEDIT_NOBUY; i--; break; case 'c': case 'C': OLC_MODE(d) = SEDIT_BUY; i--; break; case 'd': case 'D': OLC_MODE(d) = SEDIT_SELL; i--; break; case 'e': case 'E': sedit_no_trade_menu(d); return; case 'f': case 'F': sedit_shop_flags_menu(d); return; case 'r': case 'R': sedit_rooms_menu(d); return; case 'p': case 'P': sedit_products_menu(d); return; case 't': case 'T': sedit_namelist_menu(d); return; default: sedit_disp_menu(d); return; } if (i == 0) break; else if (i == 1) write_to_output(d, "\r\nEnter new value : "); else if (i == -1) write_to_output(d, "\r\nEnter new text :\r\n] "); else write_to_output(d, "Oops...\r\n"); return; /*-------------------------------------------------------------------*/ case SEDIT_NAMELIST_MENU: switch (*arg) { case 'a': case 'A': sedit_types_menu(d); return; case 'd': case 'D': write_to_output(d, "\r\nDelete which entry? : "); OLC_MODE(d) = SEDIT_DELETE_TYPE; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ case SEDIT_PRODUCTS_MENU: switch (*arg) { case 'a': case 'A': write_to_output(d, "\r\nEnter new product vnum number : "); OLC_MODE(d) = SEDIT_NEW_PRODUCT; return; case 'd': case 'D': write_to_output(d, "\r\nDelete which product? : "); OLC_MODE(d) = SEDIT_DELETE_PRODUCT; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ case SEDIT_ROOMS_MENU: switch (*arg) { case 'a': case 'A': write_to_output(d, "\r\nEnter new room vnum number : "); OLC_MODE(d) = SEDIT_NEW_ROOM; return; case 'c': case 'C': sedit_compact_rooms_menu(d); return; case 'l': case 'L': sedit_rooms_menu(d); return; case 'd': case 'D': write_to_output(d, "\r\nDelete which room? : "); OLC_MODE(d) = SEDIT_DELETE_ROOM; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ /* * String edits. */ case SEDIT_NOITEM1: if (genolc_checkstring(d, arg)) modify_string(&S_NOITEM1(OLC_SHOP(d)), arg); break; case SEDIT_NOITEM2: if (genolc_checkstring(d, arg)) modify_string(&S_NOITEM2(OLC_SHOP(d)), arg); break; case SEDIT_NOCASH1: if (genolc_checkstring(d, arg)) modify_string(&S_NOCASH1(OLC_SHOP(d)), arg); break; case SEDIT_NOCASH2: if (genolc_checkstring(d, arg)) modify_string(&S_NOCASH2(OLC_SHOP(d)), arg); break; case SEDIT_NOBUY: if (genolc_checkstring(d, arg)) modify_string(&S_NOBUY(OLC_SHOP(d)), arg); break; case SEDIT_BUY: if (genolc_checkstring(d, arg)) modify_string(&S_BUY(OLC_SHOP(d)), arg); break; case SEDIT_SELL: if (genolc_checkstring(d, arg)) modify_string(&S_SELL(OLC_SHOP(d)), arg); break; case SEDIT_NAMELIST: if (genolc_checkstring(d, arg)) { struct shop_buy_data new_entry; BUY_TYPE(new_entry) = OLC_VAL(d); BUY_WORD(new_entry) = strdup(arg); add_to_type_list(&(S_NAMELISTS(OLC_SHOP(d))), &new_entry); } sedit_namelist_menu(d); return; /*-------------------------------------------------------------------*/ /* * Numerical responses. */ case SEDIT_KEEPER: i = atoi(arg); if ((i = atoi(arg)) != -1) if ((i = real_mobile(i)) == NOBODY) { write_to_output(d, "That mobile does not exist, try again : "); return; } S_KEEPER(OLC_SHOP(d)) = i; if (i == -1) break; /* * Fiddle with special procs. */ S_FUNC(OLC_SHOP(d)) = mob_index[i].func != shop_keeper ? mob_index[i].func : NULL; mob_index[i].func = shop_keeper; break; case SEDIT_OPEN1: S_OPEN1(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_OPEN2: S_OPEN2(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_CLOSE1: S_CLOSE1(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_CLOSE2: S_CLOSE2(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_BUY_PROFIT: sscanf(arg, "%f", &S_BUYPROFIT(OLC_SHOP(d))); break; case SEDIT_SELL_PROFIT: sscanf(arg, "%f", &S_SELLPROFIT(OLC_SHOP(d))); break; case SEDIT_TYPE_MENU: OLC_VAL(d) = LIMIT(atoi(arg), 0, NUM_ITEM_TYPES - 1); write_to_output(d, "Enter namelist (return for none) :-\r\n] "); OLC_MODE(d) = SEDIT_NAMELIST; return; case SEDIT_DELETE_TYPE: remove_from_type_list(&(S_NAMELISTS(OLC_SHOP(d))), atoi(arg)); sedit_namelist_menu(d); return; case SEDIT_NEW_PRODUCT: if ((i = atoi(arg)) != -1) if ((i = real_object(i)) == NOTHING) { write_to_output(d, "That object does not exist, try again : "); return; } if (i > 0) add_to_int_list(&(S_PRODUCTS(OLC_SHOP(d))), i); sedit_products_menu(d); return; case SEDIT_DELETE_PRODUCT: remove_from_int_list(&(S_PRODUCTS(OLC_SHOP(d))), atoi(arg)); sedit_products_menu(d); return; case SEDIT_NEW_ROOM: if ((i = atoi(arg)) != -1) if ((i = real_room(i)) == NOWHERE) { write_to_output(d, "That room does not exist, try again : "); return; } if (i >= 0) add_to_int_list(&(S_ROOMS(OLC_SHOP(d))), atoi(arg)); sedit_rooms_menu(d); return; case SEDIT_DELETE_ROOM: remove_from_int_list(&(S_ROOMS(OLC_SHOP(d))), atoi(arg)); sedit_rooms_menu(d); return; case SEDIT_SHOP_FLAGS: if ((i = LIMIT(atoi(arg), 0, NUM_SHOP_FLAGS)) > 0) { TOGGLE_BIT(S_BITVECTOR(OLC_SHOP(d)), 1 << (i - 1)); sedit_shop_flags_menu(d); return; } break; case SEDIT_NOTRADE: if ((i = LIMIT(atoi(arg), 0, NUM_TRADERS)) > 0) { TOGGLE_BIT(S_NOTRADE(OLC_SHOP(d)), 1 << (i - 1)); sedit_no_trade_menu(d); return; } break; /*-------------------------------------------------------------------*/ default: /* * We should never get here. */ cleanup_olc(d, CLEANUP_ALL); mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: sedit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; } /*-------------------------------------------------------------------*/ /* * END OF CASE * If we get here, we have probably changed something, and now want to * return to main menu. Use OLC_VAL as a 'has changed' flag. */ OLC_VAL(d) = 1; sedit_disp_menu(d); }