Exemple #1
0
/* 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;
}
Exemple #2
0
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;
}