Creates a new mail
static VALUE mails_s_new(klass, str, ident, cmt) VALUE klass, str, ident, cmt; { struct scanner *sc; const char *tmp; sc = ALLOC_N(struct scanner, 1); StringValue(str); sc->pbeg = RSTRING_PTR(str); sc->p = sc->pbeg; sc->pend = sc->p + RSTRING_LEN(str); sc->flags = 0; Check_Type(ident, T_SYMBOL); tmp = rb_id2name(SYM2ID(ident)); if (strcmp(tmp, "RECEIVED") == 0) sc->flags |= MODE_RECV; else if (strcmp(tmp, "CTYPE") == 0) sc->flags |= MODE_MIME; else if (strcmp(tmp, "CENCODING") == 0) sc->flags |= MODE_MIME; else if (strcmp(tmp, "CDISPOSITION") == 0) sc->flags |= MODE_MIME; tmp = rb_get_kcode(); if (strcmp(tmp, "EUC") == 0 || strcmp(tmp, "SJIS") == 0) { sc->flags |= MODE_ISO2022; } sc->comments = Qnil; if (! NIL_P(cmt)) { Check_Type(cmt, T_ARRAY); sc->comments = cmt; } return Data_Wrap_Struct(TMailScanner, 0, mails_free, sc); }
TODO: Documentation needed
static VALUE mails_debug_get(self) VALUE self; { struct scanner *sc; GET_SCANNER(self, sc); if (sc->flags & MODE_DEBUG) return Qtrue; else return Qfalse; }
TODO: Documentation needed
static VALUE mails_debug_set(self, flag) VALUE self, flag; { struct scanner *sc; GET_SCANNER(self, sc); if (RTEST(flag)) sc->flags |= MODE_DEBUG; else sc->flags &= ~MODE_DEBUG; return Qnil; }
TODO: Documentation needed
static VALUE mails_scan(self) VALUE self; { struct scanner *sc; VALUE arr; #define PASS(s,v) pass_token(sc,s,v,arr) GET_SCANNER(self, sc); if (!sc->p) { rb_raise(ScanError, "Mails#scan called before reset"); } arr = rb_assoc_new(Qnil, Qnil); while (sc->p < sc->pend) { D(puts("new loop")); D(printf("char='%c'\n", *sc->p)); if (IS_LWSP(*sc->p)) { D(puts("lwsp")); skip_lwsp(sc); if (sc->p >= sc->pend) break; } if (MIME_MODE_P(sc)) { if (IS_TOKENCHAR(*sc->p) || (ISO2022_MODE_P(sc) && (*sc->p == ESC)) || IS_JCHAR(*sc->p)) { D(puts("token")); PASS(tok_token, scan_token(sc)); continue; } } else { if (IS_ATOMCHAR(*sc->p) || (ISO2022_MODE_P(sc) && (*sc->p == ESC)) || IS_JCHAR(*sc->p)) { VALUE tmp; D(puts("atom")); tmp = scan_atom(sc); PASS(atomsym(sc, tmp), tmp); continue; } } if (*sc->p == '"') { D(puts("quoted")); PASS(tok_quoted, scan_quoted_word(sc)); D(puts("quoted")); } else if (*sc->p == '(') { VALUE c; D(puts("comment")); c = scan_comment(sc); if (! NIL_P(sc->comments)) rb_ary_push(sc->comments, c); } else if (*sc->p == '[') { D(puts("domlit")); PASS(tok_domlit, scan_domain_literal(sc)); } else { VALUE ch; D(puts("char")); ch = rb_str_new(sc->p, 1); sc->p++; PASS(ch, ch); } } PASS(Qfalse, rb_str_new("$", 1)); return Qnil; }
Generated with the Darkfish Rdoc Generator 2.