From dceb563a9b0af8604ff8381823ff201a404ab6f5 Mon Sep 17 00:00:00 2001 From: MBourne Date: Sun, 7 Jun 2020 13:52:22 +0100 Subject: [PATCH] Bug/drink containers (#94) * Bugfix for name_from_drinkcon * Newline at end of utils.c --- src/act.item.c | 43 +++++---------------------------- src/utils.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils.h | 2 ++ 3 files changed, 73 insertions(+), 37 deletions(-) diff --git a/src/act.item.c b/src/act.item.c index 9198ffe..793226a 100644 --- a/src/act.item.c +++ b/src/act.item.c @@ -779,50 +779,19 @@ void weight_change_object(struct obj_data *obj, int weight) void name_from_drinkcon(struct obj_data *obj) { - char *new_name, *cur_name, *next; const char *liqname; - int liqlen, cpylen, maxlen; + char *new_name; if (!obj || (GET_OBJ_TYPE(obj) != ITEM_DRINKCON && GET_OBJ_TYPE(obj) != ITEM_FOUNTAIN)) return; liqname = drinknames[GET_OBJ_VAL(obj, 2)]; - if (!isname(liqname, obj->name)) { - log("SYSERR: Can't remove liquid '%s' from '%s' (%d) item.", liqname, obj->name, obj->item_number); - /* SYSERR_DESC: From name_from_drinkcon(), this error comes about if the - * object noted (by keywords and item vnum) does not contain the liquid - * string being searched for. */ - return; - } - - liqlen = strlen(liqname); - maxlen = strlen(obj->name) - strlen(liqname); /* +1 for NUL, -1 for space */ - CREATE(new_name, char, maxlen); - - for (cur_name = obj->name; cur_name; cur_name = next) { - if (*cur_name == ' ') - cur_name++; - - if ((next = strchr(cur_name, ' '))) - cpylen = next - cur_name; - else - cpylen = strlen(cur_name); - - if (!strn_cmp(cur_name, liqname, liqlen)) - continue; - - if (*new_name) { - strcat(new_name, " "); /* strcat: OK (size precalculated) */ - maxlen--; - } - - strncat(new_name, cur_name, maxlen); /* strncat: OK (size precalculated) */ - maxlen -= cpylen; - } - - if (GET_OBJ_RNUM(obj) == NOTHING || obj->name != obj_proto[GET_OBJ_RNUM(obj)].name) - free(obj->name); + + remove_from_string(obj->name, liqname); + new_name = right_trim_whitespace(obj->name); + free(obj->name); obj->name = new_name; + } void name_to_drinkcon(struct obj_data *obj, int type) diff --git a/src/utils.c b/src/utils.c index de4ca35..fc3a277 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1489,3 +1489,68 @@ char * convert_from_tabs(char * string) parse_tab(buf); return(buf); } + +/* This removes all trailing whitespace from the end of a string */ +char *right_trim_whitespace(const char *string) +{ + char *r = strdup(string); + if (r != NULL) + { + char *fr = r + strlen(string) - 1; + while( (isspace(*fr) || !isprint(*fr) || *fr == 0) && fr >= r) --fr; + *++fr = 0; + } + + return r; +} + +/** + * Remove all occurrences of a given word in string. + */ +void remove_from_string(char *string, const char *to_remove) +{ + int i, j, string_len, to_remove_len; + int found; + + string_len = strlen(string); // Length of string + to_remove_len = strlen(to_remove); // Length of word to remove + + + for(i=0; i <= string_len - to_remove_len; i++) + { + /* Match word with string */ + found = 1; + for(j=0; j