void docall(struct obj *obj) { char buf[BUFSZ], qbuf[QBUFSZ]; struct obj otemp; char **str1; if (!obj->dknown) return; /* probably blind */ otemp = *obj; otemp.quan = 1L; otemp.onamelth = 0; otemp.oxlth = 0; if (objects[otemp.otyp].oc_class == POTION_CLASS && otemp.fromsink) /* kludge, meaning it's sink water */ sprintf(qbuf,"Call a stream of %s fluid:", OBJ_DESCR(objects[otemp.otyp])); else sprintf(qbuf, "Call %s:", an(xname(&otemp))); getlin(qbuf, buf); if (!*buf || *buf == '\033') return; /* clear old name */ str1 = &(objects[obj->otyp].oc_uname); if (*str1) free(*str1); /* strip leading and trailing spaces; uncalls item if all spaces */ mungspaces(buf); if (!*buf) { if (*str1) { /* had name, so possibly remove from disco[] */ /* strip name first, for the update_inventory() call from undiscover_object() */ *str1 = NULL; undiscover_object(obj->otyp); } } else { *str1 = strcpy(malloc((unsigned)strlen(buf)+1), buf); discover_object(obj->otyp, FALSE, TRUE); /* possibly add to disco[] */ } }
static void docall_inner(const struct nh_cmd_arg *arg, int otyp) { const char *qbuf, *buf; char **str1; const char *ot = obj_typename(otyp); qbuf = "Call "; if (strstr(ot, " boots") || strstr(ot, " gloves")) qbuf = msgcat(qbuf, ot); else qbuf = msgcat(qbuf, an(ot)); qbuf = msgcat(qbuf, ":"); buf = getarglin(arg, qbuf); if (!*buf || *buf == '\033') return; /* clear old name */ str1 = &(objects[otyp].oc_uname); if (*str1) free(*str1); /* strip leading and trailing spaces; uncalls item if all spaces */ buf = msgmungspaces(buf); if (!*buf) { if (*str1) { /* had name, so possibly remove from disco[] */ /* strip name first, for the update_inventory() call from undiscover_object() */ *str1 = (char *)0; undiscover_object(otyp); } } else { *str1 = strcpy((char *)malloc((unsigned)strlen(buf) + 1), buf); discover_object(otyp, FALSE, TRUE, TRUE); /* possibly add to disco[] */ } }