Example #1
0
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);
}