ref: 071b196a37e0e88ee005c68f84d90753d2a98a5b
parent: b6856322e21e458c9dcc4adf475c39604704b827
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Oct 21 11:30:39 EDT 2024
get rid of special version and property handling. this should make it possible to use different vcard versions, however it also means that the user/application is responsible for validating the vcard data.
--- a/libvcard/vcard.c
+++ b/libvcard/vcard.c
@@ -203,7 +203,6 @@
}
cs = smprint(
"BEGIN:VCARD\r\n"
- "VERSION:4.0\r\n"
"%s"
"END:VCARD\r\n",
ls);
--- a/libvcard/vcard.h
+++ b/libvcard/vcard.h
@@ -27,6 +27,7 @@
char *s;
int invalue;
int inquote;
+ int haspropname;
};
extern Vstate vcstate;
--- a/libvcard/vcard.y
+++ b/libvcard/vcard.y
@@ -92,12 +92,8 @@
%token <i> BEGIN END CRLF
%token <s> WORD SWORD FWORD
-%token <s> SOURCE KIND FN N NICKNAME PHOTO BDAY ANNIVERSARY GENDER
-%token <s> ADR TEL EMAIL IMPP LANG TZ GEO TITLE ROLE LOGO ORG MEMBER
-%token <s> RELATED CATEGORIES NOTE PRODID REV SOUND UID CLIENTPIDMAP
-%token <s> URL KEY FBURL CALADRURI CALURI XML
+%token <s> PROPNAME
-%type <s> iana-token x-name
%type <s> pvalue
%type <vc> vclist vcard
@@ -143,47 +139,6 @@
;
group: SWORD;
-name:
- SOURCE
- | KIND
- | FN
- | N
- | NICKNAME
- | PHOTO
- | BDAY
- | ANNIVERSARY
- | GENDER
- | ADR
- | TEL
- | IMPP
- | LANG
- | TZ
- | GEO
- | TITLE
- | ROLE
- | LOGO
- | ORG
- | MEMBER
- | RELATED
- | CATEGORIES
- | NOTE
- | PRODID
- | REV
- | SOUND
- | UID
- | CLIENTPIDMAP
- | URL
- | KEY
- | FBURL
- | CALADRURI
- | CALURI
- | XML
- | iana-token
- | x-name
- ;
-
-iana-token: SWORD;
-x-name: 'x' '-' SWORD { $$ = xname($3); };+name: PROPNAME;
value: WORD | SWORD | FWORD;
--- a/libvcard/vlex.c
+++ b/libvcard/vlex.c
@@ -16,72 +16,14 @@
char *vcparsestr;
Vstate vcstate;
-typedef struct Vcname Vcname;
-struct Vcname {- char *str;
- int token;
-};
+static char beginstr[] = "begin:vcard\r\n";
+static char endstr[] = "end:vcard";
-static char beginstr[] = "begin:vcard\r\nversion:4.0\r\n";
-
-Vcname vcnames[] = {- { "end:vcard", END },- /* fields */
- { "kind", KIND },- { "fn", FN },- { "n", N },- { "nickname", NICKNAME },- { "photo", PHOTO },- { "bday", BDAY },- { "anniversary", ANNIVERSARY },- { "gender", GENDER },- { "adr", ADR },- { "tel", TEL },- { "email", EMAIL },- { "impp", IMPP },- { "lang", LANG },- { "tz", TZ },- { "geo", GEO },- { "title", TITLE },- { "role", ROLE },- { "logo", LOGO },- { "org", ORG },- { "member", MEMBER },- { "related", RELATED },- { "categories", CATEGORIES },- { "note", NOTE },- { "prodid", PRODID },- { "rev", REV },- { "sound", SOUND },- { "uid", UID },- { "clientpidmap", CLIENTPIDMAP },- { "url", URL },- { "key", KEY },- { "fburl", FBURL },- { "caladruri", CALADRURI },- { "caluri", CALURI },- { "xml", XML },- /* params */
- { "language", SWORD },- { "value", SWORD },- { "pref", SWORD },- { "altid", SWORD },- { "pid", SWORD },- { "type", SWORD },- { "mediatype", SWORD },- { "calscale", SWORD },- { "sort-as", SWORD },- { "geo", SWORD },- { "tz", SWORD }, /* TODO: it's a duplicate! make state-dependent */- { nil, 0 }-};
-
static char verbchars[] = ":;\"=";
int
yylex(void)
{- Vcname *nm;
int n;
char *s, *t;
@@ -110,6 +52,7 @@
memcpy(yylval.s, vcstate.s, s - vcstate.s);
vcstate.s = s;
vcstate.invalue = 0;
+ vcstate.haspropname = 0;
return FWORD;
}
@@ -149,6 +92,10 @@
/* newline */
if (cistrncmp(vcstate.s, "\r\n", 2) == 0) {vcstate.s += 2;
+ /* collapse multiple crlf sequences */
+ while (cistrncmp(vcstate.s, "\r\n", 2) == 0) {+ vcstate.s += 2;
+ }
return CRLF;
}
@@ -159,16 +106,23 @@
return BEGIN;
}
- /* reserved keywords */
- for (nm = vcnames; nm->str; nm++) {- n = strlen(nm->str);
- if (cistrncmp(vcstate.s, nm->str, n) == 0) {- yylval.s = mallocz(n+1, 1);
- memcpy(yylval.s, vcstate.s, n);
- iltolower(yylval.s);
- vcstate.s += n;
- return nm->token;
- }
+ /* end block */
+ n = strlen(endstr);
+ if (cistrncmp(vcstate.s, endstr, n) == 0) {+ vcstate.s += n;
+ return END;
+ }
+
+ if (!vcstate.haspropname) {+ s = strchr(vcstate.s, ':');
+ t = strchr(vcstate.s, ';');
+ s = s < t ? s : t;
+ n = s - vcstate.s;
+ yylval.s = mallocz(n + 1, 1);
+ memcpy(yylval.s, vcstate.s, n);
+ vcstate.s += n;
+ vcstate.haspropname++;
+ return PROPNAME;
}
/* assume SWORD string (unquoted param value) */
--
⑨