[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: rm=5mm in gattrib



Hi Stuart and Karel,


[snip]
>Libgeda handles attributes in the following way.  An attribute is a
>text string of form "foo=bar", stored as a single entity in the linked
>list of graphical objects which represent your schematic.   In this

	I tried entering "package=ceramic 50V, rm=5mm" and it worked
fine in gschem.


>case, "foo" is the attribute name, and "bar" is the attribute value.
>An attribute is not different from ordinary annotation text, except
>that it has the "=" sign separating the attribute name from the
>attribute value.  The "=" sign is what distinguishes an attribute from
>normal text. 

	Mostly agree with the above, except that it only applies to
the first = in a text string.  After the first =, the value of the
attribute can be literally anything, including an infinite number of ='s.
Unfortunately the current file format document does not spell this
out explicitly.  The master attribute doc does say something a little
bit more:

http://geda.seul.org/wiki/geda:master_attributes_list#what_are_attributes

	Attributes in the gEDA/gaf system are nothing more than text
	items which take on the form: name=value. Name can be anything
	just as long as it doesnt contain a equals sign. Value can also
	be anything just as long as it is something (vs nothing). name=
	(without a value part) is not a valid attribute. Also, there
	cannot be any spaces immediately before or after the equals sign.

I will update these documents to explicitly cover the case where you have
name=blah   where blah can be value, name2=value2  and so on.  

[snip]
>it finds an attribute (or a string) with an unexpected number of "="
>signs in it.  In your case, it found the second "=" sign, and dropped
>it and everything after it when it stored the result.
>

	I think this is a bug in gattrib unfortunately. :-(

Instead of using:

	 u_basic_breakup_string(string, '=', 0)
or 
	 u_basic_breakup_string(string, '=', 1)

to break up name=value attributes, gattrib should be using:

	char *name = NULL;
  	char *value = NULL;
	int status;


	status = o_attrib_get_name_value(string, &name, &value);
	if (status == 0)
	{
		/* ... do useful work with name and value ... */
	}
	else
	{
		/* invalid attribute */
	}
	if (name) free (name);
	if (value) free (value);

to break up attributes into name/value pairs.  Obviously this is not 
easy to find in libgeda (that's my fault and my responsibility), but it
is the official way of doing the parsing.

Do you want me to file a bug on this Stuart?  All questions to me.
Thanks.

				-Ales