Re: [PATCH 1/3] cli: add insert --must-index option

Subject: Re: [PATCH 1/3] cli: add insert --must-index option

Date: Thu, 24 Oct 2013 13:19:22 +0300

To: David Bremner, Austin Clements

Cc: notmuch@notmuchmail.org

From: Tomi Ollila


On Thu, Oct 24 2013, David Bremner <david@tethera.net> wrote:

> Austin Clements <amdragon@MIT.EDU> writes:
>
>> And in libnotmuch, we would do something like
>>
>> notmuch_status_t
>> notmuch_database_open (const char *path,
>>                        notmuch_database_mode_t mode,
>>                        const notmuch_options_t *options,
>>                        notmuch_database_t **database)
>> {
>>     notmuch_option_t real_options = NOTMUCH_OPTIONS_INIT;
>>     if (real_options.options_length < options.options_length)
>>         return error;
>>     memmove(&real_options, options, options.options_length);
>>     // ...
>> }
>>
>
> Does the C standard guarantee that if two structs have the same initial
> set of members, that they are aligned in a compatible way? I suppose it
> must work, but I'm still curious.

If we have structures

struct s1 { 
       long l1;
       void * vp1;
       short s1;
       int i1;
       char c1;
}

&

struct s2 { 
       long l1;
       void * vp1;
       short s1;
       int i1;
       char c1;
       char c2;
       // void * vp2;
};

The variables l1, vp1, s1, i1 & c1 have same offset from the beginning of
structure and uses same amount of space in both structures...

... now the interesting point is what is the size of the structures (does C
compiler add padding to the end (to make the size multiple of something ?)
In any case all the other data is zeroed in the structure and sizeof data
is copied to "real" structure if Austin's suggestion is used...

> Yet another approach would be to pass in array of descriptors, something
> like the command line argument parsing code does now.
>
> libnotmuch_opt_desc_t options[] = {
>   { LIBNOTMUCH_OPT_LOGHOOK, loghook },
>   { 0, 0} 
> }
>
> I guess passing a (void *) as the second element of the pair?

Voidp and only that. Then we can hack other variables using
((char *)0 + (intvar)) or GINT_TO_POINTER... -- beautiful, eh ? ;)

> Of course it's a bit more work to unpack this way.

That is negligible to the elegance loss -- and what about bindings ! >;)


Tomi

Thread: