static void store_listed( int sts, void *aux ) { MVARS(aux) string_list_t *box; switch (sts) { case DRV_CANCELED: return; case DRV_OK: mvars->ctx[t]->listed = 1; if (mvars->ctx[t]->conf->flat_delim) { for (box = mvars->ctx[t]->boxes; box; box = box->next) { if (map_name( box->string, mvars->ctx[t]->conf->flat_delim, '/' ) < 0) { error( "Error: flattened mailbox name '%s' contains canonical hierarchy delimiter\n", box->string ); mvars->ret = mvars->skip = 1; } } } if (mvars->ctx[t]->conf->map_inbox) add_string_list( &mvars->ctx[t]->boxes, mvars->ctx[t]->conf->map_inbox ); break; default: mvars->ret = mvars->skip = 1; break; } mvars->state[t] = ST_OPEN; sync_chans( mvars, E_OPEN ); }
// <var> -> empty | <type> ID <mvars> ; APTNode* VAR(void) { //HERE if ((strcmp(currentTok.sym, "INTtk") == 0) || (strcmp(currentTok.sym, "FLOATtk") == 0)) { //BUILD <TYPE> NODE APTNode* typeNode = TYPE(); if (strcmp(currentTok.sym, "IDtk") == 0) { APTNode* idNode = createIdAPTNode("<IDtk>", currentTok.selection, NULL, currentTok.line); scanner(); //BUILD <MVARS> NODE APTNode* mvarsNode = MVARS(); if (strcmp(currentTok.sym, "SEMICOLtk") == 0) { scanner(); //BUILD <VAR> NODE APTNode* varNode = createNonIdAPTNode("<VARtk>"); addChildNode(varNode, typeNode); addChildNode(varNode, idNode); addChildNode(varNode, mvarsNode); return varNode; } else errMsg("SEMICOLtk"); } else errMsg("IDtk"); } else return NULL; }
// <mvars> -> empty | , ID <mvars> APTNode* MVARS(void) { //HERE if (strcmp(currentTok.sym, "COMMAtk") == 0) { scanner(); if (strcmp(currentTok.sym, "IDtk") == 0) { //BUILD <ID> NODE APTNode* idNode = createIdAPTNode("<IDtk>", currentTok.selection, NULL, currentTok.line); scanner(); //BUILD CHILD <MVARS> NODE APTNode* childMvarsNode = MVARS(); //BUILD PARENT <MVARS> NODE APTNode* parentMvarsNode = createNonIdAPTNode("<MVARS>"); addChildNode(parentMvarsNode, idNode); addChildNode(parentMvarsNode, childMvarsNode); return parentMvarsNode; } else errMsg("IDtk"); } else return NULL; // MVARS -> empty }
static void store_bad( void *aux ) { MVARS(aux) mvars->drv[t]->cancel_store( mvars->ctx[t] ); mvars->ret = mvars->skip = 1; mvars->state[t] = ST_CLOSED; sync_chans( mvars, E_OPEN ); }
static void store_opened( store_t *ctx, void *aux ) { MVARS(aux) string_list_t *cpat; int flags; if (!ctx) { mvars->ret = mvars->skip = 1; mvars->state[t] = ST_CLOSED; sync_chans( mvars, E_OPEN ); return; } mvars->ctx[t] = ctx; if (!mvars->skip && !mvars->boxlist && mvars->chan->patterns && !ctx->listed) { for (flags = 0, cpat = mvars->chan->patterns; cpat; cpat = cpat->next) { const char *pat = cpat->string; if (*pat != '!') { /* Partial matches like "INB*" or even "*" are not considered, * except implicity when the INBOX lives under Path. */ if (!memcmp( pat, "INBOX", 5 )) { char c = pat[5]; if (!c) { /* User really wants the INBOX. */ flags |= LIST_INBOX; } else if (c == '/') { /* Flattened sub-folders of INBOX actually end up in Path. */ if (ctx->conf->flat_delim) flags |= LIST_PATH; else flags |= LIST_INBOX; } else { /* User may not want the INBOX after all ... */ flags |= LIST_PATH; /* ... but maybe he does. * The flattened sub-folder case is implicitly covered by the previous line. */ if (c == '*' || c == '%') flags |= LIST_INBOX; } } else { flags |= LIST_PATH; } } } set_bad_callback( ctx, store_bad, AUX ); mvars->drv[t]->list( ctx, flags, store_listed, AUX ); } else { mvars->state[t] = ST_OPEN; sync_chans( mvars, E_OPEN ); } }