/* supported formats: %%, %d, %u, %x, %p, %s, %c * TODO: * - return number of bytes copied into 'str' */ int kvsprintf(char *str, const char *fmt, va_list ap) { char *ptr, *stmp; unsigned utmp; int itmp; char ctmp; for (; *fmt; fmt = ptr + 2) { ptr = kstrchr(fmt, '%'); if (ptr == NULL) { kstrcpy(str, fmt); return 1; } str += kstrncpy(str, fmt, (int)ptr - (int)fmt); switch (*(ptr + 1)) { case 'd': /* signed int */ itmp = va_arg(ap, int); str = sitoa(str, itmp); break; case 'u': /* unsigned int */ utmp = va_arg(ap, unsigned); str = uitoa(str, utmp); break; case 'p': /* pointer */ *str++ = '0'; *str++ = 'x'; case 'x': /* hex */ utmp = va_arg(ap, unsigned); str = htoa(str, utmp); break; case 's': /* string */ stmp = va_arg(ap, char *); str += kstrcpy(str, stmp); break; case '%': *str++ = '%'; break; case 'c': ctmp = va_arg(ap, int); *str++ = ctmp; break; default: /* unsupported format */ break; } } return 1; }
char *doname(struct obj *obj) { char prefix[PREFIX]; char *bp = xname(obj); if(obj->quan != 1) { sprintf(prefix, "%d ", obj->quan); } else { strcpy(prefix, "a "); } switch(obj->olet) { case AMULET_SYM: if(strncmp(bp, "cheap ", 6) != 0) { strcpy(prefix, "the "); } break; case ARMOR_SYM: if((obj->owornmask & W_ARMOR) != 0) { strcat(bp, " (being worn)"); } if(obj->known != 0) { strcat(prefix, sitoa((obj->spe - 10) + objects[obj->otyp].a_ac)); strcat(prefix, " "); } break; case WEAPON_SYM: if(obj->known != 0) { strcat(prefix, sitoa(obj->spe)); strcat(prefix, " "); } break; case WAND_SYM: if(obj->known) { sprintf(eos(bp), " (%d)", obj->spe); } break; case RING_SYM: if((obj->owornmask & W_RINGR) != 0) { strcat(bp, " (on right hand)"); } if((obj->owornmask & W_RINGL) != 0) { strcat(bp, " (on left hand)"); } if((obj->known != 0) && ((objects[obj->otyp].bits & SPEC) != 0)) { strcat(prefix, sitoa(obj->spe)); strcat(prefix, " "); } break; } if((obj->owornmask & W_WEP) != 0) { strcat(bp, " (weapon in hand)"); } if(obj->unpaid != 0) { strcat(bp, " (unpaid)"); } if((strcmp(prefix, "a ") == 0) && (index(vowels, *bp) != 0)) { strcpy(prefix, "an "); } bp = strprepend(bp, prefix); return bp; }