VObject* addGroup(VObject *o, const char *g) { /* a.b.c --> prop(c) prop(VCGrouping=b) prop(VCGrouping=a) */ char *dot = strrchr(g,'.'); if (dot) { VObject *p, *t; char *gs, *n = dot+1; gs = dupStr(g,0); /* so we can write to it. */ /* used to be * t = p = addProp_(o,lookupProp_(n)); */ t = p = addProp_(o,lookupProp(n)); dot = strrchr(gs,'.'); if (dot) { *dot = 0; do { dot = strrchr(gs,'.'); if (dot) { n = dot+1; *dot=0; } else n = gs; /* property(VCGroupingProp=n); * and the value may have VCGrouping property */ t = addProp(t,VCGroupingProp); setVObjectStringZValue(t,lookupProp_(n)); } while (n != gs); } else { t = addProp(t,VCGroupingProp); setVObjectStringZValue(t,lookupProp_(n)); } deleteStr(gs); return p; } else return addProp_(o,lookupProp(g)); }
static void enterAttr(const char *s1, const char *s2) { const char *p1, *p2 = nullptr; p1 = lookupProp_(s1); if (s2) { VObject *a; p2 = lookupProp_(s2); a = addProp(curProp, p1); setVObjectStringZValue(a, p2); } else addProp(curProp, p1); if (PL_strcasecmp(p1, VCBase64Prop) == 0 || (s2 && PL_strcasecmp(p2, VCBase64Prop) == 0)) lexPushMode(L_BASE64); else if (PL_strcasecmp(p1, VCQuotedPrintableProp) == 0 || (s2 && PL_strcasecmp(p2, VCQuotedPrintableProp) == 0)) lexPushMode(L_QUOTED_PRINTABLE); deleteString((char *)s1); deleteString((char *)s2); }