char* selectionList; //list of items to be used by loop to be put in pc_data or in the character somewhere if you want mob to ba able to use it, your call
void free_string( char **pstr) {
if ( !*pstr || (*pstr == &str_empty[0]))
return;
free(*pstr);
*pstr = NULL;
}
/**
* Caller is responsible for freeing pstr
* warning if pstr is set to empty string
* to malloc is done, string is assigned &str_empyt[0]
*/
void replace_string(char **pstr, char *nstr) {
if (*pstr && *pstr != &str_empty[0])
free_string( &*pstr);
if ( !nstr || nstr == &str_empty[0])
*pstr = &str_empty[0];
else {
*pstr = (char *)malloc((strlen(nstr) + 1) * sizeof(char));
strcpy( *pstr, nstr);
}
}
bool_t do_loop(CHAR_DATA *ch, char *argument) {
if ( !ch || !ch->valid || !argument)
return FALSE;
char helpmsg[MAX_STRING_LENGTH];
sprintf(helpmsg, "loop <number of times/selection> <looping command>\n\r");
char arg1[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg1);
if (arg1[0] == '\0' || argument[0] == '\0') {
send_to_char(helpmsg, ch);
return FALSE;
}
if (is_number(arg1)) {
int value = is_number(arg1) ? atoi(arg1) : -1;
if (value < 0) {
send_to_char("How many times ?\n\r", ch);
return FALSE;
}
int i;
if (IS_IMMORTAL(ch)) {
for (i = 0;i < value;i ++)
if ( !interpret(ch, argument, FALSE))
break;
}
else {
for (i = 0;i < value;i ++) {
if (strlen(ch->desc->inbuf) +strlen(argument) < 128 * MAX_INPUT_LENGTH - 6) {//char inbuf[128 * MAX_INPUT_LENGTH]
strcat(ch->desc->inbuf, argument);
strcat(ch->desc->inbuf, "\n\r");
}
}
}
return TRUE;
}
if ( !str_cmp(arg1, "selection")) {
if (ch->pcdata->selectionList == &str_empty[0]) {
send_to_char("Your selection list is empty\n\r", ch);
return FALSE;
}
char *command = &str_empty[0];
replace_string( &command, argument);
char *numberList = ch->pcdata->selectionList;
char arg[MAX_INPUT_LENGTH];
for (numberList = one_argument(numberList, arg); arg[0] != '\0';) {
command = string_replace(command, "<xxx>", arg);
if (IS_IMMORTAL(ch)) {
if ( !interpret(ch, command, FALSE))
break;
}
else {
if (strlen(ch->desc->inbuf) + strlen(command) < 128 * MAX_INPUT_LENGTH - 6) { //char inbuf[128 * MAX_INPUT_LENGTH]
strcat(ch->desc->inbuf, command);
strcat(ch->desc->inbuf, "\n\r");
}
}
replace_string( &command, argument);
arg[0] = '\0';
numberList = one_argument(numberList, arg);
}
free_string(&command);
return TRUE;
}
send_to_char(helpmsg, ch);
return FALSE;
}
bool_t do_selection(CHAR_DATA *ch, char *argument) {
if ( !ch || !ch->valid || !argument || IS_NPC(ch))
return FALSE;
char helpmsg[MAX_STRING_LENGTH];
sprintf(helpmsg, "Usage: selection <start> <end> or <clear> or <show> or <number/string>\n\r");
char arg[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
argument = one_argument(argument, arg2);
if (arg[0] == '\0') {
send_to_char(helpmsg, ch);
return FALSE;
}
if ( !str_cmp(arg, "clear")) {
free_string( &ch->pcdata->selectionList);
ch->pcdata->selectionList = &str_empty[0];
return TRUE;
}
char buf[MAX_STRING_LENGTH];
buf[0] = '\0';
char *argLeft = ch->pcdata->selectionList;
if ( !str_cmp(arg, "show")) {
if (ch->pcdata->selectionList == &str_empty[0]) {
send_to_char("Your selection list is empty\n\r", ch);
return FALSE;
}
short int count = 1;
for (argLeft = one_argument(argLeft, arg); arg[0] != '\0';) {
sprintf(buf, "%s %6s", buf, arg);
if (count ++ % 13 == 0) {
chprintf(ch, "%s\n\r", buf);
buf[0] = '\0';
count = 1;
}
arg[0] = '\0';
argLeft = one_argument(argLeft, arg);
}
if (buf[0] != '\0')
chprintf(ch, "%6s\n\r", buf);
return TRUE;
}
if (is_number(arg) && arg2[0] != '\0' && is_number(arg2)) {
char buf[(strlen(arg2) + 1) * (atoi(arg2) - atoi(arg) + 1)];
buf[0] = '\0';
short int i;
for (i = atoi(arg);i <= atoi(arg2);i ++)
sprintf(buf, "%s%6d ", buf, i);
replace_string( &ch->pcdata->selectionList, buf);
send_to_char("Selection filled\n\r", ch);
return TRUE;
}
if (ch->pcdata->selectionList == &str_empty[0]) {
replace_string( &ch->pcdata->selectionList, arg);
chprintf(ch, "%s inserted.\n\r", arg);
return TRUE;
}
char value[MAX_INPUT_LENGTH];
sprintf(value, "%s", arg);
bool_t isRemoved = FALSE, isInserted = FALSE;
for (argLeft = one_argument(argLeft, arg);arg[0] != '\0';) {
if (str_cmp(arg, value)) {
if ( !isInserted && !isRemoved) {
if ((is_number(value) && is_number(arg) && atoi(value) < atoi(arg))
|| ( !is_number(value) && strcmp(value, arg) < 0)) {
sprintf(buf, "%s %s", buf, value);
isInserted = TRUE;
}
}
sprintf(buf, "%s %s", buf, arg);
}
else
isRemoved = TRUE;
arg[0] = '\0';
argLeft = one_argument(argLeft, arg);
}
if ( !isRemoved && !isInserted)
sprintf(buf, "%s %s", buf, value);
trim(buf);
if (buf[0] == '\0') {
free_string( &ch->pcdata->selectionList);
ch->pcdata->selectionList = &str_empty[0];
}
else
replace_string( &ch->pcdata->selectionList, buf);
chprintf(ch, "%s %s.\n\r", value, isRemoved ? "removed" : "inserted");
return TRUE;
}