[GRASS-dev] adding units and vertical datum metadata to raster maps

Paul Kelly paul-grass at stjohnspoint.co.uk
Wed May 9 08:03:30 EDT 2007

Hello Hamish

On Wed, 9 May 2007, Hamish wrote:

> (wish #392)
> Hi,
> I have hacked together the attached code to add units and vertical datum
> metadata to raster maps. It still needs some cleanup before going into
> CVS, but right now I am interested in comments on the approach taken.
> [it works]

I remember Helena saying something about wanting a module to be able to 
check what units an input raster map was in, so it could warn the user if 
there was a subtle error. But if the units are totally free-form then this 
is likely to be unreliable. I'm wondering if there is some kind of 
standard for specifying units in an ASCII text string, and if we should 
investigate this and add wrapper functions to these new functions that try 
to ensure the units are in a prescribed format where possible. Of course 
people could still put anything in using your functions directly, if they 
had special requirements. But perhaps the modules Helena identified as 
having a serious need for storing and checking units should have some 
higher level functions to do that for them?

> TODO: buffer overflow checking
> TODO: create a fn in r.info to take care of G_asprint() work, right now
> the "fancy output" section of the module is an ugly mess.
> [non-functional code, due to me being lost WRT passing pointers]

G_asprintf() takes a pointer to a pointer for the first argument, and the 
compose_line() function takes a pointer for the first argument. But below 
compose_line is being passed a pointer to a pointer (& operator used on
something that was already a pointer) and G_asprintf() is only being 
passed a pointer. I think changing it so "line" is passed to compose_line 
and "&line" to G_asprintf would work.

> /*
>        if (G_asprintf(&line, "Location: %s", G_location()) > 0)
>            printline(line);
>        else
>            G_fatal_error(_("Cannot allocate memory for string"));
> */
>        compose_line( &line, "Location: %s", G_location() );
>        printline(line);
> ....
> void compose_line(char *line, const char *fmt, ...)
> {
>    va_list ap;
>    line = NULL;
>    va_start(ap, fmt);
>    if( G_asprintf(line, fmt, ap) <= 0 )
>        G_fatal_error(_("Cannot allocate memory for string"));
>    va_end(ap);
> }
> Hamish

More information about the grass-dev mailing list