Re: Long long int's and sprintf

From: Mike Stilson (mike@c746148-a.ehlls1.pa.home.com)
Date: 06/16/01


On Sat, Jun 16, 2001 at 11:40:30AM -0400, Cris Jacobin came up with this idea:
>> Daniel A. Koepke wrote...
>> since you're providing an unsigned value for a signed conversion.  What
>> compiler are you using?  Are all the warnings turned on?

side note: I didn't get them with gcc 2.95.2 complaining about the
signedness of %Lu or %Ld that I can remember, although I did get the
errors at comparisons on a few scattered lines.  Did that switch long
time ago though so I might be forgetting too.

>   One other thing for the archives, in case anyone decides to take this
> route.  It's actually fairly easy to implement.  Took me around a half
> hour from start to finish.  The trick is, if you only want affects don't

Even with roomflags it's not too horrific.

> make everything a wide bitvector.  There was no need to play with
> roomflags and such, which eliminated the need to play around with the
> ascii conversion  routines.


tested, retested, beat on, fed bogus data, you name it; it works fine.
(suppose I coulda used digits too, just didn't)

void sprintbits(bitvector_t vektor, char *outstring)
{
        int i;
        char flags[] =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#$%&'()*+,-.";

        strcpy(outstring, "");
        for (i = 0; i < 64; i++) {
                if (vektor & 1) {
                        *outstring = flags[i];
                        outstring++;
                };
                vektor >>= 1;
        };

        *outstring = 0;
};


bitvector_t asciiflag_conv(char *flag)
{
        bitvector_t flags = 0;
        int is_number = 1;
        register char *p;

        for (p = flag; *p; p++) {
                if (islower(*p))
                        flags |= 1 << (*p - 'a');
                else if (isupper(*p))
                        flags |= 1 << (26 + (*p - 'A'));
                else if (ispunct(*p))
                        flags |= 1 << (52 + (*p - '#'));

                if (!isdigit(*p))
                        is_number = 0;
        }

        if (is_number)
                sscanf(flag, "%Lu", &flags);
        /* I prefer that method to strtoul, suppose it could work though,
         * but I did have problems with it a few other places.
         * Since I control the input to it, format isn't a problem.
         */
        //flags = strtoul(flag);

        return (flags);
}

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/05/01 PST