4 * vCard implementation for Citadel/UX
6 * Copyright (C) 1999 by Art Cancro
7 * This code is freely redistributable under the terms of the GNU General
8 * Public License. All other rights reserved.
28 #include "sysdep_decls.h"
35 * Constructor (empty vCard)
37 struct vCard *new_vcard() {
40 v = (struct vCard *) mallok(sizeof(struct vCard));
41 if (v == NULL) return v;
43 v->magic = CTDL_VCARD_MAGIC;
52 * Constructor (supply serialized vCard)
54 struct vCard *load_vcard(char *vtext) {
58 char *namebuf, *valuebuf;
62 mycopy = strdoop(vtext);
63 if (mycopy == NULL) return NULL;
65 /* First, fix this big pile o' vCard to make it more parseable.
66 * To make it easier to parse, we convert CRLF to LF, and unfold any
67 * multi-line fields into single lines.
69 for (i=0; i<strlen(mycopy); ++i) {
70 if (!strncmp(&mycopy[i], "\r\n", 2)) {
71 strcpy(&mycopy[i], &mycopy[i+1]);
73 if ( (mycopy[i]=='\n') && (isspace(mycopy[i+1])) ) {
74 strcpy(&mycopy[i], &mycopy[i+1]);
79 if (v == NULL) return v;
82 while (strlen(ptr)>0) {
85 colonpos = pattern2(ptr, ":");
86 nlpos = pattern2(ptr, "\n");
88 if (nlpos > colonpos > 0) {
89 namebuf = mallok(colonpos + 1);
90 valuebuf = mallok(nlpos - colonpos + 1);
91 strncpy(namebuf, ptr, colonpos);
92 namebuf[colonpos] = 0;
93 strncpy(valuebuf, &ptr[colonpos+1], nlpos-colonpos-1);
94 valuebuf[nlpos-colonpos-1] = 0;
96 if ( (!strcasecmp(namebuf, "begin"))
97 && (!strcasecmp(valuebuf, "vcard")) ) valid = 1;
98 if ( (!strcasecmp(namebuf, "end"))
99 && (!strcasecmp(valuebuf, "vcard")) ) valid = 0;
103 v->prop = reallok(v->prop,
104 (v->numprops * sizeof(char *) * 2) );
105 v->prop[v->numprops-1].name = namebuf;
106 v->prop[v->numprops-1].value = valuebuf;
115 while ( (*ptr != '\n') && (strlen(ptr)>0) ) {
118 if (*ptr == '\n') ++ptr;
130 void free_vcard(struct vCard *v) {
133 if (v->magic != CTDL_VCARD_MAGIC) return; /* Self-check */
135 if (v->numprops) for (i=0; i<(v->numprops); ++i) {
136 phree(v->prop[i].name);
137 phree(v->prop[i].value);
140 if (v->prop != NULL) phree(v->prop);
142 memset(v, 0, sizeof(struct vCard));