>>>>> Glynn Clements <[EMAIL PROTECTED]> writes:

[...]

 >> Is a new D_number_to_RGB(int color, unsigned char &r,&g,&b) fn
 >> needed in lib/display/tran_colr.c?

 > Yes. E.g.:

 > int D_color_number_to_RGB(int color, int &r, int &g, int &b)
 > {

        That looks a lot like C++.  Surely it will work with C89?

 >     const struct color_rgb *c;

 >     if (color <= 0)
 >         return 0;

        BTW, is it a GRASS convention to use 0 to indicate failure?
        Standard C library functions tend to use -1 for failure, while
        using non-negative values to indicate success.

        Also, it seems feasible to set `errno' in the library functions
        like this.  Do I understand correctly that it isn't done (with
        any regularity) in GRASS?

 >     if (color >= ncolors)
 >         return 0;

 >     c = &colors[color];
 >     r = c->r;
 >     g = c->g;
 >     b = c->b;

 >     return 1;
 > }

[...]

        I'd suggest the following, but I don't know (yet) the
        appropriate conventions for the D_* functions.

int
D_color_number_to_RGB (int color, int *r, int *g, int *b)
{
    const struct color_rgb *c;

    if (color <= 0 || color >= ncolors) {
        errno = EINVAL;
        return -1;
    }

    c = &colors[color];
    if (r != 0) *r = c->r;
    if (g != 0) *g = c->g;
    if (b != 0) *b = c->b;

    return 0;
}

        With the `if (X != 0)' guards, the function may be used to query
        whether the given color index exists, while not asking for its
        components to be returned, like:

   if (D_color_number_to_RGB (INDEX, 0, 0, 0) < 0) {
       /* color INDEX doesn't exist */
   }

        If `struct color_rgb' is a ``public'' data type, then it might
        be appropriate to code this function as:

int
D_color_number_to_RGB (int color, struct color_rgb *components)
{
    ...
}

        instead, and use a guarded `memmove' to copy `colors[color]' to
        `*components'.

_______________________________________________
grass-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to