Better document the file format, add in support for nested {}'s in multi-line

property values.
This commit is contained in:
Jordan K. Hubbard 1998-11-22 13:20:09 +00:00
parent 570f565d11
commit efbcb4ae03
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=41291
2 changed files with 28 additions and 8 deletions

View File

@ -23,7 +23,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $Id: property.3,v 1.2 1998/10/09 07:33:58 jkh Exp $
.\" $Id: property.3,v 1.3 1998/10/14 11:04:36 jkh Exp $
.\" "
.Dd October 7, 1998
.Os
@ -65,9 +65,7 @@ pairs from the file descriptor passed in
.Fa fd
and returns the head of a new property list, assuming that the
file's contents have been parsed properly, or NULL in case
of error. The property list pointer should be passed to
.Fn properties_free
when no longer needed.
of error.
.Pp
.Fn property_find
Returns the associated value string for the property named
@ -78,7 +76,22 @@ if found, otherwise NULL.
is used to free the structure returned by
.Fn properties_read
when it is no longer needed.
.Pp
.Sh FILE FORMAT
Each property in the file is assumed to have the format of
.Fa name = value
where
.Fa name
is an alphanumeric string (and any punctuation not including the `=' character)
and
.Fa value
is an arbitary string of text terminated by a newline character. If newlines
are desired, the entire value should be enclosed in { } (curly-bracket)
characters. Any line beginning with a # or ; character is assumed to
be a comment and will be ignored.
.Sh SEE ALSO
.Xr auth_getval 3
.Sh BUGS
Simplistic.
.Sh AUTHOR
Jordan Hubbard

View File

@ -35,6 +35,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <err.h>
#include <sys/types.h>
#include <libutil.h>
@ -62,7 +63,7 @@ properties_read(int fd)
char buf[BUFSIZ * 4];
int bp, n, v, max;
enum { LOOK, COMMENT, NAME, VALUE, MVALUE, COMMIT, FILL, STOP } state;
int ch = 0;
int ch = 0, blevel = 0;
n = v = bp = max = 0;
head = ptr = NULL;
@ -135,8 +136,10 @@ properties_read(int fd)
case VALUE:
if (v == 0 && isspace(ch))
continue;
else if (ch == '{')
else if (ch == '{') {
state = MVALUE;
++blevel;
}
else if (ch == '\n' || !ch) {
hold_v[v] = '\0';
v = n = 0;
@ -156,16 +159,20 @@ properties_read(int fd)
case MVALUE:
/* multiline value */
if (v >= MAX_VALUE) {
warn("properties_read: value exceeds max length");
state = COMMENT;
n = v = 0;
}
else if (ch == '}') {
else if (ch == '}' && !--blevel) {
hold_v[v] = '\0';
v = n = 0;
state = COMMIT;
}
else
else {
hold_v[v++] = ch;
if (ch == '{')
++blevel;
}
break;
case COMMIT: