lurker-2.3/0000777000175000017500000000000011272633210007664 500000000000000lurker-2.3/index/0000777000175000017500000000000011272633207011001 500000000000000lurker-2.3/index/main.cpp0000644000175000017500000004151111267074431012351 00000000000000/* $Id: main.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * main.cpp - Read the fed data into our database * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Index.h" #include #include #include "config.h" #ifdef HAVE_SYSEXITS_H #include #define LEX_USAGE EX_USAGE #define LEX_IOERR EX_IOERR #define LEX_DATAERR EX_DATAERR #else #define LEX_USAGE 1 #define LEX_IOERR 2 #define LEX_DATAERR 3 #endif // Our friendly neighbourhood date parser (getdate.y / getdate.cpp) time_t get_date (const char *p, const time_t *now); using namespace std; auto_ptr db; set blacklist; string append; List* list = 0; int mbox = -1; off_t length = 0; time_t start; long messagecount = 0; off_t processedbytes = 0; const long batch = 10; bool ismbox = true; bool verbose = false; bool dropdup = false; bool synced = true; bool compressmail = true; bool userdate = false; void help(const char* name) { cerr << "Lurker-index (v" << VERSION << ") imports messages into the archive.\n"; cerr << "\n"; cerr << "Usage: " << name << " -l [-c ]\n"; cerr << " [-m -i -v -d -n -u -f]\n"; cerr << "\n"; cerr << "\t-l Import messages to the named list\n"; cerr << "\t-c Use this config file for lurker settings\n"; cerr << "\t-m Input is a single message (not a mailbox)\n"; cerr << "\t-i Read input from mbox or maildir instead of std input\n"; cerr << "\t-p Prevent deleted messages in DB history from importing\n"; cerr << "\t-v Verbose operation\n"; cerr << "\t-d Drop duplicates per list\n"; cerr << "\t-n Don't compress messages\n"; cerr << "\t-u Trust the user Date header more than arrival time\n"; cerr << "\t-f Fast import (but vulnerable to power-failure)\n"; cerr << "\n"; cerr << "Index messages and store them in the lurker database.\n"; cerr << "\n"; } int commit() { unsigned long done = 0; while (done < append.length()) { long did = write(mbox, append.c_str()+done, append.length()-done); if (did <= 0) { perror("write"); ftruncate(mbox, length); cerr << "Mbox write failed; aborting..." << endl; return -1; } done += did; } if (db->commit() != 0) { perror("commit"); ftruncate(mbox, length); cerr << "Commit failed; aborting..." << endl; return -1; } length += append.length(); append = ""; return 0; } void look_for_from(DwEntity& e) { if (e.Headers().HasContentTransferEncoding() && e.Headers().ContentTransferEncoding().AsEnum() == DwMime::kCteBase64) return; // base64 is already fine const DwString& body = e.Body().AsString(); if (body.substr(0, 5) != "From " && body.find("\nFrom ") == DwString::npos) return; // no From to kill if (e.Headers().HasContentTransferEncoding() && e.Headers().ContentTransferEncoding().AsEnum() == DwMime::kCteQuotedPrintable) { // the thing already is quoted-printable encoded // we will try to minimize the changes DwString newbody; size_t s, x; if (body.substr(0, 5) == "From ") { newbody = "=46rom "; s = 5; } else { s = 0; } while ((x = body.find("\nFrom ", s)) != string::npos) { newbody.append(body, s, x-s); newbody += "\n=46"; s = x + 2; } newbody.append(body, s, body.length() - s); e.Body().FromString(newbody); } else { // We have to kill the 'From '. // Let's just make it quoted-printable. // This will preserve the content (no '>From'). DwString coded; e.Headers().ContentTransferEncoding().FromEnum(DwMime::kCteQuotedPrintable); DwEncodeQuotedPrintable(body, coded); e.Body().FromString(coded); } } void recursively_kill_from(DwEntity& e) { // if (e.hasHeaders() && if (e.Headers().HasContentType()) { DwMediaType& t = e.Headers().ContentType(); switch (t.Type()) { case DwMime::kTypeMessage: if (e.Body().Message()) recursively_kill_from(*e.Body().Message()); break; case DwMime::kTypeMultipart: // index all alternatives in multipart for (DwBodyPart* p = e.Body().FirstBodyPart(); p != 0; p = p->Next()) recursively_kill_from(*p); break; default: look_for_from(e); break; } } else { look_for_from(e); } } int index(DwString& msg, time_t arrival) { // cout << msg.c_str() << endl; if (++messagecount % batch == 0) { if (commit() != 0) return -1; } DwMessage message(msg); message.Parse(); recursively_kill_from(message); message.Assemble(); msg = message.AsString(); // does not copy b/c the str is ref counted off_t start = length + append.length(); string::size_type unwind = append.length(); time_t import = time(0); char prefix[100]; const char* d = msg.c_str(); /* Prefer 'From ' line even for maildir */ if (d[0] == 'F' && d[1] == 'r' && d[2] == 'o' && d[3] == 'm' && d[4] == ' ') { while (*d && *d != ' ' && *d != '\t') ++d; while (*d && (*d == ' ' || *d == '\t')) ++d; while (*d && *d != ' ' && *d != '\t') ++d; while (*d && (*d == ' ' || *d == '\t')) ++d; const char* e; for (e = d; *e; ++e) if (*e == '\r' || *e == '\n') break; string date(d, long(e)-long(d)); arrival = get_date(date.c_str(), &import); prefix[0] = 0; } else { /* We may have an arrival timestamp from maildir mtime * otherwise, just use the current time (assume delivery) */ if (arrival == 0) arrival = import; /** Make a local-timezone timestamp for the message envelope. */ strftime(prefix, sizeof(prefix), "From lurker-index@localhost %a %b %2d %02H:%02M:%02S %Y\r\n", localtime(&arrival)); } // Err, messages from the future? I don't think so. if (arrival > import) arrival = import; if (compressmail) { // Write out a gzip header field append.append(string( "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x0c", 10)); // Compress the data (can't use zlib's compress b/c need -WBITS) char buf[4096]; z_stream stream; int err; stream.next_in = (unsigned char*)&prefix[0]; stream.avail_in = strlen(&prefix[0]); stream.next_out = (unsigned char*)buf; stream.avail_out = sizeof(buf); stream.zalloc = 0; stream.zfree = 0; stream.opaque = 0; // -MAX_WBITS is an undocumented feature needed to omit header err = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); do { assert (err == Z_OK); if (stream.avail_out == 0) { append.append(buf, sizeof(buf)); stream.next_out = (unsigned char*)buf; stream.avail_out = sizeof(buf); } err = deflate(&stream, Z_NO_FLUSH); } while (stream.avail_in != 0); // comprses the real body stream.next_in = (unsigned char*)msg.c_str(); stream.avail_in = msg.length(); err = Z_OK; do { assert (err == Z_OK); if (stream.avail_out == 0) { append.append(buf, sizeof(buf)); stream.next_out = (unsigned char*)buf; stream.avail_out = sizeof(buf); } err = deflate(&stream, Z_FINISH); } while (err != Z_STREAM_END); err = deflateEnd(&stream); assert (err == Z_OK); append.append(buf, sizeof(buf) - stream.avail_out); // Write out the annoying gzip tail field unsigned long crc = crc32(0, Z_NULL, 0); crc = crc32(crc, (unsigned char*)prefix, strlen(prefix)); crc = crc32(crc, (unsigned char*)msg.c_str(), msg.length()); int n; for (n = 0; n < 4; ++n) { append += ((char)(crc & 0xFF)); crc >>= 8; } unsigned long len = msg.length() + strlen(prefix); for (n = 0; n < 4; ++n) { append += ((char)(len & 0xFF)); len >>= 8; } } else { append.append(prefix); append.append(msg.c_str(), msg.length()); } Index i(message, db.get(), *list, blacklist, start, msg.length() + strlen(prefix)); bool exist; if (i.index(userdate, arrival, import, dropdup, exist) != 0) { cerr << "Import failed; aborting..." << endl; return -1; } if (exist) { // already indexed -> don't append it append.resize(unwind); } return 0; } void status() { time_t amt = time(0) - start; if (amt == 0) amt = 1; cout << "Imported " << messagecount << " messages (" << (processedbytes/(1024*1024)) << "MB)" << " at " << (messagecount / amt) << " messages (" << (processedbytes/(1024*amt)) << "KB) / second" << endl; } string::size_type find_message_boundary(const string& str, string::size_type o) { while ((o = str.find("\nFrom ", o)) != string::npos) { // We have a potential message break. // Our philosophy is: only reject it if it seems to be REALLY // broken; default to believing message breaks. If we ever // choose to ignore a break, given a warning. (after all the // mailbox is corrupt) ++o; // step onto the 'From ' string::size_type eol = str.find('\n', o); // we have not buffered the end of line? then believe that // it is a real break; this is only a heuristic if (eol == string::npos) return o; string header(str, o, eol - o); // A real message break will look like: // From // If either 'addr' is an email address or 'date' a date // then we decide it is a valid message break. Only if // both are broken do we reject it. const char* d = header.c_str()+4; // skip whitespace while (*d && (*d == ' ' || *d == '\t')) ++d; bool email = false; // we should be on an email address. // if there is an '@' sign then this must be ok while (*d && *d != ' ' && *d != '\t') { if (*d == '\"') { /* quoted email address - nasty! */ ++d; while (*d != '\"') { if (*d == '\\') ++d; if (!*d) break; ++d; } if (!*d) break; } if (*d == '@') email = true; ++d; } // skip whitespace while (*d && (*d == ' ' || *d == '\t')) ++d; time_t now = 9999999; // don't care - just no syscall time_t arrival = get_date(d, &now); bool date = (arrival != (time_t)-1 && arrival != 0); // it sounds like this is probably a message break if (*d && (date || email)) return o; // well, we gave it the benefit of the doubt, but ... // this just don't look like a message break cerr << "warning: treating '" << xmlEscape << header << "' (string is xml escaped) as part of a message because it does not have an @ in the username or a valid date." << endl; // implicitly continue the loop } return o; } /* If a maildir, arrival is != 0 and is the delivery time for one message. */ int process_mail(FILE* file, time_t arrival) { string buf; char sect[8192]; while (1) { int got = fread(sect, 1, sizeof(sect), file); processedbytes += got; string::size_type was = buf.length(); buf.append(sect, got); if (was >= 6) was -= 6; else was = 0; string::size_type eos; /* Look for message boundaries only if: * We are importing from an mbox (not single, not maildir) */ while (ismbox && (eos = find_message_boundary(buf, was)) != string::npos) { DwString msg(buf.c_str(), eos); buf = buf.substr(eos, string::npos); if (msg[0] == 'F') // strlen > 1 b/c of linefeed prior to From { // ignore potential leading blanks if (index(msg, arrival) != 0) return 1; was = 0; if (verbose && messagecount % 1000 == 0) status(); } } if (got == 0) { /* Don't index the empty string! * If not an mbox, or has leading mbox text */ if (buf.length() && (!ismbox || buf[0] == 'F')) { DwString msg(buf.c_str(), buf.length()); buf = ""; if (index(msg, arrival) != 0) return 1; } break; } } return 0; } int maildir(DIR* d, const string& source, const string& target) { struct dirent* e; struct stat s; while ((e = readdir(d)) != 0) { if (e->d_name[0] == '.') continue; string iname = source + '/' + e->d_name; string oname = target + '/' + e->d_name + ":OS"; if (stat(iname.c_str(), &s) != 0) continue; if (!S_ISREG(s.st_mode)) continue; FILE* f = fopen(iname.c_str(), "rb"); if (!f) continue; /* according to maildir(5), the mtime is the delivery time */ if (process_mail(f, s.st_mtime) != 0) return 1; fclose(f); if (rename(iname.c_str(), oname.c_str()) != 0) { perror("rename"); cerr << iname << " not moved to output" << endl; return 1; } } return 0; } int main(int argc, char** argv) { int c; const char* config = DEFAULT_CONFIG_FILE; const char* listn = 0; const char* input = 0; const char* histdb = 0; bool single = false; srandom(time(0)); while ((c = getopt(argc, (char*const*)argv, "c:l:i:p:mvndfu?")) != -1) { switch ((char)c) { case 'c': config = optarg; break; case 'l': listn = optarg; break; case 'i': input = optarg; break; case 'p': histdb = optarg; break; case 'm': single = true; break; case 'v': verbose = true; break; case 'd': dropdup = true; break; case 'f': synced = false; break; case 'u': userdate = true; break; case 'n': compressmail = false; break; default: help(argv[0]); return LEX_USAGE; } } while (optind < argc) { if (!argv[optind][0]) { // ignore empty arguments optind++; continue; } cerr << "Unexpected argument: '" << argv[optind] << "'\n"; return LEX_USAGE; } if (!listn) { cerr << "No list was specified (the -l option is manditory)\n"; return LEX_USAGE; } Config cfg; if (cfg.load(config) != 0) { cerr << cfg.getError() << flush; return LEX_DATAERR; } Config::Lists::iterator i = cfg.lists.find(listn); if (i == cfg.lists.end()) { cerr << "No such list '" << listn << "' defined; cannot import to it." << endl; return LEX_DATAERR; } list = &i->second; if (list->offline) { cerr << "The list '" << listn << "' is marked as offline; cannot import to it." << endl; return LEX_DATAERR; } if (cfg.db_umask != -1) umask(cfg.db_umask); string dbname = cfg.dbdir + "/db"; ESort::Parameters params(synced); // work around g++ 2.95 borkage auto_ptr dbt( ESort::Writer::opendb(dbname, params)); db = dbt; if (!db.get()) { perror(dbname.c_str()); return LEX_IOERR; } string mboxf = cfg.dbdir + "/" + listn; mbox = open(mboxf.c_str(), O_RDWR|O_CREAT, 0666); if (mbox == -1) { perror(mboxf.c_str()); return LEX_IOERR; } length = lseek(mbox, 0, SEEK_END); /* load the blacklist from the old database */ if (histdb) { auto_ptr dbh( ESort::Reader::opendb(histdb, params)); if (!dbh.get()) { perror(histdb); return LEX_IOERR; } string prefix(LU_KEYWORD + string(LU_KEYWORD_DELETED) + '\0'); auto_ptr walk( dbh->seek(prefix, "", ESort::Forward)); while (walk->advance() != -1) { if (walk->key.length() != prefix.length() + MessageId::raw_len) { cerr << histdb << " contains corrupt deleted entries" << endl; return LEX_IOERR; } MessageId id(walk->key.c_str() + prefix.length(), MessageId::raw_len); blacklist.insert(id); } if (errno != 0) { perror("walking history database"); return LEX_IOERR; } } /** Begin processing input. */ start = time(0); if (input) { DIR* d = opendir((string(input) + "/new").c_str()); if (d) { ismbox = false; /* maildirs don't have mboxes */ if (maildir(d, string(input) + "/new", string(input) + "/cur") != 0) return LEX_IOERR; closedir(d); } else { ismbox = !single; FILE* f = fopen(input, "rb"); if (!f) { perror(input); cerr << "Opening input file failed!" << endl; return LEX_IOERR; } if (process_mail(f, 0) != 0) return LEX_IOERR; fclose(f); } } else { ismbox = !single; if (process_mail(stdin, 0) != 0) return LEX_IOERR; } if (commit() != 0) return LEX_IOERR; if (verbose) status(); return 0; } lurker-2.3/index/getdate.cpp0000644000175000017500000022557711267072561013064 00000000000000/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { tAGO = 258, tDST = 259, tDAY = 260, tDAY_UNIT = 261, tDAYZONE = 262, tHOUR_UNIT = 263, tLOCAL_ZONE = 264, tMERIDIAN = 265, tMINUTE_UNIT = 266, tMONTH = 267, tMONTH_UNIT = 268, tSEC_UNIT = 269, tYEAR_UNIT = 270, tZONE = 271, tSNUMBER = 272, tUNUMBER = 273 }; #endif /* Tokens. */ #define tAGO 258 #define tDST 259 #define tDAY 260 #define tDAY_UNIT 261 #define tDAYZONE 262 #define tHOUR_UNIT 263 #define tLOCAL_ZONE 264 #define tMERIDIAN 265 #define tMINUTE_UNIT 266 #define tMONTH 267 #define tMONTH_UNIT 268 #define tSEC_UNIT 269 #define tYEAR_UNIT 270 #define tZONE 271 #define tSNUMBER 272 #define tUNUMBER 273 /* Copy the first part of user declarations. */ #line 1 "getdate.y" /* Parse a string into an internal time stamp. Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Originally written by Steven M. Bellovin while at the University of North Carolina at Chapel Hill. Later tweaked by a couple of people on Usenet. Completely overhauled by Rich $alz and Jim Berets in August, 1990. Modified by Paul Eggert in August 1999 to do the right thing about local DST. Unlike previous versions, this version is reentrant. Hacked by Wesley W. Terpstra to build as C++ w/o autoconf so lurker does not need CC. */ /* Since the code of getdate.y is not included in the Emacs executable itself, there is no need to #define static in this file. Even if the code were included in the Emacs executable, it probably wouldn't do any harm to #undef it here; this will only cause problems if we try to write to a static variable, which I don't think this code needs to do. */ #ifdef emacs # undef static #endif #include #include /* for `free'; used by Bison 1.27 */ #include #include using namespace std; #define IN_CTYPE_DOMAIN(c) 1 #define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c)) #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c)) #define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c)) #define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) /* ISDIGIT differs from ISDIGIT_LOCALE, as follows: - Its arg may be any int or unsigned int; it need not be an unsigned char. - It's guaranteed to evaluate its argument exactly once. - It's typically faster. POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to ISDIGIT_LOCALE unless it's important to use the locale's definition of `digit' even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) #define EPOCH_YEAR 1970 #define TM_YEAR_BASE 1900 #define HOUR(x) ((x) * 60) /* An integer value, and the number of digits in its textual representation. */ typedef struct { int value; int digits; } textint; /* An entry in the lexical lookup table. */ typedef struct { char const *name; int type; int value; } table; /* Meridian: am, pm, or 24-hour style. */ enum { MERam, MERpm, MER24 }; /* Information passed to and from the parser. */ typedef struct { /* The input string remaining to be parsed. */ const char *input; /* N, if this is the Nth Tuesday. */ int day_ordinal; /* Day of week; Sunday is 0. */ int day_number; /* tm_isdst flag for the local zone. */ int local_isdst; /* Time zone, in minutes east of UTC. */ int time_zone; /* Style used for time. */ int meridian; /* Gregorian year, month, day, hour, minutes, and seconds. */ textint year; int month; int day; int hour; int minutes; int seconds; /* Relative year, month, day, hour, minutes, and seconds. */ int rel_year; int rel_month; int rel_day; int rel_hour; int rel_minutes; int rel_seconds; /* Counts of nonterminals of various flavors parsed so far. */ int dates_seen; int days_seen; int local_zones_seen; int rels_seen; int times_seen; int zones_seen; /* Table of local time zone abbrevations, terminated by a null entry. */ table local_time_zone_table[3]; } parser_control; #define PC (* (parser_control *) parm) #define YYLEX_PARAM parm #define YYPARSE_PARAM parm union YYSTYPE; static int yyerror(char* s); static int yylex (YYSTYPE* lvalp, void* param); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 154 "getdate.y" { int intval; textint textintval; } /* Line 187 of yacc.c. */ #line 283 "getdate.tab.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 296 "getdate.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 52 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 22 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 12 /* YYNRULES -- Number of rules. */ #define YYNRULES 54 /* YYNRULES -- Number of states. */ #define YYNSTATES 64 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 273 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 2, 2, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 4, 7, 9, 11, 13, 15, 17, 19, 21, 24, 29, 34, 41, 48, 50, 53, 55, 57, 60, 62, 65, 68, 72, 78, 82, 86, 89, 94, 97, 101, 104, 106, 109, 112, 114, 117, 120, 122, 125, 128, 130, 133, 136, 138, 141, 144, 146, 149, 152, 154, 156, 157 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 23, 0, -1, -1, 23, 24, -1, 25, -1, 26, -1, 27, -1, 29, -1, 28, -1, 30, -1, 32, -1, 18, 10, -1, 18, 19, 18, 33, -1, 18, 19, 18, 17, -1, 18, 19, 18, 19, 18, 33, -1, 18, 19, 18, 19, 18, 17, -1, 9, -1, 9, 4, -1, 16, -1, 7, -1, 16, 4, -1, 5, -1, 5, 20, -1, 18, 5, -1, 18, 21, 18, -1, 18, 21, 18, 21, 18, -1, 18, 17, 17, -1, 18, 12, 17, -1, 12, 18, -1, 12, 18, 20, 18, -1, 18, 12, -1, 18, 12, 18, -1, 31, 3, -1, 31, -1, 18, 15, -1, 17, 15, -1, 15, -1, 18, 13, -1, 17, 13, -1, 13, -1, 18, 6, -1, 17, 6, -1, 6, -1, 18, 8, -1, 17, 8, -1, 8, -1, 18, 11, -1, 17, 11, -1, 11, -1, 18, 14, -1, 17, 14, -1, 14, -1, 18, -1, -1, 10, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 170, 170, 172, 176, 178, 180, 182, 184, 186, 188, 192, 199, 206, 214, 221, 233, 235, 240, 242, 244, 249, 254, 259, 267, 272, 292, 299, 307, 312, 318, 323, 332, 341, 345, 347, 349, 351, 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 384, 421, 422 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "tAGO", "tDST", "tDAY", "tDAY_UNIT", "tDAYZONE", "tHOUR_UNIT", "tLOCAL_ZONE", "tMERIDIAN", "tMINUTE_UNIT", "tMONTH", "tMONTH_UNIT", "tSEC_UNIT", "tYEAR_UNIT", "tZONE", "tSNUMBER", "tUNUMBER", "':'", "','", "'/'", "$accept", "spec", "item", "time", "local_zone", "zone", "day", "date", "rel", "relunit", "number", "o_merid", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 58, 44, 47 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 22, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 33 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 0, 2, 1, 1, 1, 1, 1, 1, 1, 2, 4, 4, 6, 6, 1, 2, 1, 1, 2, 1, 2, 2, 3, 5, 3, 3, 2, 4, 2, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 1, 0, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 2, 0, 1, 21, 42, 19, 45, 16, 48, 0, 39, 51, 36, 18, 0, 52, 3, 4, 5, 6, 8, 7, 9, 33, 10, 22, 17, 28, 20, 41, 44, 47, 38, 50, 35, 23, 40, 43, 11, 46, 30, 37, 49, 34, 0, 0, 0, 32, 0, 27, 31, 26, 53, 24, 29, 54, 13, 0, 12, 0, 53, 25, 15, 14 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 1, 16, 17, 18, 19, 20, 21, 22, 23, 24, 58 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -17 static const yytype_int8 yypact[] = { -17, 0, -17, 1, -17, -17, -17, 19, -17, -14, -17, -17, -17, 32, 26, 14, -17, -17, -17, -17, -17, -17, -17, 27, -17, -17, -17, 22, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -16, -17, -17, -17, 29, 25, 30, -17, 31, -17, -17, -17, 28, 23, -17, -17, -17, 33, -17, 34, -7, -17, -17, -17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -10 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 2, 49, 50, 55, 27, 3, 4, 5, 6, 7, 62, 8, 9, 10, 11, 12, 13, 14, 15, 35, 36, 25, 37, 26, 38, 39, 40, 41, 42, 43, 47, 44, 29, 45, 30, 46, 28, 31, 55, 32, 33, 34, 48, 52, 59, 56, 51, 57, 53, 54, 63, 60, 61 }; static const yytype_uint8 yycheck[] = { 0, 17, 18, 10, 18, 5, 6, 7, 8, 9, 17, 11, 12, 13, 14, 15, 16, 17, 18, 5, 6, 20, 8, 4, 10, 11, 12, 13, 14, 15, 3, 17, 6, 19, 8, 21, 4, 11, 10, 13, 14, 15, 20, 18, 21, 17, 17, 19, 18, 18, 60, 18, 18 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 23, 0, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 24, 25, 26, 27, 28, 29, 30, 31, 32, 20, 4, 18, 4, 6, 8, 11, 13, 14, 15, 5, 6, 8, 10, 11, 12, 13, 14, 15, 17, 19, 21, 3, 20, 17, 18, 17, 18, 18, 18, 10, 17, 19, 33, 21, 18, 18, 17, 33 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 4: #line 177 "getdate.y" { PC.times_seen++; ;} break; case 5: #line 179 "getdate.y" { PC.local_zones_seen++; ;} break; case 6: #line 181 "getdate.y" { PC.zones_seen++; ;} break; case 7: #line 183 "getdate.y" { PC.dates_seen++; ;} break; case 8: #line 185 "getdate.y" { PC.days_seen++; ;} break; case 9: #line 187 "getdate.y" { PC.rels_seen++; ;} break; case 11: #line 193 "getdate.y" { PC.hour = (yyvsp[(1) - (2)].textintval).value; PC.minutes = 0; PC.seconds = 0; PC.meridian = (yyvsp[(2) - (2)].intval); ;} break; case 12: #line 200 "getdate.y" { PC.hour = (yyvsp[(1) - (4)].textintval).value; PC.minutes = (yyvsp[(3) - (4)].textintval).value; PC.seconds = 0; PC.meridian = (yyvsp[(4) - (4)].intval); ;} break; case 13: #line 207 "getdate.y" { PC.hour = (yyvsp[(1) - (4)].textintval).value; PC.minutes = (yyvsp[(3) - (4)].textintval).value; PC.meridian = MER24; PC.zones_seen++; PC.time_zone = (yyvsp[(4) - (4)].textintval).value % 100 + ((yyvsp[(4) - (4)].textintval).value / 100) * 60; ;} break; case 14: #line 215 "getdate.y" { PC.hour = (yyvsp[(1) - (6)].textintval).value; PC.minutes = (yyvsp[(3) - (6)].textintval).value; PC.seconds = (yyvsp[(5) - (6)].textintval).value; PC.meridian = (yyvsp[(6) - (6)].intval); ;} break; case 15: #line 222 "getdate.y" { PC.hour = (yyvsp[(1) - (6)].textintval).value; PC.minutes = (yyvsp[(3) - (6)].textintval).value; PC.seconds = (yyvsp[(5) - (6)].textintval).value; PC.meridian = MER24; PC.zones_seen++; PC.time_zone = (yyvsp[(6) - (6)].textintval).value % 100 + ((yyvsp[(6) - (6)].textintval).value / 100) * 60; ;} break; case 16: #line 234 "getdate.y" { PC.local_isdst = (yyvsp[(1) - (1)].intval); ;} break; case 17: #line 236 "getdate.y" { PC.local_isdst = (yyvsp[(1) - (2)].intval) < 0 ? 1 : (yyvsp[(1) - (2)].intval) + 1; ;} break; case 18: #line 241 "getdate.y" { PC.time_zone = (yyvsp[(1) - (1)].intval); ;} break; case 19: #line 243 "getdate.y" { PC.time_zone = (yyvsp[(1) - (1)].intval) + 60; ;} break; case 20: #line 245 "getdate.y" { PC.time_zone = (yyvsp[(1) - (2)].intval) + 60; ;} break; case 21: #line 250 "getdate.y" { PC.day_ordinal = 1; PC.day_number = (yyvsp[(1) - (1)].intval); ;} break; case 22: #line 255 "getdate.y" { PC.day_ordinal = 1; PC.day_number = (yyvsp[(1) - (2)].intval); ;} break; case 23: #line 260 "getdate.y" { PC.day_ordinal = (yyvsp[(1) - (2)].textintval).value; PC.day_number = (yyvsp[(2) - (2)].intval); ;} break; case 24: #line 268 "getdate.y" { PC.month = (yyvsp[(1) - (3)].textintval).value; PC.day = (yyvsp[(3) - (3)].textintval).value; ;} break; case 25: #line 273 "getdate.y" { /* Interpret as YYYY/MM/DD if the first value has 4 or more digits, otherwise as MM/DD/YY. The goal in recognizing YYYY/MM/DD is solely to support legacy machine-generated dates like those in an RCS log listing. If you want portability, use the ISO 8601 format. */ if (4 <= (yyvsp[(1) - (5)].textintval).digits) { PC.year = (yyvsp[(1) - (5)].textintval); PC.month = (yyvsp[(3) - (5)].textintval).value; PC.day = (yyvsp[(5) - (5)].textintval).value; } else { PC.month = (yyvsp[(1) - (5)].textintval).value; PC.day = (yyvsp[(3) - (5)].textintval).value; PC.year = (yyvsp[(5) - (5)].textintval); } ;} break; case 26: #line 293 "getdate.y" { /* ISO 8601 format. YYYY-MM-DD. */ PC.year = (yyvsp[(1) - (3)].textintval); PC.month = -(yyvsp[(2) - (3)].textintval).value; PC.day = -(yyvsp[(3) - (3)].textintval).value; ;} break; case 27: #line 300 "getdate.y" { /* e.g. 17-JUN-1992. */ PC.day = (yyvsp[(1) - (3)].textintval).value; PC.month = (yyvsp[(2) - (3)].intval); PC.year.value = -(yyvsp[(3) - (3)].textintval).value; PC.year.digits = (yyvsp[(3) - (3)].textintval).digits; ;} break; case 28: #line 308 "getdate.y" { PC.month = (yyvsp[(1) - (2)].intval); PC.day = (yyvsp[(2) - (2)].textintval).value; ;} break; case 29: #line 313 "getdate.y" { PC.month = (yyvsp[(1) - (4)].intval); PC.day = (yyvsp[(2) - (4)].textintval).value; PC.year = (yyvsp[(4) - (4)].textintval); ;} break; case 30: #line 319 "getdate.y" { PC.day = (yyvsp[(1) - (2)].textintval).value; PC.month = (yyvsp[(2) - (2)].intval); ;} break; case 31: #line 324 "getdate.y" { PC.day = (yyvsp[(1) - (3)].textintval).value; PC.month = (yyvsp[(2) - (3)].intval); PC.year = (yyvsp[(3) - (3)].textintval); ;} break; case 32: #line 333 "getdate.y" { PC.rel_seconds = -PC.rel_seconds; PC.rel_minutes = -PC.rel_minutes; PC.rel_hour = -PC.rel_hour; PC.rel_day = -PC.rel_day; PC.rel_month = -PC.rel_month; PC.rel_year = -PC.rel_year; ;} break; case 34: #line 346 "getdate.y" { PC.rel_year += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 35: #line 348 "getdate.y" { PC.rel_year += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 36: #line 350 "getdate.y" { PC.rel_year += (yyvsp[(1) - (1)].intval); ;} break; case 37: #line 352 "getdate.y" { PC.rel_month += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 38: #line 354 "getdate.y" { PC.rel_month += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 39: #line 356 "getdate.y" { PC.rel_month += (yyvsp[(1) - (1)].intval); ;} break; case 40: #line 358 "getdate.y" { PC.rel_day += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 41: #line 360 "getdate.y" { PC.rel_day += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 42: #line 362 "getdate.y" { PC.rel_day += (yyvsp[(1) - (1)].intval); ;} break; case 43: #line 364 "getdate.y" { PC.rel_hour += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 44: #line 366 "getdate.y" { PC.rel_hour += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 45: #line 368 "getdate.y" { PC.rel_hour += (yyvsp[(1) - (1)].intval); ;} break; case 46: #line 370 "getdate.y" { PC.rel_minutes += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 47: #line 372 "getdate.y" { PC.rel_minutes += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 48: #line 374 "getdate.y" { PC.rel_minutes += (yyvsp[(1) - (1)].intval); ;} break; case 49: #line 376 "getdate.y" { PC.rel_seconds += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 50: #line 378 "getdate.y" { PC.rel_seconds += (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); ;} break; case 51: #line 380 "getdate.y" { PC.rel_seconds += (yyvsp[(1) - (1)].intval); ;} break; case 52: #line 385 "getdate.y" { if (PC.dates_seen && ! PC.rels_seen && (PC.times_seen || 2 < (yyvsp[(1) - (1)].textintval).digits)) PC.year = (yyvsp[(1) - (1)].textintval); else { if (4 < (yyvsp[(1) - (1)].textintval).digits) { PC.dates_seen++; PC.day = (yyvsp[(1) - (1)].textintval).value % 100; PC.month = ((yyvsp[(1) - (1)].textintval).value / 100) % 100; PC.year.value = (yyvsp[(1) - (1)].textintval).value / 10000; PC.year.digits = (yyvsp[(1) - (1)].textintval).digits - 4; } else { PC.times_seen++; if ((yyvsp[(1) - (1)].textintval).digits <= 2) { PC.hour = (yyvsp[(1) - (1)].textintval).value; PC.minutes = 0; } else { PC.hour = (yyvsp[(1) - (1)].textintval).value / 100; PC.minutes = (yyvsp[(1) - (1)].textintval).value % 100; } PC.seconds = 0; PC.meridian = MER24; } } ;} break; case 53: #line 421 "getdate.y" { (yyval.intval) = MER24; ;} break; case 54: #line 423 "getdate.y" { (yyval.intval) = (yyvsp[(1) - (1)].intval); ;} break; /* Line 1267 of yacc.c. */ #line 1914 "getdate.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (yymsg); } else { yyerror (YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 426 "getdate.y" /* Include this file down here because bison inserts code above which may define-away `const'. We want the prototype for get_date to have the same signature as the function definition. */ #include "getdate.h" #ifndef gmtime struct tm *gmtime (); #endif #ifndef localtime struct tm *localtime (); #endif #ifndef mktime time_t mktime (); #endif static table const meridian_table[] = { { "AM", tMERIDIAN, MERam }, { "A.M.", tMERIDIAN, MERam }, { "PM", tMERIDIAN, MERpm }, { "P.M.", tMERIDIAN, MERpm }, { 0, 0, 0 } }; static table const dst_table[] = { { "DST", tDST, 0 } }; static table const month_and_day_table[] = { { "JANUARY", tMONTH, 1 }, { "FEBRUARY", tMONTH, 2 }, { "MARCH", tMONTH, 3 }, { "APRIL", tMONTH, 4 }, { "MAY", tMONTH, 5 }, { "JUNE", tMONTH, 6 }, { "JULY", tMONTH, 7 }, { "AUGUST", tMONTH, 8 }, { "SEPTEMBER",tMONTH, 9 }, { "SEPT", tMONTH, 9 }, { "OCTOBER", tMONTH, 10 }, { "NOVEMBER", tMONTH, 11 }, { "DECEMBER", tMONTH, 12 }, { "SUNDAY", tDAY, 0 }, { "MONDAY", tDAY, 1 }, { "TUESDAY", tDAY, 2 }, { "TUES", tDAY, 2 }, { "WEDNESDAY",tDAY, 3 }, { "WEDNES", tDAY, 3 }, { "THURSDAY", tDAY, 4 }, { "THUR", tDAY, 4 }, { "THURS", tDAY, 4 }, { "FRIDAY", tDAY, 5 }, { "SATURDAY", tDAY, 6 }, { 0, 0, 0 } }; static table const time_units_table[] = { { "YEAR", tYEAR_UNIT, 1 }, { "MONTH", tMONTH_UNIT, 1 }, { "FORTNIGHT",tDAY_UNIT, 14 }, { "WEEK", tDAY_UNIT, 7 }, { "DAY", tDAY_UNIT, 1 }, { "HOUR", tHOUR_UNIT, 1 }, { "MINUTE", tMINUTE_UNIT, 1 }, { "MIN", tMINUTE_UNIT, 1 }, { "SECOND", tSEC_UNIT, 1 }, { "SEC", tSEC_UNIT, 1 }, { 0, 0, 0 } }; /* Assorted relative-time words. */ static table const relative_time_table[] = { { "TOMORROW", tMINUTE_UNIT, 24 * 60 }, { "YESTERDAY",tMINUTE_UNIT, - (24 * 60) }, { "TODAY", tMINUTE_UNIT, 0 }, { "NOW", tMINUTE_UNIT, 0 }, { "LAST", tUNUMBER, -1 }, { "THIS", tUNUMBER, 0 }, { "NEXT", tUNUMBER, 1 }, { "FIRST", tUNUMBER, 1 }, /*{ "SECOND", tUNUMBER, 2 }, */ { "THIRD", tUNUMBER, 3 }, { "FOURTH", tUNUMBER, 4 }, { "FIFTH", tUNUMBER, 5 }, { "SIXTH", tUNUMBER, 6 }, { "SEVENTH", tUNUMBER, 7 }, { "EIGHTH", tUNUMBER, 8 }, { "NINTH", tUNUMBER, 9 }, { "TENTH", tUNUMBER, 10 }, { "ELEVENTH", tUNUMBER, 11 }, { "TWELFTH", tUNUMBER, 12 }, { "AGO", tAGO, 1 }, { 0, 0, 0 } }; /* The time zone table. This table is necessarily incomplete, as time zone abbreviations are ambiguous; e.g. Australians interpret "EST" as Eastern time in Australia, not as US Eastern Standard Time. You cannot rely on getdate to handle arbitrary time zone abbreviations; use numeric abbreviations like `-0500' instead. */ static table const time_zone_table[] = { { "GMT", tZONE, HOUR ( 0) }, /* Greenwich Mean */ { "UT", tZONE, HOUR ( 0) }, /* Universal (Coordinated) */ { "UTC", tZONE, HOUR ( 0) }, { "WET", tZONE, HOUR ( 0) }, /* Western European */ { "WEST", tDAYZONE, HOUR ( 0) }, /* Western European Summer */ { "BST", tDAYZONE, HOUR ( 0) }, /* British Summer */ { "ART", tZONE, -HOUR ( 3) }, /* Argentina */ { "BRT", tZONE, -HOUR ( 3) }, /* Brazil */ { "BRST", tDAYZONE, -HOUR ( 3) }, /* Brazil Summer */ { "NST", tZONE, -(HOUR ( 3) + 30) }, /* Newfoundland Standard */ { "NDT", tDAYZONE,-(HOUR ( 3) + 30) }, /* Newfoundland Daylight */ { "AST", tZONE, -HOUR ( 4) }, /* Atlantic Standard */ { "ADT", tDAYZONE, -HOUR ( 4) }, /* Atlantic Daylight */ { "CLT", tZONE, -HOUR ( 4) }, /* Chile */ { "CLST", tDAYZONE, -HOUR ( 4) }, /* Chile Summer */ { "EST", tZONE, -HOUR ( 5) }, /* Eastern Standard */ { "EDT", tDAYZONE, -HOUR ( 5) }, /* Eastern Daylight */ { "CST", tZONE, -HOUR ( 6) }, /* Central Standard */ { "CDT", tDAYZONE, -HOUR ( 6) }, /* Central Daylight */ { "MST", tZONE, -HOUR ( 7) }, /* Mountain Standard */ { "MDT", tDAYZONE, -HOUR ( 7) }, /* Mountain Daylight */ { "PST", tZONE, -HOUR ( 8) }, /* Pacific Standard */ { "PDT", tDAYZONE, -HOUR ( 8) }, /* Pacific Daylight */ { "AKST", tZONE, -HOUR ( 9) }, /* Alaska Standard */ { "AKDT", tDAYZONE, -HOUR ( 9) }, /* Alaska Daylight */ { "HST", tZONE, -HOUR (10) }, /* Hawaii Standard */ { "HAST", tZONE, -HOUR (10) }, /* Hawaii-Aleutian Standard */ { "HADT", tDAYZONE, -HOUR (10) }, /* Hawaii-Aleutian Daylight */ { "SST", tZONE, -HOUR (12) }, /* Samoa Standard */ { "WAT", tZONE, HOUR ( 1) }, /* West Africa */ { "CET", tZONE, HOUR ( 1) }, /* Central European */ { "CEST", tDAYZONE, HOUR ( 1) }, /* Central European Summer */ { "MET", tZONE, HOUR ( 1) }, /* Middle European */ { "MEZ", tZONE, HOUR ( 1) }, /* Middle European */ { "MEST", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */ { "MESZ", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */ { "EET", tZONE, HOUR ( 2) }, /* Eastern European */ { "EEST", tDAYZONE, HOUR ( 2) }, /* Eastern European Summer */ { "CAT", tZONE, HOUR ( 2) }, /* Central Africa */ { "SAST", tZONE, HOUR ( 2) }, /* South Africa Standard */ { "EAT", tZONE, HOUR ( 3) }, /* East Africa */ { "MSK", tZONE, HOUR ( 3) }, /* Moscow */ { "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */ { "IST", tZONE, (HOUR ( 5) + 30) }, /* India Standard */ { "SGT", tZONE, HOUR ( 8) }, /* Singapore */ { "KST", tZONE, HOUR ( 9) }, /* Korea Standard */ { "JST", tZONE, HOUR ( 9) }, /* Japan Standard */ { "GST", tZONE, HOUR (10) }, /* Guam Standard */ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */ { 0, 0, 0 } }; /* Military time zone table. */ static table const military_table[] = { { "A", tZONE, -HOUR ( 1) }, { "B", tZONE, -HOUR ( 2) }, { "C", tZONE, -HOUR ( 3) }, { "D", tZONE, -HOUR ( 4) }, { "E", tZONE, -HOUR ( 5) }, { "F", tZONE, -HOUR ( 6) }, { "G", tZONE, -HOUR ( 7) }, { "H", tZONE, -HOUR ( 8) }, { "I", tZONE, -HOUR ( 9) }, { "K", tZONE, -HOUR (10) }, { "L", tZONE, -HOUR (11) }, { "M", tZONE, -HOUR (12) }, { "N", tZONE, HOUR ( 1) }, { "O", tZONE, HOUR ( 2) }, { "P", tZONE, HOUR ( 3) }, { "Q", tZONE, HOUR ( 4) }, { "R", tZONE, HOUR ( 5) }, { "S", tZONE, HOUR ( 6) }, { "T", tZONE, HOUR ( 7) }, { "U", tZONE, HOUR ( 8) }, { "V", tZONE, HOUR ( 9) }, { "W", tZONE, HOUR (10) }, { "X", tZONE, HOUR (11) }, { "Y", tZONE, HOUR (12) }, { "Z", tZONE, HOUR ( 0) }, { 0, 0, 0 } }; static int to_hour (int hours, int meridian) { switch (meridian) { case MER24: return 0 <= hours && hours < 24 ? hours : -1; case MERam: return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1; case MERpm: return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1; default: abort (); } /* NOTREACHED */ } static int to_year (textint textyear) { int year = textyear.value; if (year < 0) year = -year; /* XPG4 suggests that years 00-68 map to 2000-2068, and years 69-99 map to 1969-1999. */ if (textyear.digits == 2) year += year < 69 ? 2000 : 1900; return year; } static table const * lookup_zone (parser_control const *pc, char const *name) { table const *tp; /* Try local zone abbreviations first; they're more likely to be right. */ for (tp = pc->local_time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; for (tp = time_zone_table; tp->name; tp++) if (strcmp (name, tp->name) == 0) return tp; return 0; } #if ! HAVE_TM_GMTOFF /* Yield the difference between *A and *B, measured in seconds, ignoring leap seconds. The body of this function is taken directly from the GNU C Library; see src/strftime.c. */ static int tm_diff (struct tm const *a, struct tm const *b) { /* Compute intervening leap days correctly even if year is negative. Take care to avoid int overflow in leap day calculations, but it's OK to assume that A and B are close to each other. */ int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3); int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3); int a100 = a4 / 25 - (a4 % 25 < 0); int b100 = b4 / 25 - (b4 % 25 < 0); int a400 = a100 >> 2; int b400 = b100 >> 2; int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); int years = a->tm_year - b->tm_year; int days = (365 * years + intervening_leap_days + (a->tm_yday - b->tm_yday)); return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour)) + (a->tm_min - b->tm_min)) + (a->tm_sec - b->tm_sec)); } #endif /* ! HAVE_TM_GMTOFF */ static table const * lookup_word (parser_control const *pc, char *word) { char *p; char *q; size_t wordlen; table const *tp; int i; int abbrev; /* Make it uppercase. */ for (p = word; *p; p++) if (ISLOWER ((unsigned char) *p)) *p = toupper ((unsigned char) *p); for (tp = meridian_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* See if we have an abbreviation for a month. */ wordlen = strlen (word); abbrev = wordlen == 3 || (wordlen == 4 && word[3] == '.'); for (tp = month_and_day_table; tp->name; tp++) if ((abbrev ? strncmp (word, tp->name, 3) : strcmp (word, tp->name)) == 0) return tp; if ((tp = lookup_zone (pc, word))) return tp; if (strcmp (word, dst_table[0].name) == 0) return dst_table; for (tp = time_units_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* Strip off any plural and try the units table again. */ if (word[wordlen - 1] == 'S') { word[wordlen - 1] = '\0'; for (tp = time_units_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; word[wordlen - 1] = 'S'; /* For "this" in relative_time_table. */ } for (tp = relative_time_table; tp->name; tp++) if (strcmp (word, tp->name) == 0) return tp; /* Military time zones. */ if (wordlen == 1) for (tp = military_table; tp->name; tp++) if (word[0] == tp->name[0]) return tp; /* Drop out any periods and try the time zone table again. */ for (i = 0, p = q = word; (*p = *q); q++) if (*q == '.') i = 1; else p++; if (i && (tp = lookup_zone (pc, word))) return tp; return 0; } static int yylex (YYSTYPE *lvalp, void* v) { parser_control* pc = (parser_control*)v; unsigned char c; int count; for (;;) { while (c = *pc->input, ISSPACE (c)) pc->input++; if (ISDIGIT (c) || c == '-' || c == '+') { char const *p; int sign; int value; if (c == '-' || c == '+') { sign = c == '-' ? -1 : 1; c = *++pc->input; if (! ISDIGIT (c)) /* skip the '-' sign */ continue; } else sign = 0; p = pc->input; value = 0; do { value = 10 * value + c - '0'; c = *++p; } while (ISDIGIT (c)); lvalp->textintval.value = sign < 0 ? -value : value; lvalp->textintval.digits = p - pc->input; pc->input = p; return sign ? tSNUMBER : tUNUMBER; } if (ISALPHA (c)) { char buff[20]; char *p = buff; table const *tp; do { if (p < buff + sizeof buff - 1) *p++ = c; c = *++pc->input; } while (ISALPHA (c) || c == '.'); *p = '\0'; tp = lookup_word (pc, buff); if (! tp) return '?'; lvalp->intval = tp->value; return tp->type; } if (c != '(') return *pc->input++; count = 0; do { c = *pc->input++; if (c == '\0') return c; if (c == '(') count++; else if (c == ')') count--; } while (count > 0); } } /* Do nothing if the parser reports an error. */ static int yyerror (char *s) { return 0; } /* Parse a date/time string P. Return the corresponding time_t value, or (time_t) -1 if there is an error. P can be an incomplete or relative time specification; if so, use *NOW as the basis for the returned time. */ time_t get_date (const char *p, const time_t *now) { time_t Start = now ? *now : time (0); struct tm *tmp = localtime (&Start); struct tm tm; struct tm tm0; parser_control pc; if (! tmp) return -1; pc.input = p; pc.year.value = tmp->tm_year + TM_YEAR_BASE; pc.year.digits = 4; pc.month = tmp->tm_mon + 1; pc.day = tmp->tm_mday; pc.hour = tmp->tm_hour; pc.minutes = tmp->tm_min; pc.seconds = tmp->tm_sec; tm.tm_isdst = tmp->tm_isdst; pc.meridian = MER24; pc.rel_seconds = 0; pc.rel_minutes = 0; pc.rel_hour = 0; pc.rel_day = 0; pc.rel_month = 0; pc.rel_year = 0; pc.dates_seen = 0; pc.days_seen = 0; pc.rels_seen = 0; pc.times_seen = 0; pc.local_zones_seen = 0; pc.zones_seen = 0; #if HAVE_STRUCT_TM_TM_ZONE pc.local_time_zone_table[0].name = tmp->tm_zone; pc.local_time_zone_table[0].type = tLOCAL_ZONE; pc.local_time_zone_table[0].value = tmp->tm_isdst; pc.local_time_zone_table[1].name = 0; /* Probe the names used in the next three calendar quarters, looking for a tm_isdst different from the one we already have. */ { int quarter; for (quarter = 1; quarter <= 3; quarter++) { time_t probe = Start + quarter * (90 * 24 * 60 * 60); struct tm *probe_tm = localtime (&probe); if (probe_tm && probe_tm->tm_zone && probe_tm->tm_isdst != pc.local_time_zone_table[0].value) { { pc.local_time_zone_table[1].name = probe_tm->tm_zone; pc.local_time_zone_table[1].type = tLOCAL_ZONE; pc.local_time_zone_table[1].value = probe_tm->tm_isdst; pc.local_time_zone_table[2].name = 0; } break; } } } #else #if HAVE_TZNAME { # ifndef tzname extern char *tzname[]; # endif int i; for (i = 0; i < 2; i++) { pc.local_time_zone_table[i].name = tzname[i]; pc.local_time_zone_table[i].type = tLOCAL_ZONE; pc.local_time_zone_table[i].value = i; } pc.local_time_zone_table[i].name = 0; } #else pc.local_time_zone_table[0].name = 0; #endif #endif if (pc.local_time_zone_table[0].name && pc.local_time_zone_table[1].name && ! strcmp (pc.local_time_zone_table[0].name, pc.local_time_zone_table[1].name)) { /* This locale uses the same abbrevation for standard and daylight times. So if we see that abbreviation, we don't know whether it's daylight time. */ pc.local_time_zone_table[0].value = -1; pc.local_time_zone_table[1].name = 0; } if (yyparse (&pc) != 0 || 1 < pc.times_seen || 1 < pc.dates_seen || 1 < pc.days_seen || 1 < (pc.local_zones_seen + pc.zones_seen) || (pc.local_zones_seen && 1 < pc.local_isdst)) return -1; tm.tm_year = to_year (pc.year) - TM_YEAR_BASE + pc.rel_year; tm.tm_mon = pc.month - 1 + pc.rel_month; tm.tm_mday = pc.day + pc.rel_day; if (pc.times_seen || (pc.rels_seen && ! pc.dates_seen && ! pc.days_seen)) { tm.tm_hour = to_hour (pc.hour, pc.meridian); if (tm.tm_hour < 0) return -1; tm.tm_min = pc.minutes; tm.tm_sec = pc.seconds; } else { tm.tm_hour = tm.tm_min = tm.tm_sec = 0; } /* Let mktime deduce tm_isdst if we have an absolute time stamp, or if the relative time stamp mentions days, months, or years. */ if (pc.dates_seen | pc.days_seen | pc.times_seen | pc.rel_day | pc.rel_month | pc.rel_year) tm.tm_isdst = -1; /* But if the input explicitly specifies local time with or without DST, give mktime that information. */ if (pc.local_zones_seen) tm.tm_isdst = pc.local_isdst; tm0 = tm; Start = mktime (&tm); if (Start == (time_t) -1) { /* Guard against falsely reporting errors near the time_t boundaries when parsing times in other time zones. For example, if the min time_t value is 1970-01-01 00:00:00 UTC and we are 8 hours ahead of UTC, then the min localtime value is 1970-01-01 08:00:00; if we apply mktime to 1970-01-01 00:00:00 we will get an error, so we apply mktime to 1970-01-02 08:00:00 instead and adjust the time zone by 24 hours to compensate. This algorithm assumes that there is no DST transition within a day of the time_t boundaries. */ if (pc.zones_seen) { tm = tm0; if (tm.tm_year <= EPOCH_YEAR - TM_YEAR_BASE) { tm.tm_mday++; pc.time_zone += 24 * 60; } else { tm.tm_mday--; pc.time_zone -= 24 * 60; } Start = mktime (&tm); } if (Start == (time_t) -1) return Start; } if (pc.days_seen && ! pc.dates_seen) { tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7 + 7 * (pc.day_ordinal - (0 < pc.day_ordinal))); tm.tm_isdst = -1; Start = mktime (&tm); if (Start == (time_t) -1) return Start; } if (pc.zones_seen) { int delta = pc.time_zone * 60; #ifdef HAVE_TM_GMTOFF delta -= tm.tm_gmtoff; #else struct tm *gmt = gmtime (&Start); if (! gmt) return -1; delta -= tm_diff (&tm, gmt); #endif if ((Start < Start - delta) != (delta < 0)) return -1; /* time_t overflow */ Start -= delta; } /* Add relative hours, minutes, and seconds. Ignore leap seconds; i.e. "+ 10 minutes" means 600 seconds, even if one of them is a leap second. Typically this is not what the user wants, but it's too hard to do it the other way, because the time zone indicator must be applied before relative times, and if mktime is applied again the time zone will be lost. */ { time_t t0 = Start; long d1 = 60 * 60 * (long) pc.rel_hour; time_t t1 = t0 + d1; long d2 = 60 * (long) pc.rel_minutes; time_t t2 = t1 + d2; int d3 = pc.rel_seconds; time_t t3 = t2 + d3; if ((d1 / (60 * 60) ^ pc.rel_hour) | (d2 / 60 ^ pc.rel_minutes) | ((t0 + d1 < t0) ^ (d1 < 0)) | ((t1 + d2 < t1) ^ (d2 < 0)) | ((t2 + d3 < t2) ^ (d3 < 0))) return -1; Start = t3; } return Start; } #if TEST #include int main (int ac, char **av) { char buff[BUFSIZ]; time_t d; printf ("Enter date, or blank line to exit.\n\t> "); fflush (stdout); buff[BUFSIZ - 1] = 0; while (fgets (buff, BUFSIZ - 1, stdin) && buff[0]) { d = get_date (buff, 0); if (d == (time_t) -1) printf ("Bad format - couldn't convert.\n"); else printf ("%s", ctime (&d)); printf ("\t> "); fflush (stdout); } return 0; } #endif /* defined TEST */ lurker-2.3/index/search.cpp0000644000175000017500000001555211267074431012700 00000000000000/* $Id: search.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * search.cpp - Search for messages in lurker database (optionally delete) * * Copyright (C) 2004 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include using namespace std; void help(const char* name) { cerr << "Lurker-search (v" << VERSION << ") searches for messages in a lurker database.\n"; cerr << "\n"; cerr << "Usage: " << name << " [-c ] [-k ] [ -d -f -v -i -q ] *\n"; cerr << "\n"; cerr << "\t-c Use this config file for lurker settings\n"; cerr << "\t-k Add the specified keyword tag to hits\n"; cerr << "\t-d Delete matching messages\n"; cerr << "\t-f Don't prompt before deleting\n"; cerr << "\t-v Output message summaries\n"; cerr << "\t-i Take lurker message ids instead of keywords\n"; cerr << "\t-q Don't output message ids or status\n"; cerr << "\n"; cerr << "Execute a keyword search to find messages.\n"; cerr << "The following search terms are supported (all must match):\n"; cerr << " -xxx - select messages which do NOT match this term\n"; cerr << " id:xxx - select a message by the Message-ID field\n"; cerr << " rt:xxx - select messages which reply to the chosen Message-ID\n"; cerr << " th:xxx - select messages included in this thread\n"; cerr << " ml:xxx - select messages in this mailing list\n"; cerr << " gr:xxx - select messages in this mailing list group\n"; cerr << " au:xxx - select messages with this term in the author fields\n"; cerr << " sb:xxx - select messages with this word in the subject\n"; cerr << " lang:xx - select messages in this language\n"; cerr << "\n"; } int main(int argc, char** argv) { int c; const char* config = DEFAULT_CONFIG_FILE; bool erase = false; bool force = false; bool verbose = false; bool quiet = false; bool ids = false; string keyword; while ((c = getopt(argc, (char*const*)argv, "c:k:dvfiq?")) != -1) { switch ((char)c) { case 'c': config = optarg; break; case 'k': keyword = optarg; break; case 'd': erase = true; break; case 'f': force = true; break; case 'v': verbose = true; break; case 'q': quiet = true; break; case 'i': ids = true; break; default: help(argv[0]); return 1; } } if (optind >= argc) { help(argv[0]); return 1; } Config cfg; if (cfg.load(config) != 0) { cerr << cfg.getError() << flush; return 1; } ESort::Writer* db; auto_ptr dbr; if (erase || keyword != "") { if (verbose) cerr << "opening " << cfg.dbdir << "/db read-write" << endl; // Work around g++ 2.95 bug if (cfg.db_umask != -1) umask(cfg.db_umask); auto_ptr w (ESort::Writer::opendb(cfg.dbdir + "/db")); db = w.get(); dbr = w; } else { if (verbose) cerr << "opening " << cfg.dbdir << "/db read-only" << endl; auto_ptr r (ESort::Reader::opendb(cfg.dbdir + "/db")); dbr = r; } if (!dbr.get()) { perror("opening database"); return 1; } vector result; if (ids) { for (; optind < argc; ++optind) { if (!argv[optind][0]) continue; // skip empty MessageId id(argv[optind]); if (id.serialize() != argv[optind]) { cerr << "'" << argv[optind] << "' is not a message-id\n"; return 1; } result.push_back(Summary(id)); } } else { Search s(cfg, dbr.get(), ESort::Forward); for (; optind < argc; ++optind) { if (!argv[optind][0]) continue; // skip empty s.keyword(argv[optind]); } vector::size_type sz = 0; while (s.pull(1, result) && result.size() == sz+1) { sz = result.size(); } } vector::iterator i, e = result.end(); for (i = result.begin(); i != e; ++i) { if (!quiet) cout << "id: " << i->id().serialize() << "\n"; if (verbose) { string ok; if ((ok = i->load(dbr.get(), cfg)) != "") { cerr << "Failed to load: " << ok << "\n"; return 1; } cout << "sb: " << i->subject() << "\n"; cout << "au: \"" << i->author_name() << "\" <" << i->author_email() << ">\n"; } } if (result.empty()) return 0; if (erase && !force) { cout << flush; cerr << "Are you certain you want to delete these messages? (yes/no) [no] " << flush; string ok; std::getline(cin, ok); if (ok != "yes") { cerr << "aborted!\n"; return 1; } } if (keyword != "") { if (!quiet) cerr << "Tagging messages with keyword" << endl; for (i = result.begin(); i != e; ++i) { if (db->insert( LU_KEYWORD + keyword + '\0' + i->id().raw()) != 0) { perror("insert"); cerr << "Tagging with keyword failed; operation aborted.\n"; return 1; } } } if (erase) { if (!quiet) cerr << "Marking messages as deleted" << endl; // The idea is that lurker-prune already kills cache which // refers to a newly imported message (regardless of time). // Therefore, report the deleted message as new. MessageId importStamp(time(0)); for (i = result.begin(); i != e; ++i) { if (db->insert( LU_KEYWORD + string(LU_KEYWORD_DELETED) + '\0' + i->id().raw()) != 0) { perror("insert"); cerr << "Delete keyword failed; operation aborted.\n"; return 1; } if (db->insert( LU_SUMMARY + i->id().raw() + LU_MESSAGE_DELETED) != 0) { perror("insert"); cerr << "Delete summary failed; operation aborted.\n"; return 1; } if (db->insert( LU_CACHE + importStamp.raw().substr(0, 4) + i->id().raw()) != 0) { perror("insert"); cerr << "Delete cache eviction failed; operation aborted.\n"; return 1; } } } if (erase || keyword != "") { if (!quiet) cerr << "Committing changes to disk" << endl; if (db->commit() != 0) { perror("commit"); cerr << "Commit failed; operation aborted.\n"; return 1; } if (!quiet) { cerr << "Cache will be automatically corrected when the cronjob next runs.\n"; } } return 0; } lurker-2.3/index/lurker-regenerate.sgml0000644000175000017500000001177011267070017015230 00000000000000 lurker-regenerate.1'. You may view the manual page with: `docbook-to-man lurker-regenerate.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: lurker-regenerate.1: lurker-regenerate.sgml docbook-to-man $< > $@ --> Jonas"> Meurer"> May 22, 2003"> 1"> jonas@freesources.org"> LURKER\-REGENERATE"> Debian"> lurker"> GNU"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2003 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; imports messages into the archive &dhpackage; <bin-dir> <config-file> DESCRIPTION &dhpackage; regenerates a lurker database. It generates a new database first, then replaces the old one with the new one. You will need enough diskspace for a full copy of the database that you want to regenerate. The two arguments are optional. Regenerating the lurker database is the only way to recover disk space from deleted emails. If you delete an entire mailing list, you should regenerate the database. Be aware of the fact that lurker-regenerate supports only databases from lurker >= 0.6. If you want to regenerate databases from earlier versions of lurker, you'll need to rm -rf the whole database and reimport it manually. OPTIONS The directory containing lurker-{index,list,params,prune}. This defaults to where 'make install' placed them. The config-file for which lurker-regenerate rebuilds the database. SEE ALSO lurker\-index(1), lurker\-list(1), lurker\-params(1), lurker\-prune(1), lurker\-search(1) lurker documentation on http://lurker.sourceforge.net/ COPYRIGHT Copyright (C) 2003-2006: &dhusername; <&dhemail;> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. BUGS Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to <&support;>.
lurker-2.3/index/lurker-list.10000644000175000017500000000636211267070017013261 00000000000000.\" $Header: /home/terpstra/cvt/lurker/lurker/index/lurker-list.1,v 1.7 2004-10-09 14:48:18 terpstra Exp $ .\" .\" transcript compatibility for postscript use. .\" .\" synopsis: .P! .\" .de P! .fl \!!1 setgray .fl \\&.\" .fl \!!0 setgray .fl \" force out current output buffer \!!save /psv exch def currentpoint translate 0 0 moveto \!!/showpage{}def .fl \" prolog .sy sed -e 's/^/!/' \\$1\" bring in postscript file \!!psv restore . .de pF .ie \\*(f1 .ds f1 \\n(.f .el .ie \\*(f2 .ds f2 \\n(.f .el .ie \\*(f3 .ds f3 \\n(.f .el .ie \\*(f4 .ds f4 \\n(.f .el .tm ? font overflow .ft \\$1 .. .de fP .ie !\\*(f4 \{\ . ft \\*(f4 . ds f4\" ' br \} .el .ie !\\*(f3 \{\ . ft \\*(f3 . ds f3\" ' br \} .el .ie !\\*(f2 \{\ . ft \\*(f2 . ds f2\" ' br \} .el .ie !\\*(f1 \{\ . ft \\*(f1 . ds f1\" ' br \} .el .tm ? font underflow .. .ds f1\" .ds f2\" .ds f3\" .ds f4\" '\" t .ta 8n 16n 24n 32n 40n 48n 56n 64n 72n .TH "LURKER\-LIST" "1" .SH "NAME" lurker\-list \(em parses lists from the config file .SH "SYNOPSIS" .PP \fBlurker\-list\fR [\-c ] [\-f ] [\-i \-g \-t \-a \-l \-d \-s \-o] [listid ...] .SH "DESCRIPTION" .PP \fBlurker\-list\fR outputs various lurker settings from the config file for use in shell scripts. Do not use sed/grep/etc, instead use this as it respects include. .PP If no list ids are given, then all lists are dumped. If no field is specified, then all fields are dumped. .SH "OPTIONS" .IP "\fB\-c config-file\fP" 10 Use this config file for lurker settings. .IP "\fB\-f locale\fP" 10 Choose lurker config fields from the specified locale (it defaults to selecting the fallback case for each field). .IP "\fB\-i\fP" 10 Output only the list id .IP "\fB\-g\fP" 10 Output only the group .IP "\fB\-t\fP" 10 Output only the title .IP "\fB\-a\fP" 10 Output only the email address .IP "\fB\-l\fP" 10 Output only the url link .IP "\fB\-d\fP" 10 Output only the description .IP "\fB\-s\fP" 10 Output only the language .IP "\fB\-o\fP" 10 Output only the offline status .SH "SEE ALSO" .PP lurker\-index(1), lurker\-prune(1), lurker\-params(1), lurker\-search(1) .PP lurker documentation on http://lurker.sourceforge.net/ .SH "COPYRIGHT" .PP Copyright (C) 2002: Wesley W. Terpstra .PP This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. .PP This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. .PP You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. .SH "BUGS" .PP Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to . .\" created by instant / docbook-to-man, Sat 28 Aug 2004, 23:30 lurker-2.3/index/Makefile.in0000644000175000017500000004526111272632671012776 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = lurker-index$(EXEEXT) lurker-list$(EXEEXT) \ lurker-params$(EXEEXT) lurker-search$(EXEEXT) subdir = index DIST_COMMON = $(dist_bin_SCRIPTS) $(dist_man_MANS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_lurker_index_OBJECTS = Index.$(OBJEXT) main.$(OBJEXT) \ getdate.$(OBJEXT) lurker_index_OBJECTS = $(am_lurker_index_OBJECTS) lurker_index_LDADD = $(LDADD) lurker_index_DEPENDENCIES = ../common/libcommon.a \ ../libesort/libesort.a am_lurker_list_OBJECTS = list.$(OBJEXT) lurker_list_OBJECTS = $(am_lurker_list_OBJECTS) lurker_list_LDADD = $(LDADD) lurker_list_DEPENDENCIES = ../common/libcommon.a \ ../libesort/libesort.a am_lurker_params_OBJECTS = params.$(OBJEXT) lurker_params_OBJECTS = $(am_lurker_params_OBJECTS) lurker_params_LDADD = $(LDADD) lurker_params_DEPENDENCIES = ../common/libcommon.a \ ../libesort/libesort.a am_lurker_search_OBJECTS = search.$(OBJEXT) lurker_search_OBJECTS = $(am_lurker_search_OBJECTS) lurker_search_LDADD = $(LDADD) lurker_search_DEPENDENCIES = ../common/libcommon.a \ ../libesort/libesort.a dist_binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(dist_bin_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/tools/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(lurker_index_SOURCES) $(lurker_list_SOURCES) \ $(lurker_params_SOURCES) $(lurker_search_SOURCES) DIST_SOURCES = $(lurker_index_SOURCES) $(lurker_list_SOURCES) \ $(lurker_params_SOURCES) $(lurker_search_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_bin_SCRIPTS = lurker-regenerate dist_man_MANS = lurker-index.1 lurker-list.1 lurker-params.1 \ lurker-search.1 lurker-regenerate.1 EXTRA_DIST = lurker-drop-rlimit.cpp \ lurker-index.sgml lurker-list.sgml lurker-params.sgml \ lurker-search.sgml lurker-regenerate.sgml AM_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/libesort LDADD = ../common/libcommon.a ../libesort/libesort.a lurker_index_SOURCES = Index.cpp main.cpp getdate.cpp Index.h getdate.h lurker_list_SOURCES = list.cpp lurker_params_SOURCES = params.cpp lurker_search_SOURCES = search.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu index/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu index/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) lurker-index$(EXEEXT): $(lurker_index_OBJECTS) $(lurker_index_DEPENDENCIES) @rm -f lurker-index$(EXEEXT) $(CXXLINK) $(lurker_index_OBJECTS) $(lurker_index_LDADD) $(LIBS) lurker-list$(EXEEXT): $(lurker_list_OBJECTS) $(lurker_list_DEPENDENCIES) @rm -f lurker-list$(EXEEXT) $(CXXLINK) $(lurker_list_OBJECTS) $(lurker_list_LDADD) $(LIBS) lurker-params$(EXEEXT): $(lurker_params_OBJECTS) $(lurker_params_DEPENDENCIES) @rm -f lurker-params$(EXEEXT) $(CXXLINK) $(lurker_params_OBJECTS) $(lurker_params_LDADD) $(LIBS) lurker-search$(EXEEXT): $(lurker_search_OBJECTS) $(lurker_search_DEPENDENCIES) @rm -f lurker-search$(EXEEXT) $(CXXLINK) $(lurker_search_OBJECTS) $(lurker_search_LDADD) $(LIBS) install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(dist_bin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(dist_binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(dist_binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Index.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/params.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-dist_binSCRIPTS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_binSCRIPTS \ uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-data-local \ install-dist_binSCRIPTS install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-dist_binSCRIPTS uninstall-man uninstall-man1 # Create the database directory install-data-local: $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/$(PACKAGE) # Generate man pages if in maintainer mode @MAINTAINER_MODE_TRUE@lurker-index.1: lurker-index.sgml @MAINTAINER_MODE_TRUE@ docbook-to-man $< > $@ @MAINTAINER_MODE_TRUE@lurker-list.1: lurker-list.sgml @MAINTAINER_MODE_TRUE@ docbook-to-man $< > $@ @MAINTAINER_MODE_TRUE@lurker-params.1: lurker-params.sgml @MAINTAINER_MODE_TRUE@ docbook-to-man $< > $@ @MAINTAINER_MODE_TRUE@lurker-search.1: lurker-search.sgml @MAINTAINER_MODE_TRUE@ docbook-to-man $< > $@ @MAINTAINER_MODE_TRUE@lurker-regenerate.1: lurker-regenerate.sgml @MAINTAINER_MODE_TRUE@ docbook-to-man $< > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/index/lurker-params.10000644000175000017500000000504211267070017013563 00000000000000.TH "LURKER\-PARAMS" "1" .SH "NAME" lurker\-params \(em parses parameters from the config file .SH "SYNOPSIS" .PP \fBlurker\-params\fR [\-c ] [\-f ] [\-d \-u \-a \-n \-e \-x \-m \-i \-k \-w \-h \-r] .SH "DESCRIPTION" .PP \fBlurker\-params\fR outputs various lurker settings from the config file for use in shell scripts. Do not use sed/grep/etc, instead use this as it respects include. .SH "OPTIONS" .IP "\fB\-c config-file\fP" 10 Use this config file for lurker settings. .IP "\fB\-f locale\fP" 10 Choose lurker config fields from the specified locale (it defaults to selecting the fallback case for each field). .IP "\fB\-d\fP" 10 Output only the dbdir parameter .IP "\fB\-u\fP" 10 Output only the db_umask parameter .IP "\fB\-a\fP" 10 Output only the archive parameter .IP "\fB\-n\fP" 10 Output only the administrator name .IP "\fB\-e\fP" 10 Output only the administrator email address .IP "\fB\-x\fP" 10 Output only the xslt processing command .IP "\fB\-m\fP" 10 Output only the mime pgp verifying command .IP "\fB\-i\fP" 10 Output only the inline pgp verifying command .IP "\fB\-k\fP" 10 Output only the command for deleting a message .IP "\fB\-w\fP" 10 Output only the web_cache state .IP "\fB\-h\fP" 10 Output only the hide_email state .IP "\fB\-r\fP" 10 Output only the raw_email state .SH "SEE ALSO" .PP lurker\-index(1), lurker\-prune(1), lurker\-list(1), lurker\-search(1) .PP lurker documentation on http://lurker.sourceforge.net/ .SH "COPYRIGHT" .PP Copyright (C) 2002: Wesley W. Terpstra .PP This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. .PP This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. .PP You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place \- Suite 330, Boston, MA 02111-1307, USA. .SH "BUGS" .PP Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to . .\" created by instant / docbook-to-man, Fri 10 Mar 2006, 01:49 lurker-2.3/index/lurker-index.10000644000175000017500000001244511267070017013414 00000000000000.TH "LURKER\-INDEX" "1" .SH "NAME" lurker\-index \(em imports messages into the archive .SH "SYNOPSIS" .PP \fBlurker\-index\fR [\-c ] [\-l ] [\-i ] [\-v \-d \-n \-u \-f] [\-m] .SH "DESCRIPTION" .PP \fBlurker\-index\fR indexes messages from standard input and stores them in the lurker database. It imports either a single message, or a batch of messages in mbox format. .PP It is important to note that lurker messages in order and may miss new messages delivered during the import. For this reason, you should setup lurker to receive new mail before importing old mail. Only use lurker\-index on inactive mail folders! .PP By default, lurker\-index reads from standard input in mbox format, delimited by 'From ' lines. Be aware that if the mbox is not delimited correctly between messages it will be interpretted as a single message with an invalid date. To read other sources, see the '\-i' option. If input is a single email, use '\-m'. .SH "OPTIONS" .IP "\fB\-c config-file\fP" 10 Use this config file for lurker settings. .IP "\fB\-l listid\fP" 10 Import messages to the named mailing list. This should match the value in the lurker.conf after the 'list = ' entry. .IP "\fB\-m\fP" 10 Import a single message. In this mode lurker will never interpret 'From ' lines as message delimiters. When being fed newly delivered mail, this is the preferred mode of operation. Try to turn off the 'From ' escaping of your MTA when using this mode, as lurker does it's own escaping which is generally smarter. .IP "" 10 This option should be used when lurker\-index is invoked by the MTA for newly delivered email. .IP "\fB\-i mbox/maildir\fP" 10 Import messages from the specified mailbox or maildir. Lurker\-index by default reads a mailbox (mbox format) from standard input. If the '\-i' parameter is a file, the file is assumed to be in the mbox format and is read instead of standard input. If the parameter is a directory, the directory is assumed to be in maildir format. .IP "" 10 If '\-m' is used, the input MUST be a raw email, preferably with a mbox header, never a maildir. .IP "\fB\-v\fP" 10 Verbose operation. Lurker will output statistics about import speed to assist you in tweaking options for best throughput on your system. It also helps you know how much longer you will have to wait. .IP "\fB\-d\fP" 10 Drop duplicates per list. This option will check the database to see if the message has already been imported to a mailing list. Only if it has not been imported will lurker append it to the mailbox. Even without this option lurker does not index a message twice. If an import failed part-way through, you probably want this option to avoid needless replication. However, to generate mailboxes which accurately reflect delivery, leave the option off. .IP "\fB\-n\fP" 10 Don't compress messages. This will increase the database size and import speed. Lurker can handle a database with mixed compressed and uncompressed messages. However, zcat/gzip and database upgrades cannot. If you need these to function, you should never mix compressed and uncompressed messages within a single mailing list. .IP "\fB\-u\fP" 10 Trust user Date headers from the email more than the delivery time. Normally lurker compares the two and if the user time differs too much from the delivery time, the delivery time is used instead. When this option is used, lurker will simply trust the user Date header whenever it exists, otherwise it uses the delivery time. .IP "" 10 This option should never be used as a default. It is intended for dealing with corrupt mailboxes or maildirs. A better solution than using this option is to find an uncorrupted copy of the mail. .IP "\fB\-f\fP" 10 Fast import (but vulnerable to power-failure). This may improve the lifetime of your hard-disk and increase import speed by up to 30%. However, if the power fails during import or shortly thereafter, it is possible you will have a corrupted database. If you use a journaling filesystem, lurker guarantees no corruption when you OMIT this parameter. .SH "SEE ALSO" .PP lurker\-prune(1), lurker\-params(1), lurker\-list(1), lurker\-search(1) .PP lurker documentation on http://lurker.sourceforge.net/ .SH "COPYRIGHT" .PP Copyright (C) 2002: Wesley W. Terpstra .PP This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. .PP This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. .PP You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place \- Suite 330, Boston, MA 02111-1307, USA. .SH "BUGS" .PP Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to . .\" created by instant / docbook-to-man, Mon 24 Apr 2006, 01:15 lurker-2.3/index/params.cpp0000644000175000017500000001243211267147270012712 00000000000000/* $Id: params.cpp 1661 2009-10-19 20:40:20Z terpstra $ * * params.cpp - Parse the config file for helper scripts * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include using namespace std; void help(const char* name) { cerr << "Lurker-params (v" << VERSION << ") parses params from the config file.\n"; cerr << "\n"; cerr << "Usage: " << name << " [-c ] [-f ]\n"; cerr << " [-d -u -a -n -e -x -m -i -k -w -h -r]\n"; cerr << "\n"; cerr << "\t-c Use this config file for lurker settings\n"; cerr << "\t-f Output the fields for this locale\n"; cerr << "\t-d Output only the dbdir parameter\n"; cerr << "\t-u Output only the db_umask parameter\n"; cerr << "\t-a Output only the archive parameter\n"; cerr << "\t-n Output only the administrator name\n"; cerr << "\t-e Output only the administrator email address\n"; cerr << "\t-x Output only the xslt processing command\n"; cerr << "\t-m Output only the mime pgp verifying command\n"; cerr << "\t-i Output only the inline pgp verifying command\n"; cerr << "\t-k Output only the message delete command\n"; cerr << "\t-w Output only the web_cache state\n"; cerr << "\t-h Output only the hide_email state\n"; cerr << "\t-r Output only the raw_email state\n"; cerr << "\n"; cerr << "Output various lurker settings from the config file for use in shell scripts.\n"; cerr << "Do not use sed/grep/etc, instead use this as it respects include.\n"; cerr << "\n"; } int main(int argc, char** argv) { int c; const char* config = DEFAULT_CONFIG_FILE; int fields = 0; bool dbdir = false; bool db_umask = false; bool archive = false; bool admin_name = false; bool admin_address = false; bool xslt = false; bool pgpv_mime = false; bool pgpv_inline = false; bool delete_message= false; bool web_cache = false; bool hide_email = false; bool raw_email = false; string lc; while ((c = getopt(argc, (char*const*)argv, "c:f:duanexmikwhr?")) != -1) { switch ((char)c) { case 'c': config = optarg; break; case 'f': lc = optarg; break; case 'd': ++fields; dbdir = true; break; case 'u': ++fields; db_umask = true; break; case 'a': ++fields; archive = true; break; case 'n': ++fields; admin_name = true; break; case 'e': ++fields; admin_address = true; break; case 'x': ++fields; xslt = true; break; case 'm': ++fields; pgpv_mime = true; break; case 'i': ++fields; pgpv_inline = true; break; case 'k': ++fields; delete_message = true; break; case 'w': ++fields; web_cache = true; break; case 'h': ++fields; hide_email = true; break; case 'r': ++fields; raw_email = true; break; default: help(argv[0]); return 1; } } while (optind < argc) { if (!argv[optind][0]) { // ignore empty arguments optind++; continue; } cerr << "Unexpected argument: '" << argv[optind] << "'\n"; return 1; } if (fields >= 2) { cerr << "Please either retrieval all fields or exactly one.\n"; return 1; } Config cfg; if (cfg.load(config) != 0) { cerr << cfg.getError() << flush; return 1; } if (!fields || dbdir) cout << cfg.dbdir << "\n"; if (!fields || db_umask) { if (cfg.db_umask == -1) cout << "user" << "\n"; else cout << "0" << oct << cfg.db_umask << "\n"; } if (!fields || archive) cout << cfg.archive(lc) << "\n"; if (!fields || admin_name) cout << cfg.admin_name(lc) << "\n"; if (!fields || admin_address) cout << cfg.admin_address << "\n"; if (!fields || xslt) cout << cfg.xslt << "\n"; if (!fields || pgpv_mime) cout << cfg.pgpv_mime << "\n"; if (!fields || pgpv_inline) cout << cfg.pgpv_inline << "\n"; if (!fields || delete_message)cout << cfg.delete_message << "\n"; if (!fields || web_cache) cout << (cfg.web_cache?"on":"off") << "\n"; if (!fields || hide_email) cout << (cfg.hide_email?"on":"off") << "\n"; if (!fields || raw_email) cout << (cfg.raw_email?"on":"off") << "\n"; return 0; } lurker-2.3/index/lurker-search.10000644000175000017500000000532111267070017013545 00000000000000.TH "LURKER\-SEARCH" "1" .SH "NAME" lurker\-search \(em searches for messages in a lurker database .SH "SYNOPSIS" .PP \fBlurker\-search\fR [\-c ] [\-k ] [\-d \-f \-i \-v \-q] [*] .SH "DESCRIPTION" .PP \fBlurker\-search\fR searches a lurker database the same way as the web interface. It can output summary information and delete messages. .SH "OPTIONS" .IP "\fB\-c config-file\fP" 10 Use this config file for lurker settings. .IP "\fB\-k keyword\fP" 10 Tag the matching messages with this keyword. .IP "\fB\-d\fP" 10 Delete the messages found by this search .IP "\fB\-f\fP" 10 Don't prompt before deleting .IP "\fB\-i\fP" 10 Command line paramers are not search terms, but message IDs. .IP "\fB\-v\fP" 10 Output message summary information .IP "\fB\-q\fP" 10 Don't output message ids or status .SH "SEARCH TERMS" .PP Lurker-search accepts these keywords for searching: .IP "\fB\-xxx\fP" 10 select messages which do NOT match this term .IP "\fBid:xxx\fP" 10 select a message by the Message-ID field .IP "\fBrt:xxx\fP" 10 select messages which reply to the chosen Message-ID .IP "\fBth:xxx\fP" 10 select messages included in this thread .IP "\fBml:xxx\fP" 10 select messages in this mailing list .IP "\fBgr:xxx\fP" 10 select messages in this mailing list group .IP "\fBau:xxx\fP" 10 select messages with this term in the author fields .IP "\fBsb:xxx\fP" 10 select messages with this word in the subject .IP "\fBlang:xxx\fP" 10 select messages in this language .SH "SEE ALSO" .PP lurker\-index(1), lurker\-prune(1), lurker\-params(1), lurker\-list(1) .PP lurker documentation on http://lurker.sourceforge.net/ .SH "COPYRIGHT" .PP Copyright (C) 2002: Wesley W. Terpstra .PP This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. .PP This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. .PP You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place \- Suite 330, Boston, MA 02111-1307, USA. .SH "BUGS" .PP Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to . .\" created by instant / docbook-to-man, Wed 28 Jun 2006, 17:53 lurker-2.3/index/lurker-search.sgml0000644000175000017500000001625211267070017014354 00000000000000 lurker-search.1'. You may view the manual page with: `docbook-to-man lurker-search.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: lurker-search.1: lurker-search.sgml docbook-to-man $< > $@ --> Wesley W."> Terpstra"> Jun 4, 2003"> 1"> terpstra@users.sourceforge.net"> lurker\-users@lists.sourceforge.net"> LURKER\-SEARCH"> lurker"> GNU"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2004 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; searches for messages in a lurker database &dhpackage; \-c <config-file> \-k <keyword> \-d \-f \-i \-v \-q <terms>* DESCRIPTION &dhpackage; searches a lurker database the same way as the web interface. It can output summary information and delete messages. OPTIONS Use this config file for lurker settings. Tag the matching messages with this keyword. Delete the messages found by this search Don't prompt before deleting Command line paramers are not search terms, but message IDs. Output message summary information Don't output message ids or status SEARCH TERMS Lurker-search accepts these keywords for searching: select messages which do NOT match this term select a message by the Message-ID field select messages which reply to the chosen Message-ID select messages included in this thread select messages in this mailing list select messages in this mailing list group select messages with this term in the author fields select messages with this word in the subject select messages in this language SEE ALSO lurker\-index(1), lurker\-prune(1), lurker\-params(1), lurker\-list(1) lurker documentation on http://lurker.sourceforge.net/ COPYRIGHT Copyright (C) 2002: &dhusername; <&dhemail;> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. BUGS Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to <&support;>.
lurker-2.3/index/lurker-params.sgml0000644000175000017500000001523211267070017014367 00000000000000 lurker-params.1'. You may view the manual page with: `docbook-to-man lurker-params.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: lurker-params.1: lurker-params.sgml docbook-to-man $< > $@ --> Wesley W."> Terpstra"> Jun 4, 2003"> 1"> terpstra@users.sourceforge.net"> lurker\-users@lists.sourceforge.net"> LURKER\-PARAMS"> lurker"> GNU"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2003 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; parses parameters from the config file &dhpackage; \-c <config-file> \-f <locale> \-d \-u \-a \-n \-e \-x \-m \-i \-k \-w \-h \-r DESCRIPTION &dhpackage; outputs various lurker settings from the config file for use in shell scripts. Do not use sed/grep/etc, instead use this as it respects include. OPTIONS Use this config file for lurker settings. Choose lurker config fields from the specified locale (it defaults to selecting the fallback case for each field). Output only the dbdir parameter Output only the db_umask parameter Output only the archive parameter Output only the administrator name Output only the administrator email address Output only the xslt processing command Output only the mime pgp verifying command Output only the inline pgp verifying command Output only the command for deleting a message Output only the web_cache state Output only the hide_email state Output only the raw_email state SEE ALSO lurker\-index(1), lurker\-prune(1), lurker\-list(1), lurker\-search(1) lurker documentation on http://lurker.sourceforge.net/ COPYRIGHT Copyright (C) 2002: &dhusername; <&dhemail;> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. BUGS Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to <&support;>.
lurker-2.3/index/lurker-regenerate0000755000175000017500000000232511267070017014266 00000000000000#! /bin/sh -e # Options: [path to lurker-*] [config file] epath="$1" cfg="$2" if ! test -z "$epath"; then \ if ! echo "$epath" | grep -q "^/"; then echo If a path is specified, it must be absolute exit 1 fi epath="$epath/"; fi if ! test -z "$cfg"; then \ if ! echo "$cfg" | grep -q "^/"; then echo If a config file is specified, its path must be absolute exit 1 fi copt="-c" fi dbdir=`"${epath}lurker-params" $copt "$cfg" -d` cd "$dbdir" if test -d .tmp; then \ echo "The database appears to be in the middle of a conversion already." echo "Please deal with the '.tmp' folder in the $dbdir and try again" exit 1 fi mkdir .tmp cd .tmp mv -i ../* . for l in `"${epath}lurker-list" $copt "$cfg" -i`; do echo Reindexing $l if ! test -f $l; then continue; fi gzip -dfc < $l | "${epath}lurker-index" $copt "$cfg" -p ./db -l $l -v done cd .. rm -rf .tmp echo echo "Database has been regenerated; please double-check the permissions" echo "Now flushing all web cache (re-run as root if you lack www permission)" echo " ${epath}lurker-prune $copt $cfg -p" "${epath}lurker-prune" $copt "$cfg" -p lurker-2.3/index/list.cpp0000644000175000017500000001127011267074431012377 00000000000000/* $Id: list.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * list.cpp - Parse the config file for helper scripts * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include using namespace std; void help(const char* name) { cerr << "Lurker-list (v" << VERSION << ") parses lists from the config file.\n"; cerr << "\n"; cerr << "Usage: " << name << " [-c ] [-f ]\n"; cerr << " [-i -g -t -a -l -d -s -o] [listid ...]\n"; cerr << "\n"; cerr << "\t-c Use this config file for lurker settings\n"; cerr << "\t-f Output the fields for this locale\n"; cerr << "\t-i Output only the list id\n"; cerr << "\t-g Output only the group\n"; cerr << "\t-t Output only the title\n"; cerr << "\t-a Output only the email address\n"; cerr << "\t-l Output only the url link\n"; cerr << "\t-d Output only the description\n"; cerr << "\t-s Output only the language\n"; cerr << "\t-o Output only the offline status\n"; cerr << "\n"; cerr << "Output various lurker settings from the config file for use in shell scripts.\n"; cerr << "Do not use sed/grep/etc, instead use this as it respects include.\n"; cerr << "\n"; } int main(int argc, char** argv) { int c; const char* config = DEFAULT_CONFIG_FILE; int fields = 0; bool ids = false; bool group = false; bool title = false; bool address = false; bool link = false; bool desc = false; bool language = false; bool offline = false; string lc; while ((c = getopt(argc, (char*const*)argv, "c:f:igtaldso?")) != -1) { switch ((char)c) { case 'c': config = optarg; break; case 'f': lc = optarg; break; case 'i': ++fields; ids = true; break; case 'g': ++fields; group = true; break; case 't': ++fields; title = true; break; case 'a': ++fields; address = true; break; case 'l': ++fields; link = true; break; case 'd': ++fields; desc = true; break; case 's': ++fields; language = true; break; case 'o': ++fields; offline = true; break; default: help(argv[0]); return 1; } } if (fields >= 2) { cerr << "Please either retrieval all fields or exactly one.\n"; return 1; } Config cfg; if (cfg.load(config) != 0) { cerr << cfg.getError() << flush; return 1; } vector output; for (; optind < argc; ++optind) { if (!argv[optind][0]) continue; // ignore empty arguments Config::Lists::const_iterator l = cfg.lists.find(argv[optind]); if (l == cfg.lists.end()) { cerr << "'" << argv[optind] << "' is not a mailing list id.\n"; return 1; } output.push_back(l->second); } if (output.empty()) { Config::Lists::const_iterator l; for (l = cfg.lists.begin(); l != cfg.lists.end(); ++l) output.push_back(l->second); } if (lc != "" && !lstring::locale_normalize(lc)) { cerr << "'" << lc << "' is not a valid locale\n"; return 1; } vector::const_iterator o; for (o = output.begin(); o != output.end(); ++o) { if (!fields || ids) cout << o->mbox << "\n"; if (!fields || group) cout << o->group << "\n"; if (!fields || title) cout << o->title(lc) << "\n"; if (!fields || address) cout << o->address << "\n"; if (!fields || link) cout << o->link(lc) << "\n"; if (!fields || desc) cout << o->description(lc) << "\n"; if (!fields || language) { set::const_iterator i, e; for (i = o->languages.begin(), e = o->languages.end(); i != e; ) { cout << *i; ++i; if (i == e) cout << "\n"; else cout << ","; } } if (!fields || offline) cout << (o->offline?"true\n":"false\n"); } return 0; } lurker-2.3/index/Makefile.am0000644000175000017500000000216611267070017012754 00000000000000bin_PROGRAMS = lurker-index lurker-list lurker-params lurker-search dist_bin_SCRIPTS = lurker-regenerate dist_man_MANS = lurker-index.1 lurker-list.1 lurker-params.1 \ lurker-search.1 lurker-regenerate.1 EXTRA_DIST = lurker-drop-rlimit.cpp \ lurker-index.sgml lurker-list.sgml lurker-params.sgml \ lurker-search.sgml lurker-regenerate.sgml AM_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/libesort LDADD = ../common/libcommon.a ../libesort/libesort.a lurker_index_SOURCES = Index.cpp main.cpp getdate.cpp Index.h getdate.h lurker_list_SOURCES = list.cpp lurker_params_SOURCES = params.cpp lurker_search_SOURCES = search.cpp # Create the database directory install-data-local: $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/$(PACKAGE) # Generate man pages if in maintainer mode if MAINTAINER_MODE lurker-index.1: lurker-index.sgml docbook-to-man $< > $@ lurker-list.1: lurker-list.sgml docbook-to-man $< > $@ lurker-params.1: lurker-params.sgml docbook-to-man $< > $@ lurker-search.1: lurker-search.sgml docbook-to-man $< > $@ lurker-regenerate.1: lurker-regenerate.sgml docbook-to-man $< > $@ endif lurker-2.3/index/lurker-regenerate.10000644000175000017500000000443011267070017014421 00000000000000.TH "LURKER\-REGENERATE" "1" .SH "NAME" lurker\-regenerate \(em imports messages into the archive .SH "SYNOPSIS" .PP \fBlurker\-regenerate\fR [] [] .SH "DESCRIPTION" .PP \fBlurker\-regenerate\fR regenerates a lurker database. It generates a new database first, then replaces the old one with the new one. You will need enough diskspace for a full copy of the database that you want to regenerate. The two arguments are optional. .PP Regenerating the lurker database is the only way to recover disk space from deleted emails. If you delete an entire mailing list, you should regenerate the database. .PP Be aware of the fact that lurker-regenerate supports only databases from lurker >= 0.6. If you want to regenerate databases from earlier versions of lurker, you'll need to rm \-rf the whole database and reimport it manually. .SH "OPTIONS" .IP "\fBbin-dir\fP" 10 The directory containing lurker-{index,list,params,prune}. This defaults to where 'make install' placed them. .IP "\fBconfig-file\fP" 10 The config-file for which lurker-regenerate rebuilds the database. .SH "SEE ALSO" .PP lurker\-index(1), lurker\-list(1), lurker\-params(1), lurker\-prune(1), lurker\-search(1) .PP lurker documentation on http://lurker.sourceforge.net/ .SH "COPYRIGHT" .PP Copyright (C) 2003-2006: Jonas Meurer .PP This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. .PP This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. .PP You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place \- Suite 330, Boston, MA 02111-1307, USA. .SH "BUGS" .PP Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to <>. .\" created by instant / docbook-to-man, Mon 27 Feb 2006, 16:28 lurker-2.3/index/getdate.h0000644000175000017500000000444511267070017012510 00000000000000/* A Bison parser, made by GNU Bison 1.875a. */ /* Skeleton parser for Yacc-like parsing with Bison, Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { tAGO = 258, tDST = 259, tDAY = 260, tDAY_UNIT = 261, tDAYZONE = 262, tHOUR_UNIT = 263, tLOCAL_ZONE = 264, tMERIDIAN = 265, tMINUTE_UNIT = 266, tMONTH = 267, tMONTH_UNIT = 268, tSEC_UNIT = 269, tYEAR_UNIT = 270, tZONE = 271, tSNUMBER = 272, tUNUMBER = 273 }; #endif #define tAGO 258 #define tDST 259 #define tDAY 260 #define tDAY_UNIT 261 #define tDAYZONE 262 #define tHOUR_UNIT 263 #define tLOCAL_ZONE 264 #define tMERIDIAN 265 #define tMINUTE_UNIT 266 #define tMONTH 267 #define tMONTH_UNIT 268 #define tSEC_UNIT 269 #define tYEAR_UNIT 270 #define tZONE 271 #define tSNUMBER 272 #define tUNUMBER 273 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) #line 154 "getdate.y" typedef union YYSTYPE { int intval; textint textintval; } YYSTYPE; /* Line 1240 of yacc.c. */ #line 78 "y.tab.h" # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif lurker-2.3/index/Index.cpp0000644000175000017500000003723111267074431012500 00000000000000/* $Id: Index.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * index.cpp - Insert all the keywords from the given email * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Index.h" #include "Summary.h" #include #include #include #include #include #include using namespace std; #define MAX_MESSAGE_ID 80 void utf8Truncate(string& str, string::size_type len) { if (str.length() < len) return; // look for nasty utf-8 stuff that's dangling and crop it while (len && ((unsigned char)str[len-1]) >= 0x80 && ((unsigned char)str[len-1]) <= 0xBF) --len; // now rewind off potential utf-8 start bytes while (len && ((unsigned char)str[len-1]) >= 0xC0) --len; // len is now at the end of a complete multi-byte element or ascii str.resize(len); } static inline char my_toupper(char x) { if (x >= 'a' && x <= 'z') return x - 'a' + 'A'; else return x; } static bool strings_equal_case_ignored(const string& a, const string& b) { if (a.length() != b.length()) return false; for (string::size_type i = 0; i < a.length(); ++i) if (my_toupper(a[i]) != my_toupper(b[i])) return false; return true; } // first = address, second = name pair pickAddress(DwAddress* a, const char* charset) { for (; a != 0; a = a->Next()) { if (a->IsGroup()) { DwGroup* g = dynamic_cast(a); if (g) { pair out = pickAddress( g->MailboxList().FirstMailbox(), charset); if (out.first != "") return out; } } else { DwMailbox* m = dynamic_cast(a); if (m) { string name = m->FullName().c_str(); name = decode_header(name, charset); DwString addr = m->LocalPart() + "@" + m->Domain(); // fucked address? (one cannot safely cut this) if (addr.length() > 128 || m->LocalPart() == "" || m->Domain() == "") { addr = ""; } for (size_t i = 0; i < addr.length(); ++i) { if (addr[i] <= 0x20 || addr[i] >= 0x7f) { // fucked up address addr = ""; break; } } // prune any optional quotes if (name.length() >= 2 && name[0] == '"') name = name.substr(1, name.length()-2); if (addr != "") return pair(addr.c_str(), name); } } } return pair("", ""); } int Index::index_author() { // one always has headers, but not always this function: // if (message.hasHeaders()) charset = "ISO-8859-1"; // a good default as any if (message.Headers().HasContentType()) { DwParameter* p = message.Headers().ContentType().FirstParameter(); while (p) { if (p->Attribute() == "charset") charset = p->Value().c_str(); p = p->Next(); } } // pickAddress only gives an author_name if it gave an author_email if (message.Headers().HasReplyTo()) { pair addr = pickAddress( message.Headers().ReplyTo().FirstAddress(), charset.c_str()); author_email = addr.first; author_name = addr.second; // Some evil mailing lists set reply-to the list. if (strings_equal_case_ignored(author_email, list.address)) { author_email = ""; author_name = ""; } } // Given a reply-to that is not the list, we allow the from to // provide a fullname under the assumption it is the same person. if (message.Headers().HasFrom()) { pair addr = pickAddress( message.Headers().From().FirstMailbox(), charset.c_str()); if (!author_email.length()) author_email = addr.first; if (!author_name .length()) author_name = addr.second; } // ditto if (message.Headers().HasSender()) { pair addr = pickAddress( &message.Headers().Sender(), charset.c_str()); if (!author_email.length()) author_email = addr.first; if (!author_name .length()) author_name = addr.second; } author_name = whitespace_sanitize(author_name); utf8Truncate(author_name, 100); // - nothing longer than 128 could get here (from above) // - one can never safely truncate an email address // utf8Truncate(author_email, 100); return 0; } // Doesn't vary with charset inline bool lu_isspace(char x) { return x == ' ' || x == '\n' || x == '\r' || x == '\t'; } void build_message_hash(const char* str, unsigned char* hash) { MD5Context ctx; MD5Init(&ctx); MD5Update(&ctx, (const unsigned char*)str, strlen(str)); unsigned char buf[16]; MD5Final(buf, &ctx); hash[0] = buf[0] ^ buf[4] ^ buf[ 8] ^ buf[12]; hash[1] = buf[1] ^ buf[5] ^ buf[ 9] ^ buf[13]; hash[2] = buf[2] ^ buf[6] ^ buf[10] ^ buf[14]; hash[3] = buf[3] ^ buf[7] ^ buf[11] ^ buf[15]; } int feed_writer(const char* keyword, void* arg) { Index* i = (Index*)arg; string x(LU_KEYWORD); x += keyword; x += '\0'; x += i->id.raw(); return i->writer->insert(x); } int Index::index_id(bool userdate, time_t server, bool& exist) { time_t stamp = server; string messageId; unsigned char hash[4]; // if (message.hasHeaders()) if (message.Headers().HasDate()) { time_t user = message.Headers().Date().AsUnixTime(); /* User time must be earlier; there is delivery delay! * However, more than 7 day delivery time is unlikely. */ if ((user <= server && server < user+7*60*60*24) || userdate || // trusting the userdate? server <= 0) // server is on crack? stamp = user; } if (stamp <= 0) { // this is crazy; I don't care if they agree: it's wrong stamp = 1; // liers all have timestamp 1970-01-01 00:00:01 } if (message.Headers().HasMessageId()) { vector ids = extract_message_ids( message.Headers().MessageId().AsString().c_str()); if (!ids.empty()) messageId = ids.front(); } if (messageId.length()) { // Constant message-id across import, and threadable build_message_hash(messageId.c_str(), hash); } else if (author_email.length()) { // This means no proper threading. // At least the message-id is constant across import. build_message_hash(author_email.c_str(), hash); } else { // Can't make any guarantees; just import it. hash[0] = random() % 256; hash[1] = random() % 256; hash[2] = random() % 256; hash[3] = random() % 256; } id = MessageId(stamp, hash); if (blacklist.find(id) != blacklist.end()) { // Messages marked as blacklisted use the 'exist' flag to // avoid being imported into the database. exist = true; return 0; } if (messageId.length()) { // Raw message-id for threading if (writer->insert( LU_KEYWORD + string(LU_KEYWORD_MESSAGE_ID) + messageId + '\0' + id.raw()) != 0) { cerr << "Failed to insert message id keyword!" << endl; return -1; } // digested message-id for user searches if (my_keyword_digest_string( messageId.c_str(), messageId.length(), LU_KEYWORD_MESSAGE_ID, &feed_writer, this, 0) != 0) { cerr << "Failed to index message-id" << endl; return -1; } } if (writer->insert( LU_KEYWORD + string(LU_KEYWORD_EVERYTHING) + '\0' + id.raw()) != 0) { cerr << "Failed to the any keyword!" << endl; return -1; } return 0; } int Index::index_summary(bool check, bool& exist) { string prefix = LU_SUMMARY + id.raw(); if (message.Headers().HasSubject()) { subject = message.Headers().Subject().AsString().c_str(); subject = decode_header(subject, charset.c_str()); } if (subject == "") subject = "[...]"; string mbox = prefix + LU_MESSAGE_MBOX + list.mbox + '\0'; if (check) { // Check for existance auto_ptr w(writer->seek(mbox, "", ESort::Forward)); if (w->advance() == -1) { // was it just eof? if (errno != 0) return -1; } else { // if it suceeded. then ... it is already in there exist = true; return 0; } } unsigned char buf[12]; off_t o = off; long l = len; int i; for (i = 7; i >= 0; --i) { buf[i] = (o & 0xFF); o >>= 8; } for (i = 11; i >= 8; --i) { buf[i] = (l & 0xFF); l >>= 8; } // Don't let crazy stuff in there. utf8Truncate(subject, 200); if (writer->insert(prefix + LU_MESSAGE_AUTHOR_EMAIL + author_email) != 0 || writer->insert(prefix + LU_MESSAGE_AUTHOR_NAME + author_name) != 0 || writer->insert(prefix + LU_MESSAGE_SUBJECT + subject) != 0 || writer->insert(mbox + string((char*)buf, 12)) != 0) { cerr << "Failed to insert summary keys" << endl; return -1; } return 0; } int Index::index_threading() { string shash = subject_hash(subject.c_str()); string suffix; unsigned char hash[4]; if (writer->insert( LU_KEYWORD LU_KEYWORD_THREAD + shash + '\0' + id.raw()) != 0) { cerr << "Failed to insert threading keyword" << endl; return -1; } // if (message.hasHeaders()) if (message.Headers().HasInReplyTo()) { vector ids = extract_message_ids( message.Headers().InReplyTo().AsString().c_str()); // first in-reply-to is most relevant for (vector::iterator i = ids.begin(); i != ids.end(); ++i) { build_message_hash(i->c_str(), hash); // keep it reasonable; too many reply-tos is bad if (suffix.length() < 200) suffix.append((const char*)hash, 4); } } if (message.Headers().HasReferences()) { vector ids = extract_message_ids( message.Headers().References().AsString().c_str()); // last references is most recently added (most likely irt) for (vector::reverse_iterator i = ids.rbegin(); i != ids.rend(); ++i) { build_message_hash(i->c_str(), hash); // keep it reasonable; too many reply-tos is bad if (suffix.length() < 200) suffix.append((const char*)hash, 4); } } if (writer->insert( LU_THREADING + shash + id.raw() + suffix) != 0) { cerr << "Failed to insert threading keys" << endl; return -1; } if (writer->insert( LU_NEW_TOPICS + list.mbox + '\0' + id.raw().substr(0, 4) + shash) != 0) { cerr << "Failed to insert new topics keys" << endl; return -1; } return 0; } int Index::index_control(time_t import) { bool ok = true; if (writer->insert( LU_KEYWORD LU_KEYWORD_LIST + list.mbox + '\0' + id.raw()) != 0) ok = false; /* emulated group and language searches are impossibly slow. * these keywords are a must for large archives. */ if (writer->insert( LU_KEYWORD LU_KEYWORD_GROUP + list.group + '\0' + id.raw()) != 0) ok = false; set::const_iterator i, e; for (i = list.languages.begin(), e = list.languages.end(); i != e; ++i) if (writer->insert( LU_KEYWORD LU_KEYWORD_LANGUAGE + *i + '\0' + id.raw()) != 0) ok = false; MessageId importStamp(import); if (writer->insert( LU_CACHE + importStamp.raw().substr(0, 4) + id.raw()) != 0) ok = false; if (author_email.length()) { if (my_keyword_digest_string( author_email.c_str(), author_email.length(), LU_KEYWORD_AUTHOR, &feed_writer, this, 1) != 0) ok = false; } if (author_name.length()) { if (my_keyword_digest_string( author_name.c_str(), author_name.length(), LU_KEYWORD_AUTHOR, &feed_writer, this, 1) != 0) ok = false; } if (subject.length()) { if (my_keyword_digest_string( subject.c_str(), subject.length(), LU_KEYWORD_SUBJECT, &feed_writer, this, 1) != 0) ok = false; } if (message.Headers().HasInReplyTo()) { vector ids = extract_message_ids( message.Headers().InReplyTo().AsString().c_str()); for (vector::iterator i = ids.begin(); i != ids.end(); ++i) if (writer->insert( LU_KEYWORD LU_KEYWORD_REPLY_TO + *i + '\0' + id.raw()) != 0) ok = false; } #if 0 // this is questionable... if (message.Headers().HasReferences()) { vector ids = extract_message_ids( message.Headers().References().AsString().c_str()); for (vector::iterator i = ids.begin(); i != ids.end(); ++i) if (writer->insert( LU_KEYWORD LU_KEYWORD_REPLY_TO + *i + '\0' + id.raw()) != 0) ok = false; } #endif if (!ok) { cerr << "Failed to insert control keys" << endl; return -1; } return 0; } int Index::index_entity(DwEntity& e, const string& charset) { DwString text; if (e.Headers().HasContentTransferEncoding()) { switch (e.Headers().ContentTransferEncoding().AsEnum()) { case DwMime::kCteQuotedPrintable: DwDecodeQuotedPrintable(e.Body().AsString(), text); break; case DwMime::kCteBase64: DwDecodeBase64(e.Body().AsString(), text); break; case DwMime::kCteNull: case DwMime::kCteUnknown: case DwMime::kCte7bit: case DwMime::kCte8bit: case DwMime::kCteBinary: text = e.Body().AsString(); break; } } else { text = e.Body().AsString(); } CharsetEscape decode(charset.c_str()); string utf8 = decode.write(text.c_str(), text.length()); if (my_keyword_digest_string( utf8.c_str(), utf8.length(), LU_KEYWORD_WORD, &feed_writer, this, 1) != 0) { cerr << "Failed to index un-typed segment" << endl; return -1; } return 0; } int Index::index_keywords(DwEntity& e, const string& parentCharset) { string charset = parentCharset; if (e.Headers().HasContentType()) { DwMediaType& mt = e.Headers().ContentType(); for (DwParameter* p = mt.FirstParameter(); p; p = p->Next()) { DwString attr = p->Attribute(); attr.ConvertToLowerCase(); // case insens if (attr == "charset") charset = p->Value().c_str(); } } // if (e.hasHeaders() && if (e.Headers().HasContentType()) { DwMediaType& t = e.Headers().ContentType(); switch (t.Type()) { case DwMime::kTypeMessage: if (e.Body().Message()) index_keywords(*e.Body().Message(), charset); break; case DwMime::kTypeMultipart: // index all alternatives in multipart for (DwBodyPart* p = e.Body().FirstBodyPart(); p != 0; p = p->Next()) index_keywords(*p, charset); break; case DwMime::kTypeText: if (t.Subtype() == DwMime::kSubtypePlain) { if (index_entity(e, charset) != 0) return -1; } break; } } else { if (index_entity(e, charset) != 0) return -1; } return 0; } int Index::index(bool userdate, time_t envelope, time_t import, bool check, bool& exist) { exist = false; // cout << message.Headers().Subject().AsString().c_str() << endl; if (index_author() < 0) return -1; /* If the message is blacklisted, we mark it as 'existing' */ if (index_id(userdate, envelope, exist) < 0) return -1; if (exist) return 0; /* If the message is already imported, mark it as 'existing' */ if (index_summary(check, exist) < 0) return -1; if (exist) return 0; if (index_threading( ) < 0) return -1; if (index_control (import) < 0) return -1; if (index_keywords (message, "ISO-8859-1") < 0) return -1; return 0; } lurker-2.3/index/lurker-drop-rlimit.cpp0000644000175000017500000000044411267070017015165 00000000000000#include #include #include #include int main(int argc, char** argv) { struct rlimit rl; getrlimit(RLIMIT_FSIZE, &rl); rl.rlim_cur = rl.rlim_max; setrlimit(RLIMIT_FSIZE, &rl); execv(argv[1], argv+1); perror("execv"); return 1; } lurker-2.3/index/lurker-index.sgml0000644000175000017500000002255211267070017014216 00000000000000 lurker-index.1'. You may view the manual page with: `docbook-to-man lurker-index.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: lurker-index.1: lurker-index.sgml docbook-to-man $< > $@ --> Wesley W."> Terpstra"> May 10, 2003"> 1"> terpstra@users.sourceforge.net"> lurker\-users@lists.sourceforge.net"> LURKER\-INDEX"> Debian"> lurker"> GNU"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2003 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; imports messages into the archive &dhpackage; \-c <config-file> \-l <list> \-i <mbox/maildir> \-v \-d \-n \-u \-f \-m DESCRIPTION &dhpackage; indexes messages from standard input and stores them in the lurker database. It imports either a single message, or a batch of messages in mbox format. It is important to note that lurker messages in order and may miss new messages delivered during the import. For this reason, you should setup lurker to receive new mail before importing old mail. Only use lurker\-index on inactive mail folders! By default, lurker\-index reads from standard input in mbox format, delimited by 'From <addr> <date>' lines. Be aware that if the mbox is not delimited correctly between messages it will be interpretted as a single message with an invalid date. To read other sources, see the '\-i' option. If input is a single email, use '\-m'. OPTIONS Use this config file for lurker settings. Import messages to the named mailing list. This should match the value in the lurker.conf after the 'list = ' entry. Import a single message. In this mode lurker will never interpret 'From ' lines as message delimiters. When being fed newly delivered mail, this is the preferred mode of operation. Try to turn off the 'From ' escaping of your MTA when using this mode, as lurker does it's own escaping which is generally smarter. This option should be used when lurker\-index is invoked by the MTA for newly delivered email. Import messages from the specified mailbox or maildir. Lurker\-index by default reads a mailbox (mbox format) from standard input. If the '\-i' parameter is a file, the file is assumed to be in the mbox format and is read instead of standard input. If the parameter is a directory, the directory is assumed to be in maildir format. If '\-m' is used, the input MUST be a raw email, preferably with a mbox header, never a maildir. Verbose operation. Lurker will output statistics about import speed to assist you in tweaking options for best throughput on your system. It also helps you know how much longer you will have to wait. Drop duplicates per list. This option will check the database to see if the message has already been imported to a mailing list. Only if it has not been imported will lurker append it to the mailbox. Even without this option lurker does not index a message twice. If an import failed part-way through, you probably want this option to avoid needless replication. However, to generate mailboxes which accurately reflect delivery, leave the option off. Don't compress messages. This will increase the database size and import speed. Lurker can handle a database with mixed compressed and uncompressed messages. However, zcat/gzip and database upgrades cannot. If you need these to function, you should never mix compressed and uncompressed messages within a single mailing list. Trust user Date headers from the email more than the delivery time. Normally lurker compares the two and if the user time differs too much from the delivery time, the delivery time is used instead. When this option is used, lurker will simply trust the user Date header whenever it exists, otherwise it uses the delivery time. This option should never be used as a default. It is intended for dealing with corrupt mailboxes or maildirs. A better solution than using this option is to find an uncorrupted copy of the mail. Fast import (but vulnerable to power-failure). This may improve the lifetime of your hard-disk and increase import speed by up to 30%. However, if the power fails during import or shortly thereafter, it is possible you will have a corrupted database. If you use a journaling filesystem, lurker guarantees no corruption when you OMIT this parameter. SEE ALSO lurker\-prune(1), lurker\-params(1), lurker\-list(1), lurker\-search(1) lurker documentation on http://lurker.sourceforge.net/ COPYRIGHT Copyright (C) 2002: &dhusername; <&dhemail;> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. BUGS Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to <&support;>.
lurker-2.3/index/lurker-list.sgml0000644000175000017500000001372711267070017014066 00000000000000 lurker-list.1'. You may view the manual page with: `docbook-to-man lurker-list.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: lurker-list.1: lurker-list.sgml docbook-to-man $< > $@ --> Wesley W."> Terpstra"> Jun 4, 2003"> 1"> terpstra@users.sourceforge.net"> lurker\-users@lists.sourceforge.net"> LURKER\-LIST"> lurker"> GNU"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2003 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; parses lists from the config file &dhpackage; \-c <config-file> \-f <locale> \-i \-g \-t \-a \-l \-d \-s \-o listid ... DESCRIPTION &dhpackage; outputs various lurker settings from the config file for use in shell scripts. Do not use sed/grep/etc, instead use this as it respects include. If no list ids are given, then all lists are dumped. If no field is specified, then all fields are dumped. OPTIONS Use this config file for lurker settings. Choose lurker config fields from the specified locale (it defaults to selecting the fallback case for each field). Output only the list id Output only the group Output only the title Output only the email address Output only the url link Output only the description Output only the language Output only the offline status SEE ALSO lurker\-index(1), lurker\-prune(1), lurker\-params(1), lurker\-search(1) lurker documentation on http://lurker.sourceforge.net/ COPYRIGHT Copyright (C) 2002: &dhusername; <&dhemail;> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. BUGS Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to <&support;>.
lurker-2.3/index/Index.h0000644000175000017500000000365211267074431012145 00000000000000/* $Id: Index.h 1649 2009-10-19 14:35:01Z terpstra $ * * Index.h - Insert all the keywords from the given email * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef INDEX_H #define INDEX_H #include #include // off_t #include #include #include struct Index { DwMessage& message; ESort::Writer* writer; List list; const set& blacklist; off_t off; long len; MessageId id; string charset; string author_name; string author_email; string subject; Index(DwMessage& m, ESort::Writer* w, const List& l, const set& bl, off_t o, long x) : message(m), writer(w), list(l), blacklist(bl), off(o), len(x) { } int index(bool userdate, time_t envelope, time_t import, bool check, bool& exist); protected: int index_author(); int index_id(bool userdate, time_t envelope, bool& exist); int index_summary(bool check, bool& exist); int index_threading(); int index_control(time_t import); int index_entity(DwEntity& e, const string& charset); // decode + utf-8 transform int index_keywords(DwEntity& e, const string& parentCharset); }; #endif lurker-2.3/render/0000777000175000017500000000000011272633210011143 500000000000000lurker-2.3/render/main.cpp0000644000175000017500000002463711267074431012533 00000000000000/* $Id: main.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * main.cpp - Transform a database snapshot to useful output * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include "commands.h" #include "parse.h" #include #include // chdir /* #define DEBUG 1 */ using namespace std; void error( const string& main, const string& sub, const string& suggest, const string& header) { cout << "Status: 200 OK\r\n"; cout << header; /* optional additional header */ cout << "Content-Type: text/html\r\n\r\n"; cout << "\r\n" << "\r\n" << " Lurker - " << xmlEscape << main << "\r\n" << " \r\n" << "

Lurker - failed to render page:

\r\n" << "

" << xmlEscape << main << " (" << xmlEscape << sub << "):

\r\n" << xmlEscape << suggest << "\r\n" << "


\r\n" << " \r\n" << "\r\n"; exit(1); } void tokenize( const string& str, vector& tokens, const string& delimiters) { string::size_type lastPos = str.find_first_not_of(delimiters, 0); string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { tokens.push_back(str.substr(lastPos, pos - lastPos)); lastPos = str.find_first_not_of(delimiters, pos); pos = str.find_first_of(delimiters, lastPos); } } Request parse_request(const string& param) { string::size_type dot1 = param.rfind('.'); if (dot1 == string::npos || dot1 == 0) error(_("Missing extension"), param, _("An extension for the request was required, but missing")); string::size_type dot2 = param.rfind('.', dot1-1); // This is an attempt at backwards compatability. // Previously lurker had no language code in the URL, but still had // period delimited fields in message ids. The last part is always 8 // characters long, so we assume english if the country code is // not of length in [2, 8). // NOTE: some search URLs will still be broken (those with .s) if (dot2 != string::npos && (dot1 - dot2 < 2+1 || dot1 - dot2 >= 8+1)) dot2 = string::npos; Request out; if (dot2 == string::npos) { out.options = param.substr(0, dot1); out.language = "en"; out.ext = param.substr(dot1+1, string::npos); } else { out.options = param.substr(0, dot2); out.language = param.substr(dot2+1, (dot1-dot2) - 1); out.ext = param.substr(dot1+1, string::npos); } if (out.ext.length() < 3 || out.ext.length() > 6) error(_("Bogus extension"), out.ext, _("The extension is not 3-6 characters long.")); for (string::size_type i = 0; i < out.ext.length(); ++i) if ((out.ext[i] < 'a' || out.ext[i] > 'z') && (out.ext[i] < '0' || out.ext[i] > '9')) error(_("Bogus extension"), out.ext, _("Not simple lower-case alphanumeric letters.")); if (!lstring::locale_normalize(out.language)) error(_("Bogus locale"), out.language, _("The specified locale is not valid.")); return out; } int main(int argc, char** argv) { string config, frontend, document, request, host, port, cgipath, https, ok; const char* tmp; #if 0 setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); bind_textdomain_codeset(PACKAGE, "utf-8"); #endif // Every document about CGI agrees these exist: if ((tmp = getenv("SERVER_NAME" )) != 0) host = tmp; if ((tmp = getenv("SERVER_PORT" )) != 0) port = tmp; if ((tmp = getenv("SCRIPT_NAME" )) != 0) cgipath = tmp; // Many CGI 'standards' seem to agree this one exists for https: if ((tmp = getenv("HTTPS" )) != 0) https = tmp; // CGI guarantees this in case called as an error document if ((tmp = getenv("REDIRECT_URL")) != 0) request = tmp; // ... however, as we aren't always called that way, try this too: if ((tmp = getenv("REQUEST_URI" )) != 0) request = tmp; // get an over-ridden config location if ((tmp = getenv("REDIRECT_LURKER_CONFIG")) != 0) config = tmp; if ((tmp = getenv("LURKER_CONFIG")) != 0) config = tmp; // get the frontend location if ((tmp = getenv("REDIRECT_LURKER_FRONTEND")) != 0) document = tmp; if ((tmp = getenv("LURKER_FRONTEND")) != 0) document = tmp; if (request == "" || host == "" || port == "" || cgipath == "") error(_("Not invoked correctly"), _("CGI environment variables missing"), _("The lurker.cgi must be run as a CGI script. See the " "INSTALL file distributed with lurker for help setting " "up your webserver to run lurker.cgi. Lurker.cgi reads " "the environment variables REDIRECT_URL or REQUEST_URI " "to determine the missing file requested by the user. " "Also, SERVER_NAME, SERVER_PORT, and SCRIPT_NAME are " "used to build absolute redirected URLs.")); // be nice: use a default config file if (config == "") config = DEFAULT_CONFIG_FILE; Config cfg; if (cfg.load(config.c_str()) != 0) error(_("Cannot open config file"), "Config::load", cfg.getError() + _("\nPerhaps you should set the LURKER_CONFIG " "environment variable to select the correct " "config file location. See the INSTALL file for " "help on configuring your webserver.")); if (document == "" && cfg.frontends.size() > 1) error(_("No frontend specified"), "LURKER_FRONTEND", _("The lurker config file lists multiple frontends, " "however, the environment variable LURKER_FRONTEND " "does not specify which to use. See the INSTALL file " "for help on configuring your webserver.")); // be nice: if only one frontend, use it by default: if (document == "" && cfg.frontends.size() == 1) { document = cfg.frontends.begin()->first; } else { // Simplify the path to the requested document if ((ok = simplifyPath(document)) != "") error(_("Bad document request"), document, _("The path '") + ok + _("' could not be resolved while " "attempting to determine which frontend the document " "belongs to. Perhaps a directory does not exist?")); } // Look for the matching front-end frontend = ""; Config::Frontends::const_iterator i, e; for (i = cfg.frontends.begin(), e = cfg.frontends.end(); i != e; ++i) { // Either document IS the frontend path or it is a file // contained in the frontend path. if (i->first == document.substr(0, i->first.length()) || i->first + "/" == document.substr(0, i->first.length()+1)) { frontend = i->first; break; } } if (frontend == "") error(_("No matching frontend"), document, _("The frontend specified in the webserver " "configuration does not match any frontend in the " "lurker config file.")); cfg.set_permissions(cfg.frontends[frontend]); if (chdir(frontend.c_str()) != 0) error(_("Cannot chdir"), frontend + ":" + strerror(errno), _("The specified frontend path could " "not be entered. Check the path and permissions.")); auto_ptr db(ESort::Reader::opendb(cfg.dbdir + "/db")); if (!db.get()) error(_("Cannot open database snapshot"), strerror(errno), _("The configured database 'dbdir' in the config file " "could not be opened. Typically this means that it is " "not readable by the user which the cgi is invoked as. " "We suggest making dbdir and all files in it readable " "by everyone since you are serving them on a website " "anyways.")); request = decipherHalf(request); vector tokens; tokenize(request, tokens, "/"); if (tokens.size() < 2) error(_("Request malformed"), "tokenize(request)", _("The request does not have at least two directory " "components. It must be like ..../command/param.xml")); string param = tokens[tokens.size()-1]; string command = tokens[tokens.size()-2]; string server; if (document != frontend && frontend + '/' + command + '/' + param != document) error(_("Requested document is in error"), document, _("The requested document does not match the file " "lurker intends to generate: ") + frontend + '/' + command + '/' + param); if (https == "on") { server = "https://" + host; if (port != "443") server += ":" + port; } else { server = "http://" + host; if (port != "80") server += ":" + port; } cfg.cgiUrl = server + cgipath; string::size_type psplit; if ((psplit = cfg.cgiUrl.rfind('/')) != string::npos) cfg.cgiUrl.resize(psplit); vector::size_type tok; cfg.docUrl = server; for (tok = 0; tok < tokens.size()-2; ++tok) cfg.docUrl += "/" + tokens[tok]; // flush all request data in case user made it huge to be an ass tokens.clear(); request = ""; config = ""; cfg.command = command; if (command == "message") return handle_message(cfg, db.get(), param); else if (command == "thread") return handle_thread (cfg, db.get(), param); else if (command == "mindex") return handle_mindex (cfg, db.get(), param); else if (command == "splash") return handle_splash (cfg, db.get(), param); else if (command == "search") return handle_search (cfg, db.get(), param); else if (command == "attach") return handle_attach (cfg, db.get(), param); else if (command == "mbox") return handle_mbox (cfg, db.get(), param); else if (command == "list") return handle_list (cfg, db.get(), param); else if (command == "zap") return handle_zap (cfg, db.get(), param); else error(_("Bad command"), command, _("The requested command is not supported.")); } lurker-2.3/render/bounce.cpp0000644000175000017500000000206311267074431013047 00000000000000/* $Id: bounce.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * bounce.cpp - Bounce to the specified url * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "parse.h" int main() { map args = getParams(); return redirectUrl(args["url"]); } lurker-2.3/render/commands.h0000644000175000017500000000411111267074431013036 00000000000000/* $Id: commands.h 1649 2009-10-19 14:35:01Z terpstra $ * * commands.h - All the commands we support * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef COMMANDS_H #define COMMANDS_H #include #include #include #define _(x) x struct Request { string options; string language; string ext; }; Request parse_request(const string& param); int handle_message(const Config& c, ESort::Reader* r, const string& param); int handle_thread (const Config& c, ESort::Reader* r, const string& param); int handle_mindex (const Config& c, ESort::Reader* r, const string& param); int handle_splash (const Config& c, ESort::Reader* r, const string& param); int handle_search (const Config& c, ESort::Reader* r, const string& param); int handle_attach (const Config& c, ESort::Reader* r, const string& param); int handle_mbox (const Config& c, ESort::Reader* r, const string& param); int handle_list (const Config& c, ESort::Reader* r, const string& param); int handle_zap (const Config& c, ESort::Reader* r, const string& param); string redirect(const string& url); void error( const string& main, const string& sub, const string& suggest, const string& header = ""); using std::vector; void tokenize( const string& str, vector& tokens, const string& delimiters = " "); #endif lurker-2.3/render/search.cpp0000644000175000017500000001127311267074431013044 00000000000000/* $Id: search.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * sindex.cpp - Handle a search/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include "commands.h" #include "Search.h" #include "Cache.h" #include "ConfigFile.h" int pull_allowed(const Config& cfg, ESort::Reader* db, vector& v, Search& s) { string ok; vector::size_type i; while (v.size() < 35) { i = v.size(); if (!s.pull(1, v)) error(_("Database search seek failure"), strerror(errno), _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "furth assistence.")); if (i == v.size()) break; // no more data if ((ok = v[i].load(db, cfg)) != "") error(_("Database search pull failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); // trim forbidden fruit if (!v[i].allowed() || v[i].deleted()) v.resize(i); } return 0; } int handle_search(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); cfg.options = req.options; string::size_type o = req.options.find('@'); if (o == string::npos || o != MessageId::full_len || !MessageId::is_full(req.options.c_str())) error(_("Bad request"), param, _("The given parameter was not of the correct format. " "A searc request must be formatted like: " "search/YYYYMMDD.HHMMSS.hashcode@word,word,word.xml")); vector tokens; ++o; MessageId id(req.options.c_str()); string keys = req.options.substr(o, string::npos); // we need to translate '!' to '/' for (string::size_type es = 0; es < keys.length(); ++es) if (keys[es] == '!') keys[es] = '/'; tokenize(keys, tokens, ","); // Right! Everything the user did is ok. vector forward, backward, queue; Search backwardk(cfg, db, Backward, id, false); Search forwardk (cfg, db, Forward, id, false); for (vector::iterator i = tokens.begin(); i != tokens.end(); ++i) { string& key = *i; backwardk.keyword(key); forwardk.keyword(key); } if (pull_allowed(cfg, db, forward, forwardk) != 0) return 1; if (pull_allowed(cfg, db, backward, backwardk) != 0) return 1; vector::size_type left, right, i; if (forward.size() + backward.size() < 20) { left = backward.size(); right = forward.size(); } else if (forward.size() < 10) { right = forward.size(); left = 20 - right; } else if (backward.size() < 10) { left = backward.size(); right = 20 - left; } else { left = right = 10; } assert (left <= backward.size()); assert (right <= forward .size()); for (i = left; i > 0; --i) queue.push_back(backward[i-1]); for (i = 0; i < right; ++i) queue.push_back(forward[i]); Cache cache(cfg, "search", param, req.ext); cache.o << "\n" << "\n" << "\n" << " " << req.ext << "\n" << " " << cfg(req.language) << "\n" << " " << xmlEscape << keys << "\n"; if (right < forward.size()) { // we need a next link i = std::min(right+9, forward.size()-1); MessageId nd(forward[i].id()); nd.increment(); // hope that it doesn't exist (-> skips one) cache.o << " " << nd.serialize() << "\n"; } if (left < backward.size()) { // we need a prev link i = std::min(left+10, backward.size()-1); MessageId pd(backward[i].id()); pd.increment(); cache.o << " " << pd.serialize() << "\n"; } for (i = 0; i < queue.size(); ++i) cache.o << " " << queue[i] << "\n"; cache.o << "\n"; return 1; } lurker-2.3/render/Threading.h0000644000175000017500000000450411267074431013150 00000000000000/* $Id: Threading.h 1649 2009-10-19 14:35:01Z terpstra $ * * Threading.h - Helper which can load a thread tree * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef THREADING_H #define THREADING_H #include #include #include #include #include #include #include "Summary.h" using std::set; using std::map; using std::ostream; class Threading { public: struct Node { Summary summary; int replies; int replyee; int replyor_first; int replyor_next; int depth; int consumed; int column; int draw_next; string in_reply_tos; Node(const MessageId& id_) : summary(id_) { } Node() : summary(MessageId()) { } }; protected: typedef std::vector Nodes; Nodes nodes; map hashes; public: typedef Nodes::size_type Key; string load(ESort::Reader* r, const Summary& sum, Key& out); // "" = ok Key size() const { return nodes.size(); } string findprev(Key m, ESort::Reader* r, const Config& cfg, Summary& s); string findnext(Key m, ESort::Reader* r, const Config& cfg, Summary& s); bool hasMessage(string hash) { return hashes.find(hash) != hashes.end(); } set replies(Key k); Summary& getSummary(Key m); string draw_tree (ESort::Reader* db); // prepare for row drawing string draw_snippet(ESort::Reader* db, Key root, const Config& cfg); void draw_tree_row (ostream& o, int* h, Key row); // "" = ok void draw_snippet_row(ostream& o, int* h, Key row, Key root); // "" = ok }; #endif lurker-2.3/render/quote.cpp0000644000175000017500000002222411272626153012732 00000000000000const char* find_quote_end(const char* start, const char* end) { const char* out = 0; const char* c = start; goto find_quote_end_start; //find_quote_end_l0: ++c; find_quote_end_start: if (c == end) return out; if (*c < 11) if (*c < 10) goto find_quote_end_l1; else goto find_quote_end_l2; else goto find_quote_end_l1; find_quote_end_l1: return out; find_quote_end_l2: ++c; if (c == end) return out; if (*c < 91) if (*c < 62) if (*c < 33) if (*c < 32) goto find_quote_end_l1; else goto find_quote_end_l3; else goto find_quote_end_l1; else if (*c < 65) if (*c < 63) goto find_quote_end_l5; else goto find_quote_end_l1; else goto find_quote_end_l6; else if (*c < 124) if (*c < 123) if (*c < 97) goto find_quote_end_l1; else goto find_quote_end_l6; else goto find_quote_end_l1; else if (*c < 125) goto find_quote_end_l7; else goto find_quote_end_l1; find_quote_end_l3: ++c; if (c == end) return out; if (*c < 91) if (*c < 62) if (*c < 33) if (*c < 32) goto find_quote_end_l1; else goto find_quote_end_l4; else goto find_quote_end_l1; else if (*c < 65) if (*c < 63) goto find_quote_end_l5; else goto find_quote_end_l1; else goto find_quote_end_l6; else if (*c < 124) if (*c < 123) if (*c < 97) goto find_quote_end_l1; else goto find_quote_end_l6; else goto find_quote_end_l1; else if (*c < 125) goto find_quote_end_l7; else goto find_quote_end_l1; find_quote_end_l4: ++c; if (c == end) return out; if (*c < 97) if (*c < 65) if (*c < 63) if (*c < 62) goto find_quote_end_l1; else goto find_quote_end_l5; else goto find_quote_end_l1; else if (*c < 91) goto find_quote_end_l6; else goto find_quote_end_l1; else if (*c < 124) if (*c < 123) goto find_quote_end_l6; else goto find_quote_end_l1; else if (*c < 125) goto find_quote_end_l7; else goto find_quote_end_l1; find_quote_end_l5: ++c; out = c; if (c == end) return out; if (*c < 11) if (*c < 10) goto find_quote_end_l5; else goto find_quote_end_l2; else goto find_quote_end_l5; find_quote_end_l6: ++c; if (c == end) return out; if (*c < 97) if (*c < 65) if (*c < 63) if (*c < 62) goto find_quote_end_l1; else goto find_quote_end_l7; else goto find_quote_end_l1; else if (*c < 91) goto find_quote_end_l8; else goto find_quote_end_l1; else if (*c < 124) if (*c < 123) goto find_quote_end_l8; else goto find_quote_end_l1; else if (*c < 125) goto find_quote_end_l7; else goto find_quote_end_l1; find_quote_end_l7: ++c; if (c == end) return out; if (*c < 63) if (*c < 33) if (*c < 32) goto find_quote_end_l1; else goto find_quote_end_l5; else if (*c < 62) goto find_quote_end_l1; else goto find_quote_end_l7; else if (*c < 125) if (*c < 124) goto find_quote_end_l1; else goto find_quote_end_l7; else goto find_quote_end_l1; find_quote_end_l8: ++c; if (c == end) return out; if (*c < 97) if (*c < 65) if (*c < 63) if (*c < 62) goto find_quote_end_l1; else goto find_quote_end_l7; else goto find_quote_end_l1; else if (*c < 91) goto find_quote_end_l9; else goto find_quote_end_l1; else if (*c < 124) if (*c < 123) goto find_quote_end_l9; else goto find_quote_end_l1; else if (*c < 125) goto find_quote_end_l7; else goto find_quote_end_l1; find_quote_end_l9: ++c; if (c == end) return out; if (*c < 97) if (*c < 65) if (*c < 63) if (*c < 62) goto find_quote_end_l1; else goto find_quote_end_l7; else goto find_quote_end_l1; else if (*c < 91) goto find_quote_end_l10; else goto find_quote_end_l1; else if (*c < 124) if (*c < 123) goto find_quote_end_l10; else goto find_quote_end_l1; else if (*c < 125) goto find_quote_end_l7; else goto find_quote_end_l1; find_quote_end_l10: ++c; if (c == end) return out; if (*c < 124) if (*c < 63) if (*c < 62) goto find_quote_end_l1; else goto find_quote_end_l7; else goto find_quote_end_l1; else if (*c < 125) goto find_quote_end_l7; else goto find_quote_end_l1; } char* find_quote_starts(const char* start, const char* end, char* scratch) { const char* c = end; scratch += (end - start); goto find_quote_starts_start; find_quote_starts_l0: *--scratch = 0; find_quote_starts_start: if (c-- == start) return scratch; if (*c < 62) if (*c < 33) if (*c < 32) goto find_quote_starts_l0; else goto find_quote_starts_l1; else goto find_quote_starts_l0; else if (*c < 63) goto find_quote_starts_l4; else goto find_quote_starts_l0; find_quote_starts_l1: *--scratch = 0; if (c-- == start) return scratch; if (*c < 63) if (*c < 33) if (*c < 32) goto find_quote_starts_l0; else goto find_quote_starts_l1; else if (*c < 62) goto find_quote_starts_l0; else goto find_quote_starts_l2; else if (*c < 125) if (*c < 124) goto find_quote_starts_l0; else goto find_quote_starts_l2; else goto find_quote_starts_l0; find_quote_starts_l2: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 33) if (*c < 11) if (*c < 10) goto find_quote_starts_l0; else goto find_quote_starts_l3; else if (*c < 32) goto find_quote_starts_l0; else goto find_quote_starts_l5; else if (*c < 63) if (*c < 62) goto find_quote_starts_l0; else goto find_quote_starts_l2; else goto find_quote_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 91) goto find_quote_starts_l7; else goto find_quote_starts_l0; else goto find_quote_starts_l7; else if (*c < 125) if (*c < 124) goto find_quote_starts_l0; else goto find_quote_starts_l2; else goto find_quote_starts_l0; find_quote_starts_l3: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 33) if (*c < 32) goto find_quote_starts_l0; else goto find_quote_starts_l1; else goto find_quote_starts_l0; else if (*c < 63) goto find_quote_starts_l4; else goto find_quote_starts_l0; find_quote_starts_l4: *--scratch = 0; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 10) goto find_quote_starts_l0; else goto find_quote_starts_l3; else if (*c < 32) goto find_quote_starts_l0; else goto find_quote_starts_l5; else if (*c < 63) if (*c < 62) goto find_quote_starts_l0; else goto find_quote_starts_l4; else goto find_quote_starts_l0; find_quote_starts_l5: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 32) if (*c < 11) if (*c < 10) goto find_quote_starts_l0; else goto find_quote_starts_l3; else goto find_quote_starts_l0; else if (*c < 33) goto find_quote_starts_l6; else goto find_quote_starts_l0; else if (*c < 124) if (*c < 63) goto find_quote_starts_l2; else goto find_quote_starts_l0; else if (*c < 125) goto find_quote_starts_l2; else goto find_quote_starts_l0; find_quote_starts_l6: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 32) if (*c < 11) if (*c < 10) goto find_quote_starts_l0; else goto find_quote_starts_l3; else goto find_quote_starts_l0; else if (*c < 33) goto find_quote_starts_l1; else goto find_quote_starts_l0; else if (*c < 124) if (*c < 63) goto find_quote_starts_l2; else goto find_quote_starts_l0; else if (*c < 125) goto find_quote_starts_l2; else goto find_quote_starts_l0; find_quote_starts_l7: *--scratch = 0; if (c-- == start) return scratch; if (*c < 63) if (*c < 32) if (*c < 11) if (*c < 10) goto find_quote_starts_l0; else goto find_quote_starts_l3; else goto find_quote_starts_l0; else if (*c < 62) if (*c < 33) goto find_quote_starts_l5; else goto find_quote_starts_l0; else goto find_quote_starts_l4; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_quote_starts_l0; else goto find_quote_starts_l8; else goto find_quote_starts_l0; else if (*c < 123) goto find_quote_starts_l8; else goto find_quote_starts_l0; find_quote_starts_l8: *--scratch = 0; if (c-- == start) return scratch; if (*c < 63) if (*c < 32) if (*c < 11) if (*c < 10) goto find_quote_starts_l0; else goto find_quote_starts_l3; else goto find_quote_starts_l0; else if (*c < 62) if (*c < 33) goto find_quote_starts_l5; else goto find_quote_starts_l0; else goto find_quote_starts_l4; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_quote_starts_l0; else goto find_quote_starts_l9; else goto find_quote_starts_l0; else if (*c < 123) goto find_quote_starts_l9; else goto find_quote_starts_l0; find_quote_starts_l9: *--scratch = 0; if (c-- == start) return scratch; if (*c < 63) if (*c < 32) if (*c < 11) if (*c < 10) goto find_quote_starts_l0; else goto find_quote_starts_l3; else goto find_quote_starts_l0; else if (*c < 62) if (*c < 33) goto find_quote_starts_l5; else goto find_quote_starts_l0; else goto find_quote_starts_l4; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_quote_starts_l0; else goto find_quote_starts_l4; else goto find_quote_starts_l0; else if (*c < 123) goto find_quote_starts_l4; else goto find_quote_starts_l0; } lurker-2.3/render/splash.cpp0000644000175000017500000000531711267074431013073 00000000000000/* $Id: splash.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * splash.cpp - Handle a splash/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "commands.h" #include "Cache.h" int handle_splash(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); cfg.options = req.options; if (req.options != "index") error(_("Bad request"), param, _("The given parameter was not of the correct format. " "A splash request must be formatted like: " "splash/index.lc.xml")); Cache cache(cfg, "splash", param, req.ext); cache.o << "\n" << "\n" << "\n" << " " << req.ext << "\n" << " " << cfg(req.language) << "\n"; Config::Groups::const_iterator group; for (group = cfg.groups.begin(); group != cfg.groups.end(); ++group) { Config::Members::const_iterator member; for (member = group->second.members.begin(); member != group->second.members.end(); ++member) { Config::Lists::const_iterator i = cfg.lists.find(*member); if (i == cfg.lists.end()) continue; // impossible! if (i->second.allowed) break; } // no allowed member lists? if (member == group->second.members.end()) continue; cache.o << " \n" << " " << group->first << "\n"; if (group->second.heading.is_set()) cache.o << " " << group->second.heading(req.language) << "\n"; for (member = group->second.members.begin(); member != group->second.members.end(); ++member) { Config::Lists::const_iterator i = cfg.lists.find(*member); if (i == cfg.lists.end()) continue; // impossible! if (!i->second.allowed) continue; cache.o << " " << i->second(req.language) << "\n"; } cache.o << " \n"; } cache.o << "\n"; return 0; } lurker-2.3/render/Cache.cpp0000644000175000017500000001063111267074431012577 00000000000000/* $Id: Cache.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Cache.h - Helper which transforms xml -> html and caches files * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "Cache.h" #include "commands.h" #include #include #include #include class streambug : public std::streambuf { public: streambug(); void set_target(FILE* t) { target = t; } protected: int overflow(int); int sync(); private: FILE* target; char buf[128]; //8192]; }; streambug::streambug() : target(0) { setp(&buf[0], &buf[sizeof(buf)-1]); setg(0,0,0); // output only } int streambug::overflow(int c) { assert (target); // Make sure there is a put area if (!pptr()) setp(&buf[0], &buf[sizeof(buf)-1]); // Determine how many characters have been // inserted but not consumed. std::streamsize w = pptr() - pbase(); // If c is not EOF it is a character that must // also be consumed. if (c != EOF) { // We always leave space *pptr() = c; ++w; } // consume characters. if ((std::streamsize)fwrite(pbase(), 1, w, target) == w) { // Set up put area. Be sure that there // is space at end for one extra character. setp(&buf[0], &buf[sizeof(buf)-1]); if (c == EOF) return 0; return c; } else { // Indicate error. setp(0, 0); return EOF; } } int streambug::sync() { if (pptr() && pptr() > pbase()) { // Flush waiting output return overflow(EOF); } return 0; } Cache::Cache(const Config& cfg, const string& command, const string& parameter, const string& ext) : bug(new streambug), o(bug) { if (chdir(command.c_str()) != 0) error(_("Entering command dir"), command + ":" + strerror(errno), _("Perhaps the directory does not exist to which " "the cache file is being written.")); if (cfg.web_cache) { cache = fopen(parameter.c_str(), "w+"); if (!cache) error(_("Creating cache file"), parameter + ":" + strerror(errno), _("Perhaps the user which runs lurker.cgi does not have write " "permissions to this directory.")); } else { cache = stdout; } if (ext == "html") { char buf[10] = ""; if (cache != stdout) sprintf(buf, " >&%d", fileno(cache)); string command = cfg.xslt + buf; output = popen(command.c_str(), "w"); if (!output) error(_("Opening xslt pipeline"), strerror(errno), _("The specified xslt pipeline in your config " "file, entry xslt, could not be opened. " "Please ensure that the command correctly " "streams xml into html for you.")); cout << "Status: 200 OK\r\n"; cout << "Content-Type: text/html; charset=UTF-8\r\n\r\n"; } else if (ext == "txt") { cout << "Status: 200 OK\r\n"; cout << "Content-Type: text/plain\r\n\r\n"; output = cache; } else if (ext == "rfc822") { cout << "Status: 200 OK\r\n"; cout << "Content-Type: message/rfc822\r\n\r\n"; output = cache; } else if (ext == "xml") { cout << "Status: 200 OK\r\n"; cout << "Content-Type: text/xml; charset=UTF-8\r\n\r\n"; output = cache; } else { error(_("Unknown file type"), ext, _("The requested extension is not supported by lurker. " "Please reformulate your request.")); } cout.flush(); // in case of stdout writing next (ick) bug->set_target(output); } Cache::~Cache() { o.flush(); if (output != cache) pclose(output); if (cache != stdout) { // reset to the start of the cache file fflush(cache); fseek(cache, 0, SEEK_SET); fflush(cache); // Begin streaming to cout char buf[4096]; size_t got; while ((got = fread(buf, 1, sizeof(buf), cache)) != 0) cout.write(buf, got); } // All done! } lurker-2.3/render/Cache.h0000644000175000017500000000255111267074431012246 00000000000000/* $Id: Cache.h 1649 2009-10-19 14:35:01Z terpstra $ * * Cache.h - Helper which transforms xml -> html and caches files * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CACHE_H #define CACHE_H #include #include #include #include using std::ostream; using std::string; using std::cout; class streambug; class Cache { protected: streambug* bug; public: Cache(const Config& cfg, const string& command, const string& parameter, const string& ext); ~Cache(); ostream o; protected: FILE* output; FILE* cache; }; #endif lurker-2.3/render/Makefile.in0000644000175000017500000004053511272632672013146 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : cgi_PROGRAMS = lurker.cgi$(EXEEXT) jump.cgi$(EXEEXT) \ keyword.cgi$(EXEEXT) bounce.cgi$(EXEEXT) subdir = render DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(cgidir)" cgiPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(cgi_PROGRAMS) am_bounce_cgi_OBJECTS = parse.$(OBJEXT) bounce.$(OBJEXT) bounce_cgi_OBJECTS = $(am_bounce_cgi_OBJECTS) bounce_cgi_LDADD = $(LDADD) bounce_cgi_DEPENDENCIES = ../common/libcommon.a ../libesort/libesort.a am_jump_cgi_OBJECTS = parse.$(OBJEXT) jump.$(OBJEXT) jump_cgi_OBJECTS = $(am_jump_cgi_OBJECTS) jump_cgi_LDADD = $(LDADD) jump_cgi_DEPENDENCIES = ../common/libcommon.a ../libesort/libesort.a am_keyword_cgi_OBJECTS = parse.$(OBJEXT) keyword.$(OBJEXT) keyword_cgi_OBJECTS = $(am_keyword_cgi_OBJECTS) keyword_cgi_LDADD = $(LDADD) keyword_cgi_DEPENDENCIES = ../common/libcommon.a \ ../libesort/libesort.a am_lurker_cgi_OBJECTS = main.$(OBJEXT) art.$(OBJEXT) url.$(OBJEXT) \ mailto.$(OBJEXT) quote.$(OBJEXT) attach.$(OBJEXT) \ list.$(OBJEXT) mbox.$(OBJEXT) message.$(OBJEXT) \ mindex.$(OBJEXT) search.$(OBJEXT) splash.$(OBJEXT) \ thread.$(OBJEXT) zap.$(OBJEXT) Cache.$(OBJEXT) \ Threading.$(OBJEXT) parse.$(OBJEXT) lurker_cgi_OBJECTS = $(am_lurker_cgi_OBJECTS) lurker_cgi_LDADD = $(LDADD) lurker_cgi_DEPENDENCIES = ../common/libcommon.a ../libesort/libesort.a DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/tools/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(bounce_cgi_SOURCES) $(jump_cgi_SOURCES) \ $(keyword_cgi_SOURCES) $(lurker_cgi_SOURCES) DIST_SOURCES = $(bounce_cgi_SOURCES) $(jump_cgi_SOURCES) \ $(keyword_cgi_SOURCES) $(lurker_cgi_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ cgidir = @cgi_bin_dir@ AM_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/libesort LDADD = ../common/libcommon.a ../libesort/libesort.a lurker_cgi_SOURCES = \ main.cpp art.cpp url.cpp mailto.cpp quote.cpp attach.cpp list.cpp \ mbox.cpp message.cpp mindex.cpp search.cpp splash.cpp thread.cpp \ zap.cpp Cache.cpp Threading.cpp parse.cpp \ Cache.h Threading.h commands.h parse.h jump_cgi_SOURCES = parse.cpp jump.cpp keyword_cgi_SOURCES = parse.cpp keyword.cpp bounce_cgi_SOURCES = parse.cpp bounce.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu render/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu render/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-cgiPROGRAMS: $(cgi_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(cgidir)" || $(MKDIR_P) "$(DESTDIR)$(cgidir)" @list='$(cgi_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(cgiPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(cgidir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(cgiPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(cgidir)/$$f" || exit 1; \ else :; fi; \ done uninstall-cgiPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(cgi_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(cgidir)/$$f'"; \ rm -f "$(DESTDIR)$(cgidir)/$$f"; \ done clean-cgiPROGRAMS: -test -z "$(cgi_PROGRAMS)" || rm -f $(cgi_PROGRAMS) bounce.cgi$(EXEEXT): $(bounce_cgi_OBJECTS) $(bounce_cgi_DEPENDENCIES) @rm -f bounce.cgi$(EXEEXT) $(CXXLINK) $(bounce_cgi_OBJECTS) $(bounce_cgi_LDADD) $(LIBS) jump.cgi$(EXEEXT): $(jump_cgi_OBJECTS) $(jump_cgi_DEPENDENCIES) @rm -f jump.cgi$(EXEEXT) $(CXXLINK) $(jump_cgi_OBJECTS) $(jump_cgi_LDADD) $(LIBS) keyword.cgi$(EXEEXT): $(keyword_cgi_OBJECTS) $(keyword_cgi_DEPENDENCIES) @rm -f keyword.cgi$(EXEEXT) $(CXXLINK) $(keyword_cgi_OBJECTS) $(keyword_cgi_LDADD) $(LIBS) lurker.cgi$(EXEEXT): $(lurker_cgi_OBJECTS) $(lurker_cgi_DEPENDENCIES) @rm -f lurker.cgi$(EXEEXT) $(CXXLINK) $(lurker_cgi_OBJECTS) $(lurker_cgi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Threading.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/art.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attach.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bounce.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyword.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mailto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mindex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quote.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zap.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(cgidir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-cgiPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-cgiPROGRAMS install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-cgiPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-cgiPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-cgiPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-cgiPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/render/thread.cpp0000644000175000017500000000746711267074431013060 00000000000000/* $Id: thread.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * thread.cpp - Handle a thread/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include "commands.h" #include "Threading.h" #include "Cache.h" int handle_thread(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); cfg.options = req.options; if (!MessageId::is_full(req.options.c_str()) || req.options.length() != MessageId::full_len) error(_("Bad request"), param, _("The given parameter was not of the correct format. " "A thread request must be formatted like: " "thread/YYYYMMDD.HHMMSS.hashcode.xml")); MessageId id(req.options.c_str()); string ok; Summary source(id); // Identical error for a not allowed message as non-existing (security) if ((ok = source.load(db, cfg)) != "" || !source.allowed()) { if (ok == "") ok = "not in a mailbox"; // fake error(_("Database thread source pull failure"), ok, _("The specified message does not exist.")); } if (source.deleted()) error(_("Database thread source pull failure"), "not found", _("The specified message has been deleted.")); Threading::Key spot; Threading thread; if ((ok = thread.load(db, source, spot)) != "" || (ok = thread.draw_tree(db)) != "") error(_("Database thread tree load failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); set lists; for (Threading::Key j = 0; j < thread.size(); ++j) { Summary& sum = thread.getSummary(j); if (!sum.loaded() && (ok = sum.load(db, cfg)) != "") break; const set& mboxs = sum.mboxs(); set::const_iterator i; for (i = mboxs.begin(); i != mboxs.end(); ++i) lists.insert(*i); } if (ok != "") error(_("Database thread sumary load failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); Cache cache(cfg, "thread", param, req.ext); cache.o << "\n" << "\n" << "\n" << " " << req.ext << "\n" << " " << cfg(req.language) << "\n" << " " << subject_hash(source.subject().c_str()) << "\n"; set::const_iterator list; for (list = lists.begin(); list != lists.end(); ++list) { Config::Lists::const_iterator desc = cfg.lists.find(*list); if (desc == cfg.lists.end()) continue; cache.o << " " << desc->second(req.language) << "\n"; } int head = -1; for (Threading::Key i = 0; i < thread.size(); ++i) { if (i == spot) cache.o << " \n"; else cache.o << " \n"; cache.o << " "; thread.draw_tree_row(cache.o, &head, i); cache.o << "\n " << thread.getSummary(i) << "\n \n"; } cache.o << "\n"; return 0; } lurker-2.3/render/list.cpp0000644000175000017500000001163711267074431012556 00000000000000/* $Id: list.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * list.cpp - Handle a list/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include "commands.h" #include "Cache.h" #include "Summary.h" using namespace std; #define NUM_TOPICS 20 #define NUM_DAYS 14 // nested types break g++ 2.95 struct NewTopic { bool pushed; Summary newest; vector days; }; static time_t now; int load_topic(const Config& cfg, ESort::Reader* db, const string& hash, NewTopic& t) { string prefix = LU_KEYWORD LU_KEYWORD_THREAD + hash + '\0'; auto_ptr dayWalker(db->seek( prefix, "\xFF\xFF\xFF\xFF", ESort::Backward)); // set it up for num days t.days.resize(NUM_DAYS, 0); t.pushed = false; while (dayWalker->advance() != -1) { // check corrupt if (dayWalker->key.length() != prefix.length() + 8) break; MessageId id(dayWalker->key.c_str() + prefix.length(), 8); // this is the newest if none has been set if (!t.newest.loaded()) { Summary sum(id); string ok = sum.load(db, cfg); if (ok != "") error(_("Database list pull failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); if (!sum.deleted()) t.newest = sum; } int daygap = (now - id.timestamp()) / (60*60*24); if (daygap >= NUM_DAYS) { if (t.newest.loaded()) break; } else ++t.days[daygap]; } return 0; } int handle_list(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); cfg.options = req.options; const Config::Lists::const_iterator li = cfg.lists.find(req.options); // Identical error message if it's missing or not allowed (security) if (li == cfg.lists.end() || !li->second.allowed) error(_("No such list"), req.options, _("The specified mailing list is not available in this " "archive. Perhaps you misspelled it or went to the " "wrong server?")); const List& list = li->second; // Right! Everything the user did is ok. map topics; vector order; auto_ptr topicFinder(db->seek( LU_NEW_TOPICS + list.mbox + '\0', "\xFF\xFF\xFF\xFF", ESort::Backward)); string::size_type skip = 1 + list.mbox.length() + 1; now = time(0); while (order.size() < NUM_TOPICS && topicFinder->advance() != -1) { // check corrupt if (topicFinder->key.length() != skip + 4 + 8) break; const unsigned char* tss = reinterpret_cast (topicFinder->key.c_str() + skip); time_t when = (time_t)tss[0] << 24 | (time_t)tss[1] << 16 | (time_t)tss[2] << 8 | (time_t)tss[3]; string hash(topicFinder->key, skip + 4, 8); // not already loaded? if (topics.find(hash) == topics.end() && load_topic(cfg, db, hash, topics[hash]) != 0) return 1; // Is this point in time the first (non-deleted) hit? NewTopic& t = topics[hash]; if (t.newest.loaded() && // does the thread have any hits? t.newest.id().timestamp() == when && !t.pushed) { t.pushed = true; order.push_back(hash); } } Cache cache(cfg, "list", param, req.ext); cache.o << "\n" << "\n" << "\n" << " " << req.ext << "\n" << " " << cfg(req.language) << "\n" << " " << list(req.language) << "\n"; for (vector::iterator i = order.begin(); i != order.end(); ++i) { cache.o << " \n"; NewTopic& t = topics[*i]; vector::iterator j; cache.o << " " << xmlEscape << skipSubjectStart(t.newest.subject().c_str()) << "\n" << " "; for (j = t.days.begin(); j != t.days.end(); ++j) cache.o << "" << *j << ""; cache.o << "\n"; cache.o << " " << t.newest << "\n"; cache.o << " \n"; } cache.o << "\n"; return 0; } lurker-2.3/render/mbox.cpp0000644000175000017500000000454611267074431012551 00000000000000/* $Id: mbox.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * mbox.cpp - Handle a mbox/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include "commands.h" #include "Summary.h" #include "Cache.h" int handle_mbox(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); if (!MessageId::is_full(req.options.c_str())) error(_("Bad request"), param, _("The given parameter was not of the correct format. " "A mbox request must be formatted like: " "mbox/YYYYMMDD.HHMMSS.hashcode.txt")); if (!cfg.raw_email) error(_("Permission Denied"), param, _("Access to raw email text has been disabled. " "Contact the site administrator if this is a problem.")); MessageId id(req.options.c_str()); string ok; Summary source(id); // Identical error if missing or not allowed (security) if ((ok = source.load(db, cfg)) != "" || !source.allowed()) { if (ok == "") ok = "not in a mailbox"; // fake error(_("Database mbox source pull failure"), ok, _("The specified message does not exist.")); } if (source.deleted()) error(_("Database mbox source pull failure"), "not found", _("The specified message has been deleted.")); DwMessage message; if ((ok = source.message(cfg.dbdir, message)) != "") error(_("MBox read failure"), ok, _("Unable to open message in the mailbox. " "Perhaps it has been deleted or moved?")); Cache cache(cfg, "mbox", param, req.ext); cache.o << message.AsString().c_str(); return 0; } lurker-2.3/render/Makefile.am0000644000175000017500000000107111267070015013114 00000000000000cgidir = @cgi_bin_dir@ cgi_PROGRAMS = lurker.cgi jump.cgi keyword.cgi bounce.cgi AM_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/libesort LDADD = ../common/libcommon.a ../libesort/libesort.a lurker_cgi_SOURCES = \ main.cpp art.cpp url.cpp mailto.cpp quote.cpp attach.cpp list.cpp \ mbox.cpp message.cpp mindex.cpp search.cpp splash.cpp thread.cpp \ zap.cpp Cache.cpp Threading.cpp parse.cpp \ Cache.h Threading.h commands.h parse.h jump_cgi_SOURCES = parse.cpp jump.cpp keyword_cgi_SOURCES = parse.cpp keyword.cpp bounce_cgi_SOURCES = parse.cpp bounce.cpp lurker-2.3/render/mailto.cpp0000644000175000017500000031462111267147163013072 00000000000000const char* find_email_end(const char* start, const char* end) { const char* out = 0; const char* c = start; goto find_email_end_start; //find_email_end_l0: ++c; find_email_end_start: if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 35) if (*c < 34) goto find_email_end_l1; else goto find_email_end_l2; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 97) if (*c < 91) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 123) goto find_email_end_l39; else goto find_email_end_l1; find_email_end_l1: return out; find_email_end_l2: ++c; if (c == end) return out; if (*c < 14) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_end_l2; else goto find_email_end_l1; else goto find_email_end_l2; else if (*c < 13) if (*c < 11) goto find_email_end_l1; else goto find_email_end_l2; else goto find_email_end_l3; else if (*c < 92) if (*c < 35) if (*c < 34) goto find_email_end_l2; else goto find_email_end_l6; else goto find_email_end_l2; else if (*c < 93) goto find_email_end_l38; else goto find_email_end_l2; find_email_end_l3: ++c; if (c == end) return out; if (*c < 11) if (*c < 10) goto find_email_end_l1; else goto find_email_end_l4; else goto find_email_end_l1; find_email_end_l4: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_email_end_l1; else goto find_email_end_l5; else goto find_email_end_l1; else if (*c < 33) goto find_email_end_l5; else goto find_email_end_l1; find_email_end_l5: ++c; if (c == end) return out; if (*c < 14) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_end_l2; else goto find_email_end_l1; else if (*c < 9) goto find_email_end_l2; else goto find_email_end_l5; else if (*c < 13) if (*c < 11) goto find_email_end_l1; else goto find_email_end_l2; else goto find_email_end_l1; else if (*c < 35) if (*c < 33) if (*c < 32) goto find_email_end_l2; else goto find_email_end_l5; else if (*c < 34) goto find_email_end_l2; else goto find_email_end_l6; else if (*c < 93) if (*c < 92) goto find_email_end_l2; else goto find_email_end_l38; else goto find_email_end_l2; find_email_end_l6: ++c; if (c == end) return out; if (*c < 65) if (*c < 64) goto find_email_end_l1; else goto find_email_end_l7; else goto find_email_end_l1; find_email_end_l7: ++c; if (c == end) return out; if (*c < 91) if (*c < 58) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l8; else if (*c < 65) goto find_email_end_l1; else goto find_email_end_l8; else if (*c < 97) if (*c < 92) goto find_email_end_l13; else goto find_email_end_l1; else if (*c < 123) goto find_email_end_l8; else goto find_email_end_l1; find_email_end_l8: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_end_l1; else goto find_email_end_l9; else goto find_email_end_l10; else if (*c < 48) goto find_email_end_l1; else goto find_email_end_l8; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_email_end_l1; else goto find_email_end_l8; else goto find_email_end_l1; else if (*c < 123) goto find_email_end_l8; else goto find_email_end_l1; find_email_end_l9: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_email_end_l1; else goto find_email_end_l9; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l8; else goto find_email_end_l1; else if (*c < 97) if (*c < 91) goto find_email_end_l8; else goto find_email_end_l1; else if (*c < 123) goto find_email_end_l8; else goto find_email_end_l1; find_email_end_l10: ++c; if (c == end) return out; if (*c < 91) if (*c < 58) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l8; else if (*c < 65) goto find_email_end_l1; else goto find_email_end_l11; else if (*c < 123) if (*c < 97) goto find_email_end_l1; else goto find_email_end_l11; else goto find_email_end_l1; find_email_end_l11: ++c; out = c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_end_l1; else goto find_email_end_l12; else goto find_email_end_l10; else if (*c < 48) goto find_email_end_l1; else goto find_email_end_l11; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_email_end_l1; else goto find_email_end_l11; else goto find_email_end_l1; else if (*c < 123) goto find_email_end_l11; else goto find_email_end_l1; find_email_end_l12: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_email_end_l1; else goto find_email_end_l12; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l11; else goto find_email_end_l1; else if (*c < 97) if (*c < 91) goto find_email_end_l11; else goto find_email_end_l1; else if (*c < 123) goto find_email_end_l11; else goto find_email_end_l1; find_email_end_l13: ++c; if (c == end) return out; if (*c < 50) if (*c < 49) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l14; else goto find_email_end_l34; else if (*c < 58) if (*c < 51) goto find_email_end_l36; else goto find_email_end_l35; else goto find_email_end_l1; find_email_end_l14: ++c; if (c == end) return out; if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l15; else goto find_email_end_l1; find_email_end_l15: ++c; if (c == end) return out; if (*c < 50) if (*c < 49) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l16; else goto find_email_end_l30; else if (*c < 58) if (*c < 51) goto find_email_end_l32; else goto find_email_end_l31; else goto find_email_end_l1; find_email_end_l16: ++c; if (c == end) return out; if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l17; else goto find_email_end_l1; find_email_end_l17: ++c; if (c == end) return out; if (*c < 50) if (*c < 49) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l18; else goto find_email_end_l26; else if (*c < 58) if (*c < 51) goto find_email_end_l28; else goto find_email_end_l27; else goto find_email_end_l1; find_email_end_l18: ++c; if (c == end) return out; if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l19; else goto find_email_end_l1; find_email_end_l19: ++c; if (c == end) return out; if (*c < 50) if (*c < 49) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l20; else goto find_email_end_l22; else if (*c < 58) if (*c < 51) goto find_email_end_l24; else goto find_email_end_l23; else goto find_email_end_l1; find_email_end_l20: ++c; if (c == end) return out; if (*c < 94) if (*c < 93) goto find_email_end_l1; else goto find_email_end_l21; else goto find_email_end_l1; find_email_end_l21: ++c; out = c; if (c == end) return out; goto find_email_end_l1; find_email_end_l22: ++c; if (c == end) return out; if (*c < 93) if (*c < 58) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l23; else goto find_email_end_l1; else if (*c < 94) goto find_email_end_l21; else goto find_email_end_l1; find_email_end_l23: ++c; if (c == end) return out; if (*c < 93) if (*c < 58) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l20; else goto find_email_end_l1; else if (*c < 94) goto find_email_end_l21; else goto find_email_end_l1; find_email_end_l24: ++c; if (c == end) return out; if (*c < 58) if (*c < 53) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l23; else if (*c < 54) goto find_email_end_l25; else goto find_email_end_l20; else if (*c < 94) if (*c < 93) goto find_email_end_l1; else goto find_email_end_l21; else goto find_email_end_l1; find_email_end_l25: ++c; if (c == end) return out; if (*c < 93) if (*c < 54) if (*c < 48) goto find_email_end_l1; else goto find_email_end_l20; else goto find_email_end_l1; else if (*c < 94) goto find_email_end_l21; else goto find_email_end_l1; find_email_end_l26: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l19; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l27; else goto find_email_end_l1; find_email_end_l27: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l19; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l18; else goto find_email_end_l1; find_email_end_l28: ++c; if (c == end) return out; if (*c < 53) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l19; else if (*c < 48) goto find_email_end_l1; else goto find_email_end_l27; else if (*c < 58) if (*c < 54) goto find_email_end_l29; else goto find_email_end_l18; else goto find_email_end_l1; find_email_end_l29: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l19; else goto find_email_end_l1; else if (*c < 54) goto find_email_end_l18; else goto find_email_end_l1; find_email_end_l30: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l17; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l31; else goto find_email_end_l1; find_email_end_l31: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l17; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l16; else goto find_email_end_l1; find_email_end_l32: ++c; if (c == end) return out; if (*c < 53) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l17; else if (*c < 48) goto find_email_end_l1; else goto find_email_end_l31; else if (*c < 58) if (*c < 54) goto find_email_end_l33; else goto find_email_end_l16; else goto find_email_end_l1; find_email_end_l33: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l17; else goto find_email_end_l1; else if (*c < 54) goto find_email_end_l16; else goto find_email_end_l1; find_email_end_l34: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l15; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l35; else goto find_email_end_l1; find_email_end_l35: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l15; else goto find_email_end_l1; else if (*c < 58) goto find_email_end_l14; else goto find_email_end_l1; find_email_end_l36: ++c; if (c == end) return out; if (*c < 53) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l15; else if (*c < 48) goto find_email_end_l1; else goto find_email_end_l35; else if (*c < 58) if (*c < 54) goto find_email_end_l37; else goto find_email_end_l14; else goto find_email_end_l1; find_email_end_l37: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_end_l1; else goto find_email_end_l15; else goto find_email_end_l1; else if (*c < 54) goto find_email_end_l14; else goto find_email_end_l1; find_email_end_l38: ++c; if (c == end) return out; if (*c < 11) if (*c < 1) if (*c < 0) goto find_email_end_l2; else goto find_email_end_l1; else if (*c < 10) goto find_email_end_l2; else goto find_email_end_l1; else if (*c < 14) if (*c < 13) goto find_email_end_l2; else goto find_email_end_l1; else goto find_email_end_l2; find_email_end_l39: ++c; if (c == end) return out; if (*c < 47) if (*c < 42) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_end_l1; else goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 40) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 45) if (*c < 44) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 46) goto find_email_end_l39; else goto find_email_end_l40; else if (*c < 65) if (*c < 63) if (*c < 58) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 64) goto find_email_end_l39; else goto find_email_end_l7; else if (*c < 94) if (*c < 91) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 127) goto find_email_end_l39; else goto find_email_end_l1; find_email_end_l40: ++c; if (c == end) return out; if (*c < 47) if (*c < 42) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_end_l1; else goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 40) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 45) if (*c < 44) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 46) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 65) if (*c < 63) if (*c < 58) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 64) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 94) if (*c < 91) goto find_email_end_l39; else goto find_email_end_l1; else if (*c < 127) goto find_email_end_l39; else goto find_email_end_l1; } char* find_email_starts(const char* start, const char* end, char* scratch) { const char* c = end; scratch += (end - start); goto find_email_starts_start; find_email_starts_l0: *--scratch = 0; find_email_starts_start: if (c-- == start) return scratch; if (*c < 94) if (*c < 91) if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l1: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l2; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l2: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 58) if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l3; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l3; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l3; else goto find_email_starts_l0; find_email_starts_l3: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l4; else if (*c < 47) goto find_email_starts_l2; else goto find_email_starts_l0; else if (*c < 64) if (*c < 58) goto find_email_starts_l3; else goto find_email_starts_l0; else goto find_email_starts_l16; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l3; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l3; else goto find_email_starts_l0; find_email_starts_l4: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 48) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l4; else goto find_email_starts_l0; else if (*c < 65) if (*c < 58) goto find_email_starts_l3; else goto find_email_starts_l0; else goto find_email_starts_l3; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l3; else goto find_email_starts_l0; find_email_starts_l5: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l6; else goto find_email_starts_l91; else if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l6: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l7; else if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l87; else if (*c < 58) if (*c < 54) goto find_email_starts_l89; else goto find_email_starts_l90; else goto find_email_starts_l0; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l7: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l8; else goto find_email_starts_l86; else if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l8: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l9; else if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l82; else if (*c < 58) if (*c < 54) goto find_email_starts_l84; else goto find_email_starts_l85; else goto find_email_starts_l0; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l9: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l10; else goto find_email_starts_l81; else if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l10: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l11; else if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l77; else if (*c < 58) if (*c < 54) goto find_email_starts_l79; else goto find_email_starts_l80; else goto find_email_starts_l0; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l11: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l12; else goto find_email_starts_l76; else if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l12: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 54) if (*c < 49) if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l13; else goto find_email_starts_l74; else if (*c < 65) if (*c < 58) goto find_email_starts_l75; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 94) if (*c < 93) if (*c < 92) goto find_email_starts_l15; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l13: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 51) if (*c < 49) goto find_email_starts_l0; else goto find_email_starts_l14; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l14: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 91) if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 92) goto find_email_starts_l15; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l15: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 64) goto find_email_starts_l0; else goto find_email_starts_l16; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l16: *--scratch = 0; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l24; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l19; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l20; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l20; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l17: *--scratch = 0; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l18; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l19; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l20; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l20; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l18: *--scratch = 0; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l19; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l20; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l20; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l19: *--scratch = 1; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l18; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l19; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l20; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l20; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l20: *--scratch = 1; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l21; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l19; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l20; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l20; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l21: *--scratch = 0; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l22; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l22; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l22; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l22: *--scratch = 1; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l23; else goto find_email_starts_l21; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l22; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l16; else if (*c < 91) goto find_email_starts_l22; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l22; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l23: *--scratch = 0; if (c-- == start) return scratch; if (*c < 58) if (*c < 44) if (*c < 35) if (*c < 34) if (*c < 33) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 42) if (*c < 40) goto find_email_starts_l17; else goto find_email_starts_l0; else goto find_email_starts_l17; else if (*c < 47) if (*c < 46) if (*c < 45) goto find_email_starts_l0; else goto find_email_starts_l23; else goto find_email_starts_l18; else if (*c < 48) goto find_email_starts_l17; else goto find_email_starts_l22; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 63) goto find_email_starts_l0; else goto find_email_starts_l17; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l22; else goto find_email_starts_l0; else if (*c < 123) if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l17; else goto find_email_starts_l22; else if (*c < 127) goto find_email_starts_l17; else goto find_email_starts_l0; find_email_starts_l24: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 93) if (*c < 91) if (*c < 65) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 92) goto find_email_starts_l25; else goto find_email_starts_l73; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l25: *--scratch = 0; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 32) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 93) if (*c < 65) if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l26: *--scratch = 0; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l27; else if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 32) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 93) if (*c < 65) if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l27: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 14) if (*c < 13) goto find_email_starts_l0; else goto find_email_starts_l28; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l28: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l29; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l29; else goto find_email_starts_l25; else if (*c < 93) if (*c < 91) if (*c < 65) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 92) goto find_email_starts_l25; else goto find_email_starts_l73; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l29: *--scratch = 0; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l29; else goto find_email_starts_l0; else if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 32) goto find_email_starts_l25; else goto find_email_starts_l29; else if (*c < 93) if (*c < 65) if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l30: *--scratch = 1; if (c-- == start) return scratch; if (*c < 93) if (*c < 91) if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 92) goto find_email_starts_l0; else goto find_email_starts_l24; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l31: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 47) if (*c < 46) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l32; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l32: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 58) if (*c < 48) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l33; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l33; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l33; else goto find_email_starts_l25; find_email_starts_l33: *--scratch = 0; if (c-- == start) return scratch; if (*c < 45) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_email_starts_l34; else goto find_email_starts_l32; else goto find_email_starts_l25; else if (*c < 64) if (*c < 58) goto find_email_starts_l33; else goto find_email_starts_l25; else goto find_email_starts_l46; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l33; else goto find_email_starts_l25; else goto find_email_starts_l35; else if (*c < 123) if (*c < 97) goto find_email_starts_l25; else goto find_email_starts_l33; else goto find_email_starts_l25; find_email_starts_l34: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 48) if (*c < 46) if (*c < 45) goto find_email_starts_l25; else goto find_email_starts_l34; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) goto find_email_starts_l33; else goto find_email_starts_l25; else goto find_email_starts_l33; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l33; else goto find_email_starts_l25; find_email_starts_l35: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l25; else goto find_email_starts_l36; else goto find_email_starts_l72; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l36: *--scratch = 0; if (c-- == start) return scratch; if (*c < 46) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 65) if (*c < 49) if (*c < 48) if (*c < 47) goto find_email_starts_l37; else goto find_email_starts_l25; else goto find_email_starts_l68; else if (*c < 58) if (*c < 54) goto find_email_starts_l70; else goto find_email_starts_l71; else goto find_email_starts_l25; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else goto find_email_starts_l35; else if (*c < 123) if (*c < 97) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l37: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l25; else goto find_email_starts_l38; else goto find_email_starts_l67; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l38: *--scratch = 0; if (c-- == start) return scratch; if (*c < 46) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 65) if (*c < 49) if (*c < 48) if (*c < 47) goto find_email_starts_l39; else goto find_email_starts_l25; else goto find_email_starts_l63; else if (*c < 58) if (*c < 54) goto find_email_starts_l65; else goto find_email_starts_l66; else goto find_email_starts_l25; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else goto find_email_starts_l35; else if (*c < 123) if (*c < 97) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l39: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l25; else goto find_email_starts_l40; else goto find_email_starts_l62; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l40: *--scratch = 0; if (c-- == start) return scratch; if (*c < 46) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 65) if (*c < 49) if (*c < 48) if (*c < 47) goto find_email_starts_l41; else goto find_email_starts_l25; else goto find_email_starts_l58; else if (*c < 58) if (*c < 54) goto find_email_starts_l60; else goto find_email_starts_l61; else goto find_email_starts_l25; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else goto find_email_starts_l35; else if (*c < 123) if (*c < 97) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l41: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 58) if (*c < 54) if (*c < 48) goto find_email_starts_l25; else goto find_email_starts_l42; else goto find_email_starts_l57; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l42: *--scratch = 0; if (c-- == start) return scratch; if (*c < 48) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 92) if (*c < 58) if (*c < 54) if (*c < 49) goto find_email_starts_l43; else goto find_email_starts_l55; else goto find_email_starts_l56; else if (*c < 91) if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l45; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l43: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 51) if (*c < 49) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l44; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l44: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 93) if (*c < 91) if (*c < 65) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 92) goto find_email_starts_l45; else goto find_email_starts_l25; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l45: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 93) if (*c < 65) if (*c < 64) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l46; else if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l46: *--scratch = 0; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l54; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l49; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l50; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l50; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l47: *--scratch = 0; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l47; else goto find_email_starts_l48; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l49; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l50; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l50; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l48: *--scratch = 0; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l49; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l50; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l50; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l49: *--scratch = 1; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l47; else goto find_email_starts_l48; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l49; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l50; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l50; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l50: *--scratch = 1; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l47; else goto find_email_starts_l51; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l49; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l50; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l50; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l51: *--scratch = 0; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l52; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l52; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l52; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l52: *--scratch = 1; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l53; else goto find_email_starts_l51; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l52; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l46; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l52; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l52; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l53: *--scratch = 0; if (c-- == start) return scratch; if (*c < 45) if (*c < 32) if (*c < 10) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 9) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 13) if (*c < 11) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 40) if (*c < 34) if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l47; else if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l47; else if (*c < 44) if (*c < 42) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 65) if (*c < 58) if (*c < 47) if (*c < 46) goto find_email_starts_l53; else goto find_email_starts_l48; else if (*c < 48) goto find_email_starts_l47; else goto find_email_starts_l52; else if (*c < 64) if (*c < 63) goto find_email_starts_l25; else goto find_email_starts_l47; else goto find_email_starts_l25; else if (*c < 97) if (*c < 93) if (*c < 91) goto find_email_starts_l52; else goto find_email_starts_l25; else if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l47; else if (*c < 127) if (*c < 123) goto find_email_starts_l52; else goto find_email_starts_l47; else goto find_email_starts_l25; find_email_starts_l54: *--scratch = 1; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else if (*c < 32) goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 93) if (*c < 65) if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else if (*c < 97) if (*c < 94) goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l55: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 92) if (*c < 65) if (*c < 51) if (*c < 49) goto find_email_starts_l25; else goto find_email_starts_l44; else goto find_email_starts_l25; else if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l45; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l56: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 92) if (*c < 65) if (*c < 50) if (*c < 49) goto find_email_starts_l25; else goto find_email_starts_l44; else goto find_email_starts_l25; else if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l45; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l57: *--scratch = 0; if (c-- == start) return scratch; if (*c < 48) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 92) if (*c < 58) if (*c < 53) if (*c < 49) goto find_email_starts_l43; else goto find_email_starts_l55; else goto find_email_starts_l56; else if (*c < 91) if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l45; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l58: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 51) if (*c < 49) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l59; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l59: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 47) if (*c < 46) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l41; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l60: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l25; else goto find_email_starts_l41; else goto find_email_starts_l25; else if (*c < 65) if (*c < 51) goto find_email_starts_l59; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l61: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l25; else goto find_email_starts_l41; else goto find_email_starts_l25; else if (*c < 65) if (*c < 50) goto find_email_starts_l59; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l62: *--scratch = 0; if (c-- == start) return scratch; if (*c < 46) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 65) if (*c < 49) if (*c < 48) if (*c < 47) goto find_email_starts_l41; else goto find_email_starts_l25; else goto find_email_starts_l58; else if (*c < 58) if (*c < 53) goto find_email_starts_l60; else goto find_email_starts_l61; else goto find_email_starts_l25; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else goto find_email_starts_l35; else if (*c < 123) if (*c < 97) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l63: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 51) if (*c < 49) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l64; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l64: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 47) if (*c < 46) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l39; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l65: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l25; else goto find_email_starts_l39; else goto find_email_starts_l25; else if (*c < 65) if (*c < 51) goto find_email_starts_l64; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l66: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l25; else goto find_email_starts_l39; else goto find_email_starts_l25; else if (*c < 65) if (*c < 50) goto find_email_starts_l64; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l67: *--scratch = 0; if (c-- == start) return scratch; if (*c < 46) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 65) if (*c < 49) if (*c < 48) if (*c < 47) goto find_email_starts_l39; else goto find_email_starts_l25; else goto find_email_starts_l63; else if (*c < 58) if (*c < 53) goto find_email_starts_l65; else goto find_email_starts_l66; else goto find_email_starts_l25; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else goto find_email_starts_l35; else if (*c < 123) if (*c < 97) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l68: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 51) if (*c < 49) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l69; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l69: *--scratch = 0; if (c-- == start) return scratch; if (*c < 34) if (*c < 11) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else if (*c < 32) if (*c < 14) if (*c < 13) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) goto find_email_starts_l26; else goto find_email_starts_l25; else if (*c < 91) if (*c < 47) if (*c < 46) if (*c < 35) goto find_email_starts_l30; else goto find_email_starts_l25; else goto find_email_starts_l37; else if (*c < 65) goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l70: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l25; else goto find_email_starts_l37; else goto find_email_starts_l25; else if (*c < 65) if (*c < 51) goto find_email_starts_l69; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l71: *--scratch = 0; if (c-- == start) return scratch; if (*c < 35) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l25; else goto find_email_starts_l37; else goto find_email_starts_l25; else if (*c < 65) if (*c < 50) goto find_email_starts_l69; else goto find_email_starts_l25; else goto find_email_starts_l31; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l25; else goto find_email_starts_l35; else goto find_email_starts_l25; else if (*c < 123) goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l72: *--scratch = 0; if (c-- == start) return scratch; if (*c < 46) if (*c < 13) if (*c < 9) if (*c < 1) if (*c < 0) goto find_email_starts_l25; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 11) if (*c < 10) goto find_email_starts_l26; else goto find_email_starts_l0; else goto find_email_starts_l25; else if (*c < 33) if (*c < 32) if (*c < 14) goto find_email_starts_l0; else goto find_email_starts_l25; else goto find_email_starts_l26; else if (*c < 35) if (*c < 34) goto find_email_starts_l25; else goto find_email_starts_l30; else goto find_email_starts_l25; else if (*c < 65) if (*c < 49) if (*c < 48) if (*c < 47) goto find_email_starts_l37; else goto find_email_starts_l25; else goto find_email_starts_l68; else if (*c < 58) if (*c < 53) goto find_email_starts_l70; else goto find_email_starts_l71; else goto find_email_starts_l25; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l31; else goto find_email_starts_l25; else goto find_email_starts_l35; else if (*c < 123) if (*c < 97) goto find_email_starts_l25; else goto find_email_starts_l31; else goto find_email_starts_l25; find_email_starts_l73: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 91) if (*c < 65) goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 92) goto find_email_starts_l0; else goto find_email_starts_l24; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l74: *--scratch = 0; if (c-- == start) return scratch; if (*c < 92) if (*c < 65) if (*c < 51) if (*c < 49) goto find_email_starts_l0; else goto find_email_starts_l14; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l15; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l75: *--scratch = 0; if (c-- == start) return scratch; if (*c < 92) if (*c < 65) if (*c < 50) if (*c < 49) goto find_email_starts_l0; else goto find_email_starts_l14; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l15; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l76: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 53) if (*c < 49) if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l13; else goto find_email_starts_l74; else if (*c < 65) if (*c < 58) goto find_email_starts_l75; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 94) if (*c < 93) if (*c < 92) goto find_email_starts_l15; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l77: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 51) if (*c < 49) goto find_email_starts_l0; else goto find_email_starts_l78; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l78: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l11; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l79: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l11; else goto find_email_starts_l0; else if (*c < 65) if (*c < 51) goto find_email_starts_l78; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l80: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l11; else goto find_email_starts_l0; else if (*c < 65) if (*c < 50) goto find_email_starts_l78; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l81: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l11; else if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l77; else if (*c < 58) if (*c < 53) goto find_email_starts_l79; else goto find_email_starts_l80; else goto find_email_starts_l0; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l82: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 51) if (*c < 49) goto find_email_starts_l0; else goto find_email_starts_l83; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l83: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l9; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l84: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l9; else goto find_email_starts_l0; else if (*c < 65) if (*c < 51) goto find_email_starts_l83; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l85: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l9; else goto find_email_starts_l0; else if (*c < 65) if (*c < 50) goto find_email_starts_l83; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l86: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l9; else if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l82; else if (*c < 58) if (*c < 53) goto find_email_starts_l84; else goto find_email_starts_l85; else goto find_email_starts_l0; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l87: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 51) if (*c < 49) goto find_email_starts_l0; else goto find_email_starts_l88; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l88: *--scratch = 0; if (c-- == start) return scratch; if (*c < 93) if (*c < 65) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l7; else goto find_email_starts_l0; else if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else if (*c < 97) if (*c < 94) goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l89: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l7; else goto find_email_starts_l0; else if (*c < 65) if (*c < 51) goto find_email_starts_l88; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l90: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l7; else goto find_email_starts_l0; else if (*c < 65) if (*c < 50) goto find_email_starts_l88; else goto find_email_starts_l0; else goto find_email_starts_l1; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_email_starts_l0; else goto find_email_starts_l5; else goto find_email_starts_l0; else if (*c < 123) goto find_email_starts_l1; else goto find_email_starts_l0; find_email_starts_l91: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 49) if (*c < 47) if (*c < 46) goto find_email_starts_l0; else goto find_email_starts_l7; else if (*c < 48) goto find_email_starts_l0; else goto find_email_starts_l87; else if (*c < 58) if (*c < 53) goto find_email_starts_l89; else goto find_email_starts_l90; else goto find_email_starts_l0; else if (*c < 94) if (*c < 93) if (*c < 91) goto find_email_starts_l1; else goto find_email_starts_l0; else goto find_email_starts_l5; else if (*c < 123) if (*c < 97) goto find_email_starts_l0; else goto find_email_starts_l1; else goto find_email_starts_l0; } lurker-2.3/render/zap.cpp0000644000175000017500000000752311267074026012374 00000000000000/* $Id: zap.cpp 1648 2009-10-19 14:30:45Z terpstra $ * * zap.cpp - Handle a zap/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include "commands.h" #include "parse.h" #include "Summary.h" #include #include #include using std::cout; static void find_and_replace(string& target, const string& token, const string& value) { string::size_type x = 0; while ((x = target.find(token, x)) != string::npos) target.replace(x, token.length(), value); } int handle_zap(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); char errbuf[80]; int ret; if (!MessageId::is_full(req.options.c_str())) error(_("Bad request"), param, _("The given parameter was not of the correct format. " "A zap request must be formatted like: " "zap/YYYYMMDD.HHMMSS.hashcode.lc.xml")); if (cfg.delete_message == "") error(_("Permission Denied"), param, _("Deleting email (option delete_message) has been disabled. " "Contact the site administrator if this is a problem.")); MessageId id(req.options.c_str()); string ok; Summary source(id); // Identical error if missing or not allowed (security) if ((ok = source.load(db, cfg)) != "" || !source.allowed()) { if (ok == "") ok = "not in a mailbox"; // fake error(_("Database zap source pull failure"), ok, _("The specified message does not exist.")); } if (source.deleted()) error(_("Database zap source pull failure"), "not found", _("The specified message has been deleted.")); string cmd = cfg.delete_message; find_and_replace(cmd, "%c", cfg.file); find_and_replace(cmd, "%i", id.serialize()); map cookies = getCookies(); string pass = cookies["lurker-pass"]; #if 0 cmd += " 2>&1"; cout << "Status: 200 OK\r\n"; cout << "Content-Type: text/plain\r\n\r\n"; cout << cmd << "\n"; cout << pass << "\n"; cout << std::flush; #endif FILE* f = popen(cmd.c_str(), "w"); if (!f) error(_("Executing delete command failed"), cmd, _("Perhaps the command is in error?")); fputs(pass.c_str(), f); if ((ret = pclose(f)) != 0) { sprintf(errbuf, "error %d", ret); error(_("Delete command failed"), errbuf, _("Perhaps you provided a bad password?"), "Set-Cookie: lurker-pass=wrong; path=/; expires=Wed, 10 Jan 1990 20:00:00 GMT\r\n"); } cout << "Status: 200 OK\r\n"; cout << "Content-Type: text/html\r\n\r\n"; cout << "\n"; cout << _("The message has been deleted.
\n"); cout << _("It will disappear from the web when the cronjob next runs.
\n"); cout << _("Going back two pages in 1 second...\n"); cout << "\n"; cout << "\n"; return 0; } lurker-2.3/render/jump.cpp0000644000175000017500000000321411267074431012546 00000000000000/* $Id: jump.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * jump.cpp - Jump to a given date offset * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "parse.h" #include #include #include int main() { map args = getParams(); struct tm tms; memset(&tms, 0, sizeof(tms)); tms.tm_sec = atol(args["sec" ].c_str()); tms.tm_min = atol(args["min" ].c_str()); tms.tm_hour = atol(args["hour"].c_str()); tms.tm_mday = atol(args["mday"].c_str()); tms.tm_mon = atol(args["mon" ].c_str()) - 1; tms.tm_year = atol(args["year"].c_str()) - 1900; time_t utc = atol(args["utc"].c_str()); if (utc) tms = *gmtime(&utc); char buf[26]; strftime(buf, 25, "%Y%m%d.%H%M%S", &tms); return redirectUrl( args["doc-url"] + "/mindex/" + args["list"] + "@" + buf + ".00000000." + args["format"]); } lurker-2.3/render/parse.h0000644000175000017500000000226511267074431012357 00000000000000/* $Id: parse.h 1649 2009-10-19 14:35:01Z terpstra $ * * parse.h - Deal with CGI ugliness * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef PARSE_H #define PARSE_H #include #include using namespace std; string decipherHalf(const string& str); map getParams(); map getCookies(); string uriEncode(const string& str); int redirectUrl(const string& url); #endif lurker-2.3/render/Threading.cpp0000644000175000017500000002736211267074431013512 00000000000000/* $Id: Threading.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Threading.h - Helper which can load a thread tree * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "Threading.h" #include #include #include #include #include #define DAY_GAP_FOR_NEW_THREAD 40 #define EMPTY_CELL "" #define BAR_NS "" #define BAR_EW "" #define CORNER_SW "" #define TEE_WSE "" #define MESSAGE_END 'f' #define MESSAGE_DOWN 'g' #define MESSAGE_BOTH 'h' #define TOPMESSAGE_END 'i' #define TOPMESSAGE_DOWN 'j' #define TOPMESSAGE_BOTH 'k' using namespace std; using namespace ESort; string Threading::load(Reader* r, const Summary& sum, Key& out) { // dump any prior state hashes.clear(); nodes.clear(); string prefix = LU_THREADING + subject_hash(sum.subject().c_str()); auto_ptr backwards(r->seek(prefix, sum.id().raw(), Backward)); /** Walk backwards until we find step off the subject, or there is * a break of more than 40 days between messages. */ MessageId root = sum.id(); while (backwards->advance() != -1) { if (backwards->key.length() < prefix.length() + 8) return "corrupt threading record -- too short"; MessageId x(backwards->key.c_str() + prefix.length(), 1); if (x.timestamp() + 60*60*24*DAY_GAP_FOR_NEW_THREAD < root.timestamp()) break; root = x; } /** Ok, we have found what will be the root of the tree. * Now, we shall seek and read the messages off. */ auto_ptr forwards(r->seek(prefix, root.raw(), Forward)); /* We read the nodes off in timestamp sorted order */ std::list timestamp_sorted; /** Walk forwards until we find step off the subject, or there is * a break of more than 40 days between messages. */ MessageId prev = root; while (forwards->advance() != -1) { if (forwards->key.length() < prefix.length() + 8) return "corrupt forwardthreading record -- too short"; MessageId x(forwards->key.c_str() + prefix.length(), 1); if (prev.timestamp() + 60*60*24*DAY_GAP_FOR_NEW_THREAD < x.timestamp()) break; timestamp_sorted.push_back(Node(x)); Node& b = timestamp_sorted.back(); b.in_reply_tos.assign( forwards->key.c_str() + prefix.length() + 8, forwards->key.length() - prefix.length() - 8); // record that this hash does in fact exist hashes[b.summary.id().hash()] = -1; prev = x; } /** We now have all the messages in timestamp sorted order. * Let's scan the list for the first message with no predecessor. */ while (!timestamp_sorted.empty()) { std::list::iterator i; for (i = timestamp_sorted.begin(); i != timestamp_sorted.end(); ++i) { // scan all the in_reply_tos. if none of them are left // in timestamp_sorted, then this should come next. // (ie: no predecessors and lowest timestamp) i->replyee = -1; // find best predecessor also string::size_type replyto; for (replyto = 0; replyto+4 <= i->in_reply_tos.size(); replyto += 4) { map::iterator r = hashes.find( i->in_reply_tos.substr(replyto, 4)); if (r != hashes.end()) { if (r->second == -1) { // still in the timestamp queue break; } else if (r->second > i->replyee) { // an older predecessor i->replyee = r->second; } } } // Did we find no queued predecessors? if (replyto+4 > i->in_reply_tos.size()) break; } // deal with cycles (theorectically impossible, but ...) if (i == timestamp_sorted.end()) i = timestamp_sorted.begin(); hashes[i->summary.id().hash()] = nodes.size(); nodes.push_back(*i); timestamp_sorted.erase(i); // prep the node Node& b = nodes.back(); b.replies = 0; b.replyor_first = -1; b.replyor_next = -1; b.draw_next = -1; b.depth = nodes.size() - 1; b.consumed = 0; if (b.replyee != -1) nodes[b.replyee].replies++; // check for high-lighted node if (b.summary.id() == sum.id()) out = b.depth; } Node* tree = &nodes[0]; /** Resolve back links */ for (int i = nodes.size()-1; i > 0; i--) { int p = tree[i].replyee; if (p == -1) continue; if (tree[p].depth < tree[i].depth) tree[p].depth = tree[i].depth; /* Insertion sort is not that fast... * But compared to the drawing algo, this n^2 is negligable. */ int* w = &tree[p].replyor_first; while (*w != -1 && tree[*w].depth > tree[i].depth) w = &tree[*w].replyor_next; tree[i].replyor_next = *w; *w = i; } return ""; } set Threading::replies(Key k) { set out; for (int l = nodes[k].replyor_first; l != -1; l = nodes[l].replyor_next) out.insert(nodes[l].summary); return out; } Summary& Threading::getSummary(Key m) { return nodes[m].summary; } void my_service_tree_message_link( ostream& o, Threading::Node* tree, int i, int hl) { int selected = (hl == i); // int drift = 0; // !!! too bad I can't do this... char x; if (tree[i].replyee == -1) { switch (tree[i].replies) { case 0: x = TOPMESSAGE_END; break; case 1: x = TOPMESSAGE_DOWN; break; default: x = TOPMESSAGE_BOTH; break; } } else { switch (tree[i].replies) { case 0: x = MESSAGE_END; break; case 1: x = MESSAGE_DOWN; break; default: x = MESSAGE_BOTH; break; } } o << "<" << x; if (selected) o << " selected=\"yes\""; o << " id=\"" << tree[i].summary.id().serialize() << "\"/>"; } int my_service_draw_tree( Threading::Node* tree, int n, int u) { int i; int c; int col = 0; /* Find the column we can use. */ for (i = u; i <= tree[n].depth; i++) if (col < tree[i].consumed) col = tree[i].consumed; tree[n].consumed = col; tree[n].column = col; for (c = tree[n].replyor_first; c != -1; c = tree[c].replyor_next) { col = my_service_draw_tree(tree, c, n); for (i = n; i < c; i++) tree[i].consumed = col+1; } return tree[n].column; } string Threading::draw_tree(Reader* db) { Threading::Node* tree = &nodes[0]; int tree_size = nodes.size(); for (int i = 0; i < tree_size; ++i) if (tree[i].replyee == -1) my_service_draw_tree(tree, i, i); return ""; } void my_service_draw_tree_row( ostream& o, Threading::Node* tree, int* head, int i) { int col, p; int* w; #ifdef DEBUG printf("\nOffset: %d", tree[i].column); #endif col = 0; w = head; while (*w != -1) { for (; col < tree[*w].column; col++) o << EMPTY_CELL; if (*w == i) break; o << BAR_NS; col++; w = &tree[*w].draw_next; } for (; col < tree[i].column; col++) o << EMPTY_CELL; my_service_tree_message_link(o, tree, i, -1); col++; /* Cut ourselves out of the list and graft on our * children. While we're at it, draw the links. */ for (p = tree[i].replyor_first; p != -1; p = tree[p].replyor_next) { *w = p; w = &tree[p].draw_next; if (col > tree[p].column) continue; for (; col < tree[p].column; col++) o << BAR_EW; col++; if (tree[p].replyor_next == -1) o << CORNER_SW; else o << TEE_WSE; } *w = tree[i].draw_next; /* Continue drawing the other children */ for (p = *w; p != -1; p = tree[p].draw_next) { for (; col < tree[p].column; col++) o << EMPTY_CELL; col++; o << BAR_NS; } } void Threading::draw_tree_row(ostream& o, int* h, Key row) { my_service_draw_tree_row(o, &nodes[0], h, row); } int my_service_draw_snippet( ESort::Reader* db, Threading::Node* tree, int p, int row, string& out, int num, const Config& cfg) { int col; int c; bool dangle_reply = false; col = tree[p].column = tree[p].consumed; if (row < 3) { out = tree[p].summary.load(db, cfg); if (out != "") return -1; for (c = tree[p].replyor_first; c != -1; c = tree[c].replyor_next) { tree[c].consumed = col; col = my_service_draw_snippet(db, tree, c, row+1, out, num, cfg); if (col == -1) return -1; } if (p+1 < num && tree[p+1].replyee == -1) { // draw it as though it were a child dangle_reply = true; c = p+1; tree[c].consumed = col; col = my_service_draw_snippet(db, tree, c, row+1, out, num, cfg); if (col == -1) return -1; } } if ((tree[p].replyor_first == -1 && !dangle_reply) || row >= 3) col++; return col; } int my_service_pick_p(Threading::Node* tree, int root, int num) { int p = root; // If we have nothing which is drawn below us move up an extra step if (tree[p].replyor_first == -1 && (p+1 >= num || tree[p+1].replyee != -1)) { // we have no children and we have no dangling replyee if (tree[p].replyee != -1) p = tree[p].replyee; else if (p != 0) p = p - 1; // use the dangling replyee trick } // always move up at least one row if we can if (tree[p].replyee != -1) p = tree[p].replyee; else if (p != 0) p = p - 1; // use dangling replyee trick return p; } string Threading::draw_snippet(ESort::Reader* db, Key root, const Config& cfg) { Threading::Node* tree = &nodes[0]; string out; my_service_draw_snippet(db, tree, my_service_pick_p(tree, root, nodes.size()), 0, out, nodes.size(), cfg); return out; } void my_service_draw_snippet_row( ostream& o, Threading::Node* tree, int* draw_head, int row, int hl, int num) { int p; int c; int col = 0; /* First, draw the current row */ for (p = *draw_head; p != -1; p = tree[p].draw_next) { for (; col < tree[p].column; col++) o << EMPTY_CELL; my_service_tree_message_link(o, tree, p, hl); col++; /* Now, inject our children in place. * Also, draw the stuff down to them. */ for (c = tree[p].replyor_first; c != -1; c = tree[c].replyor_next) { *draw_head = c; draw_head = &tree[c].draw_next; if (c == tree[p].replyor_first) continue; for (; col < tree[c].column; col++) o << BAR_EW; if (tree[c].replyor_next == -1) o << CORNER_SW; else o << TEE_WSE; col++; } // Check if the next message after p has no in-reply-to if (p+1 < num && tree[p+1].replyee == -1) { // draw it as though it were a child *draw_head = p+1; draw_head = &tree[p+1].draw_next; } } /* Terminate the list */ *draw_head = -1; } void Threading::draw_snippet_row(ostream& o, int* h, Key row, Key root) { Threading::Node* tree = &nodes[0]; if (*h == -2) *h = my_service_pick_p(tree, root, nodes.size()); my_service_draw_snippet_row(o, tree, h, row, root, nodes.size()); } string Threading::findprev(Key m, ESort::Reader* r, const Config& cfg, Summary& s) { string ok; Key i = m; while (1) { if (i == 0) { s = nodes[m].summary; return ""; } --i; if (!nodes[i].summary.loaded() && (ok = nodes[i].summary.load(r, cfg)) != "") return ok; if (!nodes[i].summary.deleted()) { s = nodes[i].summary; return ""; } } } string Threading::findnext(Key m, ESort::Reader* r, const Config& cfg, Summary& s) { string ok; Key i = m; while (1) { ++i; if (i == nodes.size()) { s = nodes[m].summary; return ""; } if (!nodes[i].summary.loaded() && (ok = nodes[i].summary.load(r, cfg)) != "") return ok; if (!nodes[i].summary.deleted()) { s = nodes[i].summary; return ""; } } } lurker-2.3/render/attach.cpp0000644000175000017500000001074511267074431013046 00000000000000/* $Id: attach.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * attach.cpp - Handle a attach/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include "commands.h" #include "Summary.h" #include #include using std::cout; DwEntity& attach_find(DwEntity& e, long& x) { // We are the requested entity. if (--x == 0) return e; // if (e.hasHeaders() && if (e.Headers().HasContentType()) { DwMediaType& t = e.Headers().ContentType(); switch (t.Type()) { case DwMime::kTypeMessage: if (e.Body().Message()) return attach_find(*e.Body().Message(), x); break; case DwMime::kTypeMultipart: for (DwBodyPart* p = e.Body().FirstBodyPart(); p != 0; p = p->Next()) { DwEntity& o = attach_find(*p, x); if (x == 0) return o; } break; } } return e; } string unfold_header(const char* hdr) { string out; while (*hdr != 0) { if (*hdr == '\r' || *hdr == '\n' || *hdr == '\t') out += ' '; else out += *hdr; ++hdr; } return out; } int handle_attach(const Config& cfg, ESort::Reader* db, const string& param) { string::size_type o = param.find('@'); long n = atol(param.c_str()); if (!cfg.raw_email) error(_("Permission Denied"), param, _("Access to mail attachments has been disabled. " "Contact the site administrator if this is a problem.")); if (o == string::npos || n <= 0 || !MessageId::is_full(param.c_str()+o+1)) error(_("Bad request"), param, _("The given parameter was not of the correct format. " "An attach request must be formatted like: " "attach/id@YYYYMMDD.HHMMSS.hashcode.xml where id " "is the number of the attachment.")); MessageId id(param.c_str()+o+1); string ok; Summary source(id); // Identical error if missing or not allowed if ((ok = source.load(db, cfg)) != "" || !source.allowed()) { if (ok == "") ok = "not in a mailbox"; // fake error(_("Database attach source pull failure"), ok, _("The specified message does not exist.")); } if (source.deleted()) error(_("Database attach source pull failure"), "not found", _("The specified message has been deleted.")); DwMessage message; if ((ok = source.message(cfg.dbdir, message)) != "") error(_("MBox read failure"), ok, _("Unable to open message in the mailbox. " "Perhaps it has been deleted or moved?")); DwEntity& e = attach_find(message, n); // Cannot cache an attachment because they have strange content-type cout << "Status: 200 OK\r\n" << "Content-Type: "; // if (e.hasHeaders() && if (e.Headers().HasContentType()) cout << unfold_header( e.Headers().ContentType().AsString().c_str()); else cout << "text/plain"; cout << "\r\n"; if (e.Headers().HasContentDisposition()) cout << "Content-Disposition: " << unfold_header(e.Headers().ContentDisposition().AsString().c_str()) << "\r\n"; cout << "\r\n"; DwString out; // if (e.hasHeaders() && if (e.Headers().HasContentTransferEncoding()) { switch (e.Headers().ContentTransferEncoding().AsEnum()) { case DwMime::kCteQuotedPrintable: DwDecodeQuotedPrintable(e.Body().AsString(), out); break; case DwMime::kCteBase64: DwDecodeBase64(e.Body().AsString(), out); break; case DwMime::kCteNull: case DwMime::kCteUnknown: case DwMime::kCte7bit: case DwMime::kCte8bit: case DwMime::kCteBinary: out = e.Body().AsString(); break; } } else { out = e.Body().AsString(); } cout.write(out.c_str(), out.length()); return 0; } lurker-2.3/render/art.cpp0000644000175000017500000002652311272626444012374 00000000000000const char* find_art_end(const char* start, const char* end) { const char* out = 0; const char* c = start; goto find_art_end_start; //find_art_end_l0: ++c; find_art_end_start: if (c == end) return out; if (*c < 11) if (*c < 10) goto find_art_end_l1; else goto find_art_end_l2; else goto find_art_end_l1; find_art_end_l1: return out; find_art_end_l2: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l3; else if (*c < 62) if (*c < 33) goto find_art_end_l16; else goto find_art_end_l3; else if (*c < 63) goto find_art_end_l2; else goto find_art_end_l3; find_art_end_l3: ++c; if (c == end) return out; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l4; else goto find_art_end_l2; else if (*c < 33) if (*c < 32) goto find_art_end_l3; else goto find_art_end_l13; else goto find_art_end_l3; find_art_end_l4: ++c; out = c; if (c == end) return out; if (*c < 11) if (*c < 10) goto find_art_end_l4; else goto find_art_end_l5; else goto find_art_end_l4; find_art_end_l5: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l4; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l4; else if (*c < 62) if (*c < 33) goto find_art_end_l10; else goto find_art_end_l4; else if (*c < 63) goto find_art_end_l5; else goto find_art_end_l4; find_art_end_l6: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l4; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l4; else if (*c < 62) if (*c < 33) goto find_art_end_l6; else goto find_art_end_l4; else if (*c < 63) goto find_art_end_l7; else goto find_art_end_l4; find_art_end_l7: ++c; out = c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l4; else goto find_art_end_l7; else if (*c < 11) goto find_art_end_l8; else goto find_art_end_l4; else if (*c < 62) if (*c < 33) goto find_art_end_l7; else goto find_art_end_l4; else if (*c < 63) goto find_art_end_l7; else goto find_art_end_l4; find_art_end_l8: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l9; else goto find_art_end_l8; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l9; else if (*c < 62) if (*c < 33) goto find_art_end_l8; else goto find_art_end_l9; else if (*c < 63) goto find_art_end_l8; else goto find_art_end_l9; find_art_end_l9: ++c; out = c; if (c == end) return out; if (*c < 11) if (*c < 10) goto find_art_end_l9; else goto find_art_end_l8; else goto find_art_end_l9; find_art_end_l10: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l4; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l4; else if (*c < 62) if (*c < 33) goto find_art_end_l11; else goto find_art_end_l4; else if (*c < 63) goto find_art_end_l5; else goto find_art_end_l4; find_art_end_l11: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l4; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l4; else if (*c < 62) if (*c < 33) goto find_art_end_l12; else goto find_art_end_l4; else if (*c < 63) goto find_art_end_l5; else goto find_art_end_l4; find_art_end_l12: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l4; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l4; else if (*c < 62) if (*c < 33) goto find_art_end_l6; else goto find_art_end_l4; else if (*c < 63) goto find_art_end_l5; else goto find_art_end_l4; find_art_end_l13: ++c; if (c == end) return out; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l4; else goto find_art_end_l2; else if (*c < 33) if (*c < 32) goto find_art_end_l3; else goto find_art_end_l14; else goto find_art_end_l3; find_art_end_l14: ++c; if (c == end) return out; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l4; else goto find_art_end_l2; else if (*c < 33) if (*c < 32) goto find_art_end_l3; else goto find_art_end_l15; else goto find_art_end_l3; find_art_end_l15: ++c; if (c == end) return out; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l4; else goto find_art_end_l2; else if (*c < 33) if (*c < 32) goto find_art_end_l3; else goto find_art_end_l4; else goto find_art_end_l3; find_art_end_l16: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l3; else if (*c < 62) if (*c < 33) goto find_art_end_l17; else goto find_art_end_l3; else if (*c < 63) goto find_art_end_l2; else goto find_art_end_l3; find_art_end_l17: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l3; else if (*c < 62) if (*c < 33) goto find_art_end_l18; else goto find_art_end_l3; else if (*c < 63) goto find_art_end_l2; else goto find_art_end_l3; find_art_end_l18: ++c; if (c == end) return out; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_end_l3; else goto find_art_end_l6; else if (*c < 11) goto find_art_end_l1; else goto find_art_end_l3; else if (*c < 62) if (*c < 33) goto find_art_end_l6; else goto find_art_end_l3; else if (*c < 63) goto find_art_end_l2; else goto find_art_end_l3; } char* find_art_starts(const char* start, const char* end, char* scratch) { const char* c = end; scratch += (end - start); goto find_art_starts_start; find_art_starts_l0: *--scratch = 0; find_art_starts_start: if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l4; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l12; else goto find_art_starts_l1; find_art_starts_l1: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l2; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l9; else goto find_art_starts_l1; find_art_starts_l2: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) goto find_art_starts_l2; else goto find_art_starts_l3; else goto find_art_starts_l2; find_art_starts_l3: *--scratch = 1; if (c-- == start) return scratch; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_starts_l2; else goto find_art_starts_l4; else if (*c < 11) goto find_art_starts_l0; else goto find_art_starts_l2; else if (*c < 62) if (*c < 33) goto find_art_starts_l4; else goto find_art_starts_l2; else if (*c < 63) goto find_art_starts_l5; else goto find_art_starts_l2; find_art_starts_l4: *--scratch = 0; if (c-- == start) return scratch; if (*c < 32) if (*c < 10) if (*c < 9) goto find_art_starts_l2; else goto find_art_starts_l4; else if (*c < 11) goto find_art_starts_l0; else goto find_art_starts_l2; else if (*c < 62) if (*c < 33) goto find_art_starts_l4; else goto find_art_starts_l2; else if (*c < 63) goto find_art_starts_l5; else goto find_art_starts_l2; find_art_starts_l5: *--scratch = 0; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 10) goto find_art_starts_l2; else goto find_art_starts_l0; else if (*c < 32) goto find_art_starts_l2; else goto find_art_starts_l6; else if (*c < 63) if (*c < 62) goto find_art_starts_l2; else goto find_art_starts_l5; else goto find_art_starts_l2; find_art_starts_l6: *--scratch = 0; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 10) goto find_art_starts_l2; else goto find_art_starts_l0; else if (*c < 32) goto find_art_starts_l2; else goto find_art_starts_l7; else if (*c < 63) if (*c < 62) goto find_art_starts_l2; else goto find_art_starts_l5; else goto find_art_starts_l2; find_art_starts_l7: *--scratch = 0; if (c-- == start) return scratch; if (*c < 33) if (*c < 11) if (*c < 10) goto find_art_starts_l2; else goto find_art_starts_l0; else if (*c < 32) goto find_art_starts_l2; else goto find_art_starts_l8; else if (*c < 63) if (*c < 62) goto find_art_starts_l2; else goto find_art_starts_l5; else goto find_art_starts_l2; find_art_starts_l8: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 11) if (*c < 10) goto find_art_starts_l2; else goto find_art_starts_l0; else goto find_art_starts_l2; else if (*c < 63) goto find_art_starts_l5; else goto find_art_starts_l2; find_art_starts_l9: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l2; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l10; else goto find_art_starts_l1; find_art_starts_l10: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l2; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l11; else goto find_art_starts_l1; find_art_starts_l11: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l2; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l2; else goto find_art_starts_l1; find_art_starts_l12: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l4; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l13; else goto find_art_starts_l1; find_art_starts_l13: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l4; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l14; else goto find_art_starts_l1; find_art_starts_l14: *--scratch = 0; if (c-- == start) return scratch; if (*c < 11) if (*c < 10) if (*c < 9) goto find_art_starts_l1; else goto find_art_starts_l4; else goto find_art_starts_l0; else if (*c < 33) if (*c < 32) goto find_art_starts_l1; else goto find_art_starts_l4; else goto find_art_starts_l1; } lurker-2.3/render/keyword.cpp0000644000175000017500000000613311267074431013262 00000000000000/* $Id: keyword.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * jump.cpp - Jump to a given date offset * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include "parse.h" #include #include #include #include #include using std::set; vector keys; set dups; int push_key(const char* keyword, void* arg) { if (dups.find(keyword) == dups.end()) { dups.insert(keyword); keys.push_back(keyword); } return 0; } int main() { map args = getParams(); struct tm tms; memset(&tms, 0, sizeof(tms)); tms.tm_sec = args.find("sec" ) != args.end() ? atol(args["sec" ].c_str()) : 0; tms.tm_min = args.find("min" ) != args.end() ? atol(args["min" ].c_str()) : 0; tms.tm_hour = args.find("hour") != args.end() ? atol(args["hour"].c_str()) : 0; tms.tm_mday = args.find("mday") != args.end() ? atol(args["mday"].c_str()) : 1; tms.tm_mon = args.find("mon" ) != args.end() ? atol(args["mon" ].c_str()) - 1 : 0; tms.tm_year = args.find("year") != args.end() ? atol(args["year"].c_str()) - 1900 : 138; time_t utc = atol(args["utc"].c_str()); if (utc) tms = *gmtime(&utc); char buf[26]; strftime(buf, 25, "%Y%m%d.%H%M%S", &tms); my_keyword_digest_string( args["subject"].c_str(), args["subject"].length(), LU_KEYWORD_SUBJECT, &push_key, 0, 0); my_keyword_digest_string( args["author"].c_str(), args["author"].length(), LU_KEYWORD_AUTHOR, &push_key, 0, 0); my_keyword_digest_string( args["query"].c_str(), args["query"].length(), LU_KEYWORD_WORD, &push_key, 0, 0); my_keyword_digest_string( args["list"].c_str(), args["list"].length(), LU_KEYWORD_LIST, &push_key, 0, 0); my_keyword_digest_string( args["group"].c_str(), args["group"].length(), LU_KEYWORD_GROUP, &push_key, 0, 0); my_keyword_digest_string( args["lang"].c_str(), args["lang"].length(), LU_KEYWORD_LANGUAGE, &push_key, 0, 0); string url = args["doc-url"] + "/search/" + string(buf) + ".00000000@"; vector::iterator i; for (i = keys.begin(); i != keys.end(); ++i) { if (i != keys.begin()) url += ","; // Escape '/' to '!' in url to avoid path problems string::size_type x = 0; while ((x = i->find('/', x)) != string::npos) (*i)[x++] = '!'; url += *i; } url += "." + args["format"]; return redirectUrl(url); } lurker-2.3/render/url.cpp0000644000175000017500000113756411267147155012422 00000000000000const char* find_url_end(const char* start, const char* end) { const char* out = 0; const char* c = start; goto find_url_end_start; //find_url_end_l0: ++c; find_url_end_start: if (c == end) return out; if (*c < 78) if (*c < 61) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l2; else goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 71) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 70) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else goto find_url_end_l28; else if (*c < 74) if (*c < 73) if (*c < 72) goto find_url_end_l2; else goto find_url_end_l277; else goto find_url_end_l281; else if (*c < 77) goto find_url_end_l2; else goto find_url_end_l283; else if (*c < 105) if (*c < 96) if (*c < 88) if (*c < 87) if (*c < 79) goto find_url_end_l306; else goto find_url_end_l2; else goto find_url_end_l309; else if (*c < 95) if (*c < 91) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 103) if (*c < 102) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l28; else if (*c < 104) goto find_url_end_l2; else goto find_url_end_l277; else if (*c < 119) if (*c < 110) if (*c < 109) if (*c < 106) goto find_url_end_l281; else goto find_url_end_l2; else goto find_url_end_l283; else if (*c < 111) goto find_url_end_l306; else goto find_url_end_l2; else if (*c < 126) if (*c < 123) if (*c < 120) goto find_url_end_l309; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l1: return out; find_url_end_l2: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l2; else goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 61) if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l8; else if (*c < 95) if (*c < 91) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l3: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l4; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l4; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l4; else goto find_url_end_l1; find_url_end_l4: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l5: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l5; else goto find_url_end_l6; else goto find_url_end_l5; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l1; else if (*c < 61) if (*c < 60) goto find_url_end_l5; else goto find_url_end_l1; else goto find_url_end_l5; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l8; else if (*c < 95) if (*c < 91) goto find_url_end_l5; else goto find_url_end_l1; else goto find_url_end_l5; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l5; else goto find_url_end_l1; find_url_end_l6: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l7; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l7; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l7; else goto find_url_end_l1; find_url_end_l7: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l5; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l5; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l1; find_url_end_l8: ++c; if (c == end) return out; if (*c < 102) if (*c < 87) if (*c < 71) if (*c < 70) goto find_url_end_l1; else goto find_url_end_l9; else goto find_url_end_l1; else if (*c < 88) goto find_url_end_l26; else goto find_url_end_l1; else if (*c < 119) if (*c < 103) goto find_url_end_l9; else goto find_url_end_l1; else if (*c < 120) goto find_url_end_l26; else goto find_url_end_l1; find_url_end_l9: ++c; if (c == end) return out; if (*c < 116) if (*c < 85) if (*c < 84) goto find_url_end_l1; else goto find_url_end_l10; else goto find_url_end_l1; else if (*c < 117) goto find_url_end_l10; else goto find_url_end_l1; find_url_end_l10: ++c; if (c == end) return out; if (*c < 112) if (*c < 81) if (*c < 80) goto find_url_end_l1; else goto find_url_end_l11; else goto find_url_end_l1; else if (*c < 113) goto find_url_end_l11; else goto find_url_end_l1; find_url_end_l11: ++c; if (c == end) return out; if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l12; else goto find_url_end_l1; find_url_end_l12: ++c; if (c == end) return out; if (*c < 91) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l13; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l15; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l15; else goto find_url_end_l1; find_url_end_l13: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l14; else goto find_url_end_l12; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l13; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l13; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l13; else goto find_url_end_l1; find_url_end_l14: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l14; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l13; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l13; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l13; else goto find_url_end_l1; find_url_end_l15: ++c; out = c; if (c == end) return out; if (*c < 58) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l20; else if (*c < 48) if (*c < 47) goto find_url_end_l21; else goto find_url_end_l22; else goto find_url_end_l15; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l15; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l15; else goto find_url_end_l1; find_url_end_l16: ++c; if (c == end) return out; if (*c < 62) if (*c < 38) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 37) goto find_url_end_l16; else goto find_url_end_l17; else if (*c < 60) if (*c < 58) if (*c < 47) goto find_url_end_l16; else goto find_url_end_l19; else goto find_url_end_l16; else if (*c < 61) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 96) if (*c < 91) if (*c < 65) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l19; else if (*c < 95) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l19; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l16; else goto find_url_end_l1; find_url_end_l17: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l18; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l18; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l18; else goto find_url_end_l1; find_url_end_l18: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l19; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l19; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l19; else goto find_url_end_l1; find_url_end_l19: ++c; out = c; if (c == end) return out; if (*c < 62) if (*c < 38) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 37) goto find_url_end_l16; else goto find_url_end_l17; else if (*c < 60) if (*c < 58) if (*c < 47) goto find_url_end_l16; else goto find_url_end_l19; else goto find_url_end_l16; else if (*c < 61) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 96) if (*c < 91) if (*c < 65) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l19; else if (*c < 95) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l19; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l16; else goto find_url_end_l1; find_url_end_l20: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l20; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l15; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l15; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l15; else goto find_url_end_l1; find_url_end_l21: ++c; if (c == end) return out; if (*c < 63) if (*c < 47) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 58) if (*c < 48) goto find_url_end_l22; else goto find_url_end_l13; else goto find_url_end_l1; else if (*c < 91) if (*c < 65) if (*c < 64) goto find_url_end_l23; else goto find_url_end_l1; else goto find_url_end_l15; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l15; else goto find_url_end_l1; find_url_end_l22: ++c; out = c; if (c == end) return out; if (*c < 62) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l23; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l23; else goto find_url_end_l24; else if (*c < 60) if (*c < 58) if (*c < 47) goto find_url_end_l23; else goto find_url_end_l22; else goto find_url_end_l23; else if (*c < 61) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 96) if (*c < 91) if (*c < 65) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else goto find_url_end_l22; else if (*c < 95) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l22; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l23; else goto find_url_end_l1; find_url_end_l23: ++c; if (c == end) return out; if (*c < 62) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l23; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l23; else goto find_url_end_l24; else if (*c < 60) if (*c < 58) if (*c < 47) goto find_url_end_l23; else goto find_url_end_l22; else goto find_url_end_l23; else if (*c < 61) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 96) if (*c < 91) if (*c < 65) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else goto find_url_end_l22; else if (*c < 95) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l22; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l23; else goto find_url_end_l1; find_url_end_l24: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l25; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l25; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l25; else goto find_url_end_l1; find_url_end_l25: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l22; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l22; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l22; else goto find_url_end_l1; find_url_end_l26: ++c; if (c == end) return out; if (*c < 119) if (*c < 88) if (*c < 87) goto find_url_end_l1; else goto find_url_end_l27; else goto find_url_end_l1; else if (*c < 120) goto find_url_end_l27; else goto find_url_end_l1; find_url_end_l27: ++c; if (c == end) return out; if (*c < 119) if (*c < 88) if (*c < 87) goto find_url_end_l1; else goto find_url_end_l11; else goto find_url_end_l1; else if (*c < 120) goto find_url_end_l11; else goto find_url_end_l1; find_url_end_l28: ++c; if (c == end) return out; if (*c < 73) if (*c < 58) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 62) if (*c < 60) if (*c < 59) goto find_url_end_l5; else goto find_url_end_l2; else if (*c < 61) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 105) if (*c < 91) if (*c < 84) if (*c < 74) goto find_url_end_l29; else goto find_url_end_l2; else if (*c < 85) goto find_url_end_l269; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 123) if (*c < 116) if (*c < 106) goto find_url_end_l29; else goto find_url_end_l2; else if (*c < 117) goto find_url_end_l269; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l29: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 76) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 77) goto find_url_end_l30; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 109) if (*c < 108) goto find_url_end_l2; else goto find_url_end_l30; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l30: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 69) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 70) goto find_url_end_l31; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 102) if (*c < 101) goto find_url_end_l2; else goto find_url_end_l31; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l31: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l2; else goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l32; else if (*c < 61) if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l8; else if (*c < 95) if (*c < 91) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l32: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l5; else goto find_url_end_l6; else goto find_url_end_l5; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l33; else goto find_url_end_l5; else goto find_url_end_l1; else if (*c < 61) if (*c < 60) goto find_url_end_l5; else goto find_url_end_l1; else goto find_url_end_l5; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l8; else if (*c < 95) if (*c < 91) goto find_url_end_l5; else goto find_url_end_l1; else goto find_url_end_l5; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l5; else goto find_url_end_l1; find_url_end_l33: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) goto find_url_end_l1; else goto find_url_end_l34; else goto find_url_end_l1; find_url_end_l34: ++c; out = c; if (c == end) return out; if (*c < 60) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 51) if (*c < 49) if (*c < 48) goto find_url_end_l22; else goto find_url_end_l229; else if (*c < 50) goto find_url_end_l265; else goto find_url_end_l267; else if (*c < 59) if (*c < 58) goto find_url_end_l266; else goto find_url_end_l236; else goto find_url_end_l35; else if (*c < 92) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l233; else goto find_url_end_l73; else if (*c < 123) if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 97) goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l35: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l38; else if (*c < 61) if (*c < 60) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l41; else if (*c < 95) if (*c < 91) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l36: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l37; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l37; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l37; else goto find_url_end_l1; find_url_end_l37: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l38: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l38; else goto find_url_end_l39; else goto find_url_end_l38; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 61) if (*c < 60) goto find_url_end_l38; else goto find_url_end_l1; else goto find_url_end_l38; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l41; else if (*c < 95) if (*c < 91) goto find_url_end_l38; else goto find_url_end_l1; else goto find_url_end_l38; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l38; else goto find_url_end_l1; find_url_end_l39: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l40; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l40; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l40; else goto find_url_end_l1; find_url_end_l40: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l38; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l38; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; find_url_end_l41: ++c; if (c == end) return out; if (*c < 59) if (*c < 49) if (*c < 47) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 48) goto find_url_end_l22; else goto find_url_end_l42; else if (*c < 51) if (*c < 50) goto find_url_end_l69; else goto find_url_end_l71; else if (*c < 58) goto find_url_end_l70; else goto find_url_end_l49; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l46; else if (*c < 97) if (*c < 92) goto find_url_end_l73; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l42: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l51; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l43: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l44: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l45; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l45: ++c; if (c == end) return out; if (*c < 91) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l46; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l46: ++c; out = c; if (c == end) return out; if (*c < 59) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l47; else if (*c < 48) if (*c < 47) goto find_url_end_l48; else goto find_url_end_l22; else if (*c < 58) goto find_url_end_l46; else goto find_url_end_l49; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l46; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l47: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l47; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l46; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l46; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l48: ++c; if (c == end) return out; if (*c < 63) if (*c < 48) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 47) goto find_url_end_l1; else goto find_url_end_l22; else if (*c < 59) if (*c < 58) goto find_url_end_l44; else goto find_url_end_l49; else goto find_url_end_l1; else if (*c < 91) if (*c < 65) if (*c < 64) goto find_url_end_l23; else goto find_url_end_l1; else goto find_url_end_l46; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l49: ++c; if (c == end) return out; if (*c < 48) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 47) goto find_url_end_l1; else goto find_url_end_l22; else if (*c < 63) if (*c < 58) goto find_url_end_l50; else goto find_url_end_l1; else if (*c < 64) goto find_url_end_l23; else goto find_url_end_l1; find_url_end_l50: ++c; out = c; if (c == end) return out; if (*c < 48) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 47) goto find_url_end_l1; else goto find_url_end_l22; else if (*c < 63) if (*c < 58) goto find_url_end_l50; else goto find_url_end_l1; else if (*c < 64) goto find_url_end_l23; else goto find_url_end_l1; find_url_end_l51: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l52; else goto find_url_end_l65; else if (*c < 51) goto find_url_end_l67; else goto find_url_end_l66; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l46; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l52: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l53; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l53: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l54; else goto find_url_end_l61; else if (*c < 51) goto find_url_end_l63; else goto find_url_end_l62; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l46; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l54: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l55; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l55: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l56; else goto find_url_end_l57; else if (*c < 51) goto find_url_end_l59; else goto find_url_end_l58; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l46; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l46; else goto find_url_end_l1; find_url_end_l56: ++c; out = c; if (c == end) return out; if (*c < 59) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else if (*c < 48) if (*c < 47) goto find_url_end_l45; else goto find_url_end_l22; else if (*c < 58) goto find_url_end_l44; else goto find_url_end_l49; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l57: ++c; out = c; if (c == end) return out; if (*c < 59) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else if (*c < 48) if (*c < 47) goto find_url_end_l45; else goto find_url_end_l22; else if (*c < 58) goto find_url_end_l58; else goto find_url_end_l49; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l58: ++c; out = c; if (c == end) return out; if (*c < 59) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else if (*c < 48) if (*c < 47) goto find_url_end_l45; else goto find_url_end_l22; else if (*c < 58) goto find_url_end_l56; else goto find_url_end_l49; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l59: ++c; out = c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 45) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 46) goto find_url_end_l43; else goto find_url_end_l45; else if (*c < 53) if (*c < 48) goto find_url_end_l22; else goto find_url_end_l58; else if (*c < 54) goto find_url_end_l60; else goto find_url_end_l56; else if (*c < 65) if (*c < 63) if (*c < 59) goto find_url_end_l49; else goto find_url_end_l1; else if (*c < 64) goto find_url_end_l23; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l60: ++c; out = c; if (c == end) return out; if (*c < 58) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else if (*c < 48) if (*c < 47) goto find_url_end_l45; else goto find_url_end_l22; else if (*c < 54) goto find_url_end_l56; else goto find_url_end_l44; else if (*c < 65) if (*c < 63) if (*c < 59) goto find_url_end_l49; else goto find_url_end_l1; else if (*c < 64) goto find_url_end_l23; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l61: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l55; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l62; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l62: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l55; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l54; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l63: ++c; if (c == end) return out; if (*c < 54) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l55; else if (*c < 53) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l62; else goto find_url_end_l64; else if (*c < 91) if (*c < 65) if (*c < 58) goto find_url_end_l54; else goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l64: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l55; else if (*c < 54) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l54; else goto find_url_end_l44; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l65: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l53; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l66; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l66: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l53; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l52; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l67: ++c; if (c == end) return out; if (*c < 54) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l53; else if (*c < 53) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l66; else goto find_url_end_l68; else if (*c < 91) if (*c < 65) if (*c < 58) goto find_url_end_l52; else goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l68: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l53; else if (*c < 54) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l52; else goto find_url_end_l44; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l69: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l51; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l70; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l70: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l51; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l42; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l71: ++c; if (c == end) return out; if (*c < 54) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l51; else if (*c < 53) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l70; else goto find_url_end_l72; else if (*c < 91) if (*c < 65) if (*c < 58) goto find_url_end_l42; else goto find_url_end_l1; else goto find_url_end_l44; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l72: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l43; else goto find_url_end_l51; else if (*c < 54) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l42; else goto find_url_end_l44; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l44; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l44; else goto find_url_end_l1; find_url_end_l73: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l74; else goto find_url_end_l210; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l74; else if (*c < 118) if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l74; else goto find_url_end_l1; else if (*c < 119) goto find_url_end_l225; else goto find_url_end_l1; find_url_end_l74: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l75; else if (*c < 59) goto find_url_end_l78; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l75; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l75; else goto find_url_end_l1; find_url_end_l75: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l76; else if (*c < 59) goto find_url_end_l78; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l76; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l76; else goto find_url_end_l1; find_url_end_l76: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l77; else if (*c < 59) goto find_url_end_l78; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l77; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l77; else goto find_url_end_l1; find_url_end_l77: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l78; else goto find_url_end_l1; find_url_end_l78: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l79; else if (*c < 59) goto find_url_end_l196; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l79; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l79; else goto find_url_end_l1; find_url_end_l79: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l80; else if (*c < 59) goto find_url_end_l83; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l80; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l80; else goto find_url_end_l1; find_url_end_l80: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l81; else if (*c < 59) goto find_url_end_l83; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l81; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l81; else goto find_url_end_l1; find_url_end_l81: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l82; else if (*c < 59) goto find_url_end_l83; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l82; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l82; else goto find_url_end_l1; find_url_end_l82: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l83; else goto find_url_end_l1; find_url_end_l83: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l84; else if (*c < 59) goto find_url_end_l182; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l84; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l84; else goto find_url_end_l1; find_url_end_l84: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l85; else if (*c < 59) goto find_url_end_l88; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l85; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l85; else goto find_url_end_l1; find_url_end_l85: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l86; else if (*c < 59) goto find_url_end_l88; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l86; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l86; else goto find_url_end_l1; find_url_end_l86: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l87; else if (*c < 59) goto find_url_end_l88; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l87; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l87; else goto find_url_end_l1; find_url_end_l87: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l88; else goto find_url_end_l1; find_url_end_l88: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l89; else if (*c < 59) goto find_url_end_l168; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l89; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l89; else goto find_url_end_l1; find_url_end_l89: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l90; else if (*c < 59) goto find_url_end_l93; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l90; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l90; else goto find_url_end_l1; find_url_end_l90: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l91; else if (*c < 59) goto find_url_end_l93; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l91; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l91; else goto find_url_end_l1; find_url_end_l91: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l92; else if (*c < 59) goto find_url_end_l93; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l92; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l92; else goto find_url_end_l1; find_url_end_l92: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l93; else goto find_url_end_l1; find_url_end_l93: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l94; else if (*c < 59) goto find_url_end_l154; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l94; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l94; else goto find_url_end_l1; find_url_end_l94: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l95; else if (*c < 59) goto find_url_end_l98; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l95; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l95; else goto find_url_end_l1; find_url_end_l95: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l96; else if (*c < 59) goto find_url_end_l98; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l96; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l96; else goto find_url_end_l1; find_url_end_l96: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l97; else if (*c < 59) goto find_url_end_l98; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l97; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l97; else goto find_url_end_l1; find_url_end_l97: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l98; else goto find_url_end_l1; find_url_end_l98: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l99; else if (*c < 59) goto find_url_end_l140; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l99; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l99; else goto find_url_end_l1; find_url_end_l99: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l100; else if (*c < 59) goto find_url_end_l103; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l100; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l100; else goto find_url_end_l1; find_url_end_l100: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l101; else if (*c < 59) goto find_url_end_l103; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l101; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l101; else goto find_url_end_l1; find_url_end_l101: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l102; else if (*c < 59) goto find_url_end_l103; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l102; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l102; else goto find_url_end_l1; find_url_end_l102: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l103; else goto find_url_end_l1; find_url_end_l103: ++c; if (c == end) return out; if (*c < 59) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l104; else goto find_url_end_l131; else if (*c < 58) if (*c < 51) goto find_url_end_l134; else goto find_url_end_l137; else goto find_url_end_l138; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l139; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l139; else goto find_url_end_l1; find_url_end_l104: ++c; if (c == end) return out; if (*c < 59) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l124; else goto find_url_end_l127; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l124; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l124; else goto find_url_end_l1; find_url_end_l105: ++c; if (c == end) return out; if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l106; else goto find_url_end_l120; else if (*c < 58) if (*c < 51) goto find_url_end_l122; else goto find_url_end_l121; else goto find_url_end_l1; find_url_end_l106: ++c; if (c == end) return out; if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l107; else goto find_url_end_l1; find_url_end_l107: ++c; if (c == end) return out; if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l108; else goto find_url_end_l116; else if (*c < 58) if (*c < 51) goto find_url_end_l118; else goto find_url_end_l117; else goto find_url_end_l1; find_url_end_l108: ++c; if (c == end) return out; if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l109; else goto find_url_end_l1; find_url_end_l109: ++c; if (c == end) return out; if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l110; else goto find_url_end_l112; else if (*c < 58) if (*c < 51) goto find_url_end_l114; else goto find_url_end_l113; else goto find_url_end_l1; find_url_end_l110: ++c; if (c == end) return out; if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l111: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 48) goto find_url_end_l22; else goto find_url_end_l1; else if (*c < 63) if (*c < 59) goto find_url_end_l49; else goto find_url_end_l1; else if (*c < 64) goto find_url_end_l23; else goto find_url_end_l1; find_url_end_l112: ++c; if (c == end) return out; if (*c < 93) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l113; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l113: ++c; if (c == end) return out; if (*c < 93) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l110; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l114: ++c; if (c == end) return out; if (*c < 58) if (*c < 53) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l113; else if (*c < 54) goto find_url_end_l115; else goto find_url_end_l110; else if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l115: ++c; if (c == end) return out; if (*c < 93) if (*c < 54) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l110; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l116: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l109; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l117; else goto find_url_end_l1; find_url_end_l117: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l109; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l108; else goto find_url_end_l1; find_url_end_l118: ++c; if (c == end) return out; if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l109; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l117; else if (*c < 58) if (*c < 54) goto find_url_end_l119; else goto find_url_end_l108; else goto find_url_end_l1; find_url_end_l119: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l109; else goto find_url_end_l1; else if (*c < 54) goto find_url_end_l108; else goto find_url_end_l1; find_url_end_l120: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l107; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l121; else goto find_url_end_l1; find_url_end_l121: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l107; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l106; else goto find_url_end_l1; find_url_end_l122: ++c; if (c == end) return out; if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l107; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l121; else if (*c < 58) if (*c < 54) goto find_url_end_l123; else goto find_url_end_l106; else goto find_url_end_l1; find_url_end_l123: ++c; if (c == end) return out; if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l107; else goto find_url_end_l1; else if (*c < 54) goto find_url_end_l106; else goto find_url_end_l1; find_url_end_l124: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l125; else if (*c < 59) goto find_url_end_l127; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l125; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l125; else goto find_url_end_l1; find_url_end_l125: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l126; else if (*c < 59) goto find_url_end_l127; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l126; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l126; else goto find_url_end_l1; find_url_end_l126: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l127; else goto find_url_end_l1; find_url_end_l127: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l128; else if (*c < 59) goto find_url_end_l110; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l128; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l128; else goto find_url_end_l1; find_url_end_l128: ++c; if (c == end) return out; if (*c < 93) if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l129; else goto find_url_end_l1; else if (*c < 71) goto find_url_end_l129; else goto find_url_end_l1; else if (*c < 97) if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l129; else goto find_url_end_l1; find_url_end_l129: ++c; if (c == end) return out; if (*c < 93) if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l130; else goto find_url_end_l1; else if (*c < 71) goto find_url_end_l130; else goto find_url_end_l1; else if (*c < 97) if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l130; else goto find_url_end_l1; find_url_end_l130: ++c; if (c == end) return out; if (*c < 93) if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l110; else goto find_url_end_l1; else if (*c < 71) goto find_url_end_l110; else goto find_url_end_l1; else if (*c < 97) if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l110; else goto find_url_end_l1; find_url_end_l131: ++c; if (c == end) return out; if (*c < 59) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l132; else goto find_url_end_l127; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l124; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l124; else goto find_url_end_l1; find_url_end_l132: ++c; if (c == end) return out; if (*c < 59) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l133; else goto find_url_end_l127; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l125; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l125; else goto find_url_end_l1; find_url_end_l133: ++c; if (c == end) return out; if (*c < 59) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l126; else goto find_url_end_l127; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l126; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l126; else goto find_url_end_l1; find_url_end_l134: ++c; if (c == end) return out; if (*c < 58) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 54) if (*c < 53) goto find_url_end_l132; else goto find_url_end_l135; else goto find_url_end_l136; else if (*c < 71) if (*c < 65) if (*c < 59) goto find_url_end_l127; else goto find_url_end_l1; else goto find_url_end_l124; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l124; else goto find_url_end_l1; find_url_end_l135: ++c; if (c == end) return out; if (*c < 59) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 58) if (*c < 54) goto find_url_end_l133; else goto find_url_end_l125; else goto find_url_end_l127; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l125; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l125; else goto find_url_end_l1; find_url_end_l136: ++c; if (c == end) return out; if (*c < 59) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l125; else goto find_url_end_l127; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l125; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l125; else goto find_url_end_l1; find_url_end_l137: ++c; if (c == end) return out; if (*c < 59) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l136; else goto find_url_end_l127; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l124; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l124; else goto find_url_end_l1; find_url_end_l138: ++c; if (c == end) return out; if (*c < 93) if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l128; else goto find_url_end_l1; else if (*c < 71) goto find_url_end_l128; else goto find_url_end_l1; else if (*c < 97) if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l128; else goto find_url_end_l1; find_url_end_l139: ++c; if (c == end) return out; if (*c < 65) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l124; else if (*c < 59) goto find_url_end_l127; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l124; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l124; else goto find_url_end_l1; find_url_end_l140: ++c; if (c == end) return out; if (*c < 65) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l141; else goto find_url_end_l146; else if (*c < 58) if (*c < 51) goto find_url_end_l149; else goto find_url_end_l152; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l153; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l153; else goto find_url_end_l1; find_url_end_l141: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l142; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l142; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l142; else goto find_url_end_l1; find_url_end_l142: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l143; else goto find_url_end_l145; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l143; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l143; else goto find_url_end_l1; find_url_end_l143: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l144; else goto find_url_end_l145; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l144; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l144; else goto find_url_end_l1; find_url_end_l144: ++c; if (c == end) return out; if (*c < 93) if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l145: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l128; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l128; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l128; else goto find_url_end_l1; find_url_end_l146: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l147; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l142; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l142; else goto find_url_end_l1; find_url_end_l147: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l148; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l143; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l143; else goto find_url_end_l1; find_url_end_l148: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l144; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l144; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l144; else goto find_url_end_l1; find_url_end_l149: ++c; if (c == end) return out; if (*c < 59) if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l147; else if (*c < 58) if (*c < 54) goto find_url_end_l150; else goto find_url_end_l151; else goto find_url_end_l145; else if (*c < 94) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l142; else if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l142; else goto find_url_end_l1; find_url_end_l150: ++c; if (c == end) return out; if (*c < 65) if (*c < 54) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l148; else if (*c < 59) if (*c < 58) goto find_url_end_l143; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l143; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l143; else goto find_url_end_l1; find_url_end_l151: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l143; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l143; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l143; else goto find_url_end_l1; find_url_end_l152: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l151; else goto find_url_end_l145; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l142; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l142; else goto find_url_end_l1; find_url_end_l153: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l142; else goto find_url_end_l145; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l142; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l142; else goto find_url_end_l1; find_url_end_l154: ++c; if (c == end) return out; if (*c < 65) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l155; else goto find_url_end_l160; else if (*c < 58) if (*c < 51) goto find_url_end_l163; else goto find_url_end_l166; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l167; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l167; else goto find_url_end_l1; find_url_end_l155: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l156; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l156; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l156; else goto find_url_end_l1; find_url_end_l156: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l157; else goto find_url_end_l159; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l157; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l157; else goto find_url_end_l1; find_url_end_l157: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l158; else goto find_url_end_l159; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l158; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l158; else goto find_url_end_l1; find_url_end_l158: ++c; if (c == end) return out; if (*c < 93) if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l159: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l141; else goto find_url_end_l146; else if (*c < 51) goto find_url_end_l149; else goto find_url_end_l152; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l153; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l153; else goto find_url_end_l1; find_url_end_l160: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l161; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l156; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l156; else goto find_url_end_l1; find_url_end_l161: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l162; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l157; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l157; else goto find_url_end_l1; find_url_end_l162: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l158; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l158; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l158; else goto find_url_end_l1; find_url_end_l163: ++c; if (c == end) return out; if (*c < 59) if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l161; else if (*c < 58) if (*c < 54) goto find_url_end_l164; else goto find_url_end_l165; else goto find_url_end_l159; else if (*c < 94) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l156; else if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l156; else goto find_url_end_l1; find_url_end_l164: ++c; if (c == end) return out; if (*c < 65) if (*c < 54) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l162; else if (*c < 59) if (*c < 58) goto find_url_end_l157; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l157; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l157; else goto find_url_end_l1; find_url_end_l165: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l157; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l157; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l157; else goto find_url_end_l1; find_url_end_l166: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l165; else goto find_url_end_l159; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l156; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l156; else goto find_url_end_l1; find_url_end_l167: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l156; else goto find_url_end_l159; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l156; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l156; else goto find_url_end_l1; find_url_end_l168: ++c; if (c == end) return out; if (*c < 65) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l169; else goto find_url_end_l174; else if (*c < 58) if (*c < 51) goto find_url_end_l177; else goto find_url_end_l180; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l181; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l181; else goto find_url_end_l1; find_url_end_l169: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l170; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l170; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l170; else goto find_url_end_l1; find_url_end_l170: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l171; else goto find_url_end_l173; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l171; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l171; else goto find_url_end_l1; find_url_end_l171: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l172; else goto find_url_end_l173; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l172; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l172; else goto find_url_end_l1; find_url_end_l172: ++c; if (c == end) return out; if (*c < 93) if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l173: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l155; else goto find_url_end_l160; else if (*c < 51) goto find_url_end_l163; else goto find_url_end_l166; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l167; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l167; else goto find_url_end_l1; find_url_end_l174: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l175; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l170; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l170; else goto find_url_end_l1; find_url_end_l175: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l176; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l171; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l171; else goto find_url_end_l1; find_url_end_l176: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l172; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l172; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l172; else goto find_url_end_l1; find_url_end_l177: ++c; if (c == end) return out; if (*c < 59) if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l175; else if (*c < 58) if (*c < 54) goto find_url_end_l178; else goto find_url_end_l179; else goto find_url_end_l173; else if (*c < 94) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l170; else if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l170; else goto find_url_end_l1; find_url_end_l178: ++c; if (c == end) return out; if (*c < 65) if (*c < 54) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l176; else if (*c < 59) if (*c < 58) goto find_url_end_l171; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l171; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l171; else goto find_url_end_l1; find_url_end_l179: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l171; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l171; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l171; else goto find_url_end_l1; find_url_end_l180: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l179; else goto find_url_end_l173; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l170; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l170; else goto find_url_end_l1; find_url_end_l181: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l170; else goto find_url_end_l173; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l170; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l170; else goto find_url_end_l1; find_url_end_l182: ++c; if (c == end) return out; if (*c < 65) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l183; else goto find_url_end_l188; else if (*c < 58) if (*c < 51) goto find_url_end_l191; else goto find_url_end_l194; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l195; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l195; else goto find_url_end_l1; find_url_end_l183: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l184; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l184; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l184; else goto find_url_end_l1; find_url_end_l184: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l185; else goto find_url_end_l187; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l185; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l185; else goto find_url_end_l1; find_url_end_l185: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l186; else goto find_url_end_l187; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l186; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l186; else goto find_url_end_l1; find_url_end_l186: ++c; if (c == end) return out; if (*c < 93) if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l187: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l169; else goto find_url_end_l174; else if (*c < 51) goto find_url_end_l177; else goto find_url_end_l180; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l181; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l181; else goto find_url_end_l1; find_url_end_l188: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l189; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l184; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l184; else goto find_url_end_l1; find_url_end_l189: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l190; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l185; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l185; else goto find_url_end_l1; find_url_end_l190: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l186; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l186; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l186; else goto find_url_end_l1; find_url_end_l191: ++c; if (c == end) return out; if (*c < 59) if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l189; else if (*c < 58) if (*c < 54) goto find_url_end_l192; else goto find_url_end_l193; else goto find_url_end_l187; else if (*c < 94) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l184; else if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l184; else goto find_url_end_l1; find_url_end_l192: ++c; if (c == end) return out; if (*c < 65) if (*c < 54) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l190; else if (*c < 59) if (*c < 58) goto find_url_end_l185; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l185; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l185; else goto find_url_end_l1; find_url_end_l193: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l185; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l185; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l185; else goto find_url_end_l1; find_url_end_l194: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l193; else goto find_url_end_l187; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l184; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l184; else goto find_url_end_l1; find_url_end_l195: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l184; else goto find_url_end_l187; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l184; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l184; else goto find_url_end_l1; find_url_end_l196: ++c; if (c == end) return out; if (*c < 65) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l197; else goto find_url_end_l202; else if (*c < 58) if (*c < 51) goto find_url_end_l205; else goto find_url_end_l208; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l209; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l209; else goto find_url_end_l1; find_url_end_l197: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l198; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l198; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l198; else goto find_url_end_l1; find_url_end_l198: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l199; else goto find_url_end_l201; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l199; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l199; else goto find_url_end_l1; find_url_end_l199: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l200; else goto find_url_end_l201; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l200; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l200; else goto find_url_end_l1; find_url_end_l200: ++c; if (c == end) return out; if (*c < 93) if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l201: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l183; else goto find_url_end_l188; else if (*c < 51) goto find_url_end_l191; else goto find_url_end_l194; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l195; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l195; else goto find_url_end_l1; find_url_end_l202: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l203; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l198; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l198; else goto find_url_end_l1; find_url_end_l203: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l204; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l199; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l199; else goto find_url_end_l1; find_url_end_l204: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l200; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l200; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l200; else goto find_url_end_l1; find_url_end_l205: ++c; if (c == end) return out; if (*c < 59) if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l203; else if (*c < 58) if (*c < 54) goto find_url_end_l206; else goto find_url_end_l207; else goto find_url_end_l201; else if (*c < 94) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l198; else if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l198; else goto find_url_end_l1; find_url_end_l206: ++c; if (c == end) return out; if (*c < 65) if (*c < 54) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l204; else if (*c < 59) if (*c < 58) goto find_url_end_l199; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l199; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l199; else goto find_url_end_l1; find_url_end_l207: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l199; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l199; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l199; else goto find_url_end_l1; find_url_end_l208: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l207; else goto find_url_end_l201; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l198; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l198; else goto find_url_end_l1; find_url_end_l209: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l198; else goto find_url_end_l201; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l198; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l198; else goto find_url_end_l1; find_url_end_l210: ++c; if (c == end) return out; if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l211; else goto find_url_end_l1; find_url_end_l211: ++c; if (c == end) return out; if (*c < 65) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l212; else goto find_url_end_l217; else if (*c < 58) if (*c < 51) goto find_url_end_l220; else goto find_url_end_l223; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l224; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l224; else goto find_url_end_l1; find_url_end_l212: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l213; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l213; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l213; else goto find_url_end_l1; find_url_end_l213: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l214; else goto find_url_end_l216; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l214; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l214; else goto find_url_end_l1; find_url_end_l214: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l215; else goto find_url_end_l216; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l215; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l215; else goto find_url_end_l1; find_url_end_l215: ++c; if (c == end) return out; if (*c < 93) if (*c < 59) if (*c < 58) goto find_url_end_l1; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) goto find_url_end_l111; else goto find_url_end_l1; find_url_end_l216: ++c; if (c == end) return out; if (*c < 58) if (*c < 50) if (*c < 49) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l197; else goto find_url_end_l202; else if (*c < 51) goto find_url_end_l205; else goto find_url_end_l208; else if (*c < 97) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l209; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l209; else goto find_url_end_l1; find_url_end_l217: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l218; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l213; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l213; else goto find_url_end_l1; find_url_end_l218: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l219; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l214; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l214; else goto find_url_end_l1; find_url_end_l219: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l215; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l215; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l215; else goto find_url_end_l1; find_url_end_l220: ++c; if (c == end) return out; if (*c < 59) if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l218; else if (*c < 58) if (*c < 54) goto find_url_end_l221; else goto find_url_end_l222; else goto find_url_end_l216; else if (*c < 94) if (*c < 71) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l213; else if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l213; else goto find_url_end_l1; find_url_end_l221: ++c; if (c == end) return out; if (*c < 65) if (*c < 54) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l219; else if (*c < 59) if (*c < 58) goto find_url_end_l214; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l214; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l214; else goto find_url_end_l1; find_url_end_l222: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l214; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l214; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l214; else goto find_url_end_l1; find_url_end_l223: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l105; else goto find_url_end_l1; else if (*c < 59) if (*c < 58) goto find_url_end_l222; else goto find_url_end_l216; else goto find_url_end_l1; else if (*c < 94) if (*c < 93) if (*c < 71) goto find_url_end_l213; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l213; else goto find_url_end_l1; find_url_end_l224: ++c; if (c == end) return out; if (*c < 71) if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l213; else goto find_url_end_l216; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l213; else if (*c < 97) if (*c < 94) if (*c < 93) goto find_url_end_l1; else goto find_url_end_l111; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l213; else goto find_url_end_l1; find_url_end_l225: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l226; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l226; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l226; else goto find_url_end_l1; find_url_end_l226: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l1; else goto find_url_end_l227; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l226; else goto find_url_end_l1; else if (*c < 97) if (*c < 71) goto find_url_end_l226; else goto find_url_end_l1; else if (*c < 103) goto find_url_end_l226; else goto find_url_end_l1; find_url_end_l227: ++c; if (c == end) return out; if (*c < 62) if (*c < 38) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 37) goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 60) if (*c < 48) if (*c < 47) goto find_url_end_l228; else goto find_url_end_l1; else goto find_url_end_l228; else if (*c < 61) goto find_url_end_l1; else goto find_url_end_l228; else if (*c < 97) if (*c < 95) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 96) goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 126) if (*c < 123) goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l228; else goto find_url_end_l1; find_url_end_l228: ++c; if (c == end) return out; if (*c < 65) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l228; else goto find_url_end_l1; else goto find_url_end_l228; else if (*c < 61) if (*c < 60) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 62) goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 96) if (*c < 94) if (*c < 93) if (*c < 91) goto find_url_end_l228; else goto find_url_end_l1; else goto find_url_end_l111; else if (*c < 95) goto find_url_end_l1; else goto find_url_end_l228; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l228; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l228; else goto find_url_end_l1; find_url_end_l229: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l247; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l230: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l231: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l232; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l232: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l231; else goto find_url_end_l38; else if (*c < 61) if (*c < 60) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l41; else if (*c < 95) if (*c < 91) goto find_url_end_l233; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l233; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l233: ++c; out = c; if (c == end) return out; if (*c < 60) if (*c < 45) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l234; else goto find_url_end_l235; else goto find_url_end_l22; else if (*c < 59) if (*c < 58) goto find_url_end_l233; else goto find_url_end_l236; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l233; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l234: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l234; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l233; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l235: ++c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l35; else goto find_url_end_l36; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l35; else goto find_url_end_l22; else goto find_url_end_l231; else if (*c < 60) if (*c < 59) goto find_url_end_l236; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l233; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l236: ++c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l38; else goto find_url_end_l39; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l38; else goto find_url_end_l22; else goto find_url_end_l237; else if (*c < 60) if (*c < 59) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l38; else goto find_url_end_l1; else goto find_url_end_l238; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l38; else goto find_url_end_l1; else goto find_url_end_l38; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; find_url_end_l237: ++c; out = c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l38; else goto find_url_end_l39; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l38; else goto find_url_end_l22; else goto find_url_end_l237; else if (*c < 60) if (*c < 59) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l38; else goto find_url_end_l1; else goto find_url_end_l238; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l38; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l38; else goto find_url_end_l1; else goto find_url_end_l38; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l38; else goto find_url_end_l1; find_url_end_l238: ++c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l238; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l238; else goto find_url_end_l239; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l238; else goto find_url_end_l22; else goto find_url_end_l241; else if (*c < 60) if (*c < 59) goto find_url_end_l23; else goto find_url_end_l238; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l238; else goto find_url_end_l1; else goto find_url_end_l238; else if (*c < 91) if (*c < 65) goto find_url_end_l242; else goto find_url_end_l241; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l238; else goto find_url_end_l1; else goto find_url_end_l241; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l238; else goto find_url_end_l1; find_url_end_l239: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l240; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l240; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l240; else goto find_url_end_l1; find_url_end_l240: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l241; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l241; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l241; else goto find_url_end_l1; find_url_end_l241: ++c; out = c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l238; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l238; else goto find_url_end_l239; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l238; else goto find_url_end_l22; else goto find_url_end_l241; else if (*c < 60) if (*c < 59) goto find_url_end_l23; else goto find_url_end_l238; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l238; else goto find_url_end_l1; else goto find_url_end_l238; else if (*c < 91) if (*c < 65) goto find_url_end_l242; else goto find_url_end_l241; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l238; else goto find_url_end_l1; else goto find_url_end_l241; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l238; else goto find_url_end_l1; find_url_end_l242: ++c; if (c == end) return out; if (*c < 62) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l23; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l23; else goto find_url_end_l24; else if (*c < 60) if (*c < 58) if (*c < 47) goto find_url_end_l23; else goto find_url_end_l22; else goto find_url_end_l23; else if (*c < 61) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 96) if (*c < 91) if (*c < 65) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else goto find_url_end_l22; else if (*c < 95) if (*c < 92) goto find_url_end_l73; else goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l22; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l23; else goto find_url_end_l1; find_url_end_l243: ++c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l243; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l243; else goto find_url_end_l244; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l243; else goto find_url_end_l22; else goto find_url_end_l246; else if (*c < 60) if (*c < 59) goto find_url_end_l238; else goto find_url_end_l243; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l243; else goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l242; else goto find_url_end_l246; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l243; else goto find_url_end_l1; else goto find_url_end_l246; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l243; else goto find_url_end_l1; find_url_end_l244: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l245; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l245; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l245; else goto find_url_end_l1; find_url_end_l245: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l246; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l246; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l246; else goto find_url_end_l1; find_url_end_l246: ++c; out = c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l243; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l243; else goto find_url_end_l244; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l243; else goto find_url_end_l22; else goto find_url_end_l246; else if (*c < 60) if (*c < 59) goto find_url_end_l238; else goto find_url_end_l243; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l243; else goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l242; else goto find_url_end_l246; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l243; else goto find_url_end_l1; else goto find_url_end_l246; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l243; else goto find_url_end_l1; find_url_end_l247: ++c; if (c == end) return out; if (*c < 60) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 47) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 51) if (*c < 50) if (*c < 49) goto find_url_end_l248; else goto find_url_end_l261; else goto find_url_end_l263; else if (*c < 59) if (*c < 58) goto find_url_end_l262; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l233; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l248: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l249; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l249: ++c; if (c == end) return out; if (*c < 60) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 47) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 51) if (*c < 50) if (*c < 49) goto find_url_end_l250; else goto find_url_end_l257; else goto find_url_end_l259; else if (*c < 59) if (*c < 58) goto find_url_end_l258; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l233; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l250: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l251; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l251: ++c; if (c == end) return out; if (*c < 60) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 47) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 51) if (*c < 50) if (*c < 49) goto find_url_end_l252; else goto find_url_end_l253; else goto find_url_end_l255; else if (*c < 59) if (*c < 58) goto find_url_end_l254; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l233; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l233; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l252: ++c; out = c; if (c == end) return out; if (*c < 60) if (*c < 45) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l230; else goto find_url_end_l232; else goto find_url_end_l22; else if (*c < 59) if (*c < 58) goto find_url_end_l231; else goto find_url_end_l236; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l253: ++c; out = c; if (c == end) return out; if (*c < 60) if (*c < 45) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l230; else goto find_url_end_l232; else goto find_url_end_l22; else if (*c < 59) if (*c < 58) goto find_url_end_l254; else goto find_url_end_l236; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l254: ++c; out = c; if (c == end) return out; if (*c < 60) if (*c < 45) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l230; else goto find_url_end_l232; else goto find_url_end_l22; else if (*c < 59) if (*c < 58) goto find_url_end_l252; else goto find_url_end_l236; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l255: ++c; out = c; if (c == end) return out; if (*c < 59) if (*c < 45) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 53) if (*c < 47) if (*c < 46) goto find_url_end_l230; else goto find_url_end_l232; else if (*c < 48) goto find_url_end_l22; else goto find_url_end_l254; else if (*c < 58) if (*c < 54) goto find_url_end_l256; else goto find_url_end_l252; else goto find_url_end_l236; else if (*c < 91) if (*c < 63) if (*c < 61) if (*c < 60) goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 65) if (*c < 64) goto find_url_end_l243; else goto find_url_end_l41; else goto find_url_end_l231; else if (*c < 123) if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 97) goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l256: ++c; out = c; if (c == end) return out; if (*c < 60) if (*c < 45) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l35; else goto find_url_end_l36; else goto find_url_end_l35; else if (*c < 54) if (*c < 47) if (*c < 46) goto find_url_end_l230; else goto find_url_end_l232; else if (*c < 48) goto find_url_end_l22; else goto find_url_end_l252; else if (*c < 59) if (*c < 58) goto find_url_end_l231; else goto find_url_end_l236; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l243; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l257: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l251; else goto find_url_end_l1; else goto find_url_end_l258; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l258: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l251; else goto find_url_end_l1; else goto find_url_end_l250; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l259: ++c; if (c == end) return out; if (*c < 60) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 54) if (*c < 48) if (*c < 47) goto find_url_end_l251; else goto find_url_end_l1; else if (*c < 53) goto find_url_end_l258; else goto find_url_end_l260; else if (*c < 59) if (*c < 58) goto find_url_end_l250; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l260: ++c; if (c == end) return out; if (*c < 60) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 54) if (*c < 48) if (*c < 47) goto find_url_end_l251; else goto find_url_end_l1; else goto find_url_end_l250; else if (*c < 59) if (*c < 58) goto find_url_end_l231; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l261: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l249; else goto find_url_end_l1; else goto find_url_end_l262; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l262: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l249; else goto find_url_end_l1; else goto find_url_end_l248; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l263: ++c; if (c == end) return out; if (*c < 60) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 54) if (*c < 48) if (*c < 47) goto find_url_end_l249; else goto find_url_end_l1; else if (*c < 53) goto find_url_end_l262; else goto find_url_end_l264; else if (*c < 59) if (*c < 58) goto find_url_end_l248; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l264: ++c; if (c == end) return out; if (*c < 60) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 54) if (*c < 48) if (*c < 47) goto find_url_end_l249; else goto find_url_end_l1; else goto find_url_end_l248; else if (*c < 59) if (*c < 58) goto find_url_end_l231; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l265: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l247; else goto find_url_end_l1; else goto find_url_end_l266; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l266: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l247; else goto find_url_end_l1; else goto find_url_end_l229; else if (*c < 60) if (*c < 59) goto find_url_end_l38; else goto find_url_end_l35; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l267: ++c; if (c == end) return out; if (*c < 60) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 54) if (*c < 48) if (*c < 47) goto find_url_end_l247; else goto find_url_end_l1; else if (*c < 53) goto find_url_end_l266; else goto find_url_end_l268; else if (*c < 59) if (*c < 58) goto find_url_end_l229; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l268: ++c; if (c == end) return out; if (*c < 60) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 45) if (*c < 38) goto find_url_end_l36; else goto find_url_end_l35; else goto find_url_end_l230; else if (*c < 54) if (*c < 48) if (*c < 47) goto find_url_end_l247; else goto find_url_end_l1; else goto find_url_end_l229; else if (*c < 59) if (*c < 58) goto find_url_end_l231; else goto find_url_end_l38; else goto find_url_end_l35; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l35; else if (*c < 91) if (*c < 65) goto find_url_end_l41; else goto find_url_end_l231; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l35; else goto find_url_end_l1; else goto find_url_end_l231; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l35; else goto find_url_end_l1; find_url_end_l269: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 80) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 81) goto find_url_end_l270; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 113) if (*c < 112) goto find_url_end_l2; else goto find_url_end_l270; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l270: ++c; if (c == end) return out; if (*c < 63) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 46) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l271; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 59) goto find_url_end_l32; else goto find_url_end_l2; else if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 96) if (*c < 84) if (*c < 65) if (*c < 64) goto find_url_end_l2; else goto find_url_end_l8; else if (*c < 83) goto find_url_end_l2; else goto find_url_end_l31; else if (*c < 95) if (*c < 91) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 123) if (*c < 115) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 116) goto find_url_end_l31; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l271: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l2; else goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l272; else goto find_url_end_l5; else if (*c < 61) if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l8; else if (*c < 95) if (*c < 91) goto find_url_end_l274; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l274; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l272: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 45) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l273; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l271; else goto find_url_end_l1; else goto find_url_end_l272; else if (*c < 60) if (*c < 59) goto find_url_end_l5; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 91) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l272; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l272; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l273: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 45) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l273; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l272; else if (*c < 60) if (*c < 59) goto find_url_end_l5; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 91) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l272; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l272; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l274: ++c; out = c; if (c == end) return out; if (*c < 60) if (*c < 45) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 38) if (*c < 37) goto find_url_end_l2; else goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_end_l275; else goto find_url_end_l276; else goto find_url_end_l22; else if (*c < 59) if (*c < 58) goto find_url_end_l274; else goto find_url_end_l5; else goto find_url_end_l2; else if (*c < 95) if (*c < 64) if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 91) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l274; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l274; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l275: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 45) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l275; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l274; else if (*c < 60) if (*c < 59) goto find_url_end_l5; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 91) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l274; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l274; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l276: ++c; if (c == end) return out; if (*c < 61) if (*c < 38) if (*c < 35) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 37) if (*c < 36) goto find_url_end_l16; else goto find_url_end_l2; else goto find_url_end_l3; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l2; else goto find_url_end_l22; else goto find_url_end_l272; else if (*c < 60) if (*c < 59) goto find_url_end_l5; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 91) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l274; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l274; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l277: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 84) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 85) goto find_url_end_l278; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 117) if (*c < 116) goto find_url_end_l2; else goto find_url_end_l278; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l278: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 84) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 85) goto find_url_end_l279; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 117) if (*c < 116) goto find_url_end_l2; else goto find_url_end_l279; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l279: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 80) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 81) goto find_url_end_l280; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 113) if (*c < 112) goto find_url_end_l2; else goto find_url_end_l280; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l280: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l32; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 83) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 84) goto find_url_end_l31; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 116) if (*c < 115) goto find_url_end_l2; else goto find_url_end_l31; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l281: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 77) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 78) goto find_url_end_l282; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 110) if (*c < 109) goto find_url_end_l2; else goto find_url_end_l282; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l282: ++c; if (c == end) return out; if (*c < 63) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else goto find_url_end_l2; else if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 96) if (*c < 66) if (*c < 65) if (*c < 64) goto find_url_end_l2; else goto find_url_end_l8; else goto find_url_end_l279; else if (*c < 95) if (*c < 91) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 123) if (*c < 98) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l279; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l283: ++c; if (c == end) return out; if (*c < 63) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else goto find_url_end_l2; else if (*c < 62) if (*c < 61) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 96) if (*c < 66) if (*c < 65) if (*c < 64) goto find_url_end_l2; else goto find_url_end_l8; else goto find_url_end_l284; else if (*c < 95) if (*c < 91) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 123) if (*c < 98) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l284; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l284: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 73) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 74) goto find_url_end_l285; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 106) if (*c < 105) goto find_url_end_l2; else goto find_url_end_l285; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l285: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 76) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 77) goto find_url_end_l286; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 109) if (*c < 108) goto find_url_end_l2; else goto find_url_end_l286; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l286: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 84) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 85) goto find_url_end_l287; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 117) if (*c < 116) goto find_url_end_l2; else goto find_url_end_l287; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l287: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 79) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 80) goto find_url_end_l288; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 112) if (*c < 111) goto find_url_end_l2; else goto find_url_end_l288; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l288: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l2; else goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l289; else if (*c < 61) if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l8; else if (*c < 95) if (*c < 91) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l289: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l290; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l290; else goto find_url_end_l291; else goto find_url_end_l290; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l290; else goto find_url_end_l1; else if (*c < 61) if (*c < 60) goto find_url_end_l290; else goto find_url_end_l1; else goto find_url_end_l290; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l8; else if (*c < 95) if (*c < 91) goto find_url_end_l290; else goto find_url_end_l1; else goto find_url_end_l290; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l290; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l290; else goto find_url_end_l1; find_url_end_l290: ++c; if (c == end) return out; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l290; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l290; else goto find_url_end_l291; else goto find_url_end_l290; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l290; else goto find_url_end_l1; else if (*c < 61) if (*c < 60) goto find_url_end_l290; else goto find_url_end_l1; else goto find_url_end_l290; else if (*c < 96) if (*c < 65) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l5; else goto find_url_end_l293; else if (*c < 95) if (*c < 91) goto find_url_end_l290; else goto find_url_end_l1; else goto find_url_end_l290; else if (*c < 126) if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l290; else goto find_url_end_l1; else if (*c < 127) goto find_url_end_l290; else goto find_url_end_l1; find_url_end_l291: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l292; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l292; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l292; else goto find_url_end_l1; find_url_end_l292: ++c; if (c == end) return out; if (*c < 71) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l290; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l290; else if (*c < 103) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l290; else goto find_url_end_l1; find_url_end_l293: ++c; if (c == end) return out; if (*c < 91) if (*c < 70) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l294; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 87) if (*c < 71) goto find_url_end_l300; else goto find_url_end_l297; else if (*c < 88) goto find_url_end_l304; else goto find_url_end_l297; else if (*c < 119) if (*c < 102) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 103) goto find_url_end_l300; else goto find_url_end_l297; else if (*c < 123) if (*c < 120) goto find_url_end_l304; else goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l294: ++c; if (c == end) return out; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l295; else goto find_url_end_l296; else if (*c < 48) goto find_url_end_l1; else goto find_url_end_l294; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l294; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l294; else goto find_url_end_l1; find_url_end_l295: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l295; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l294; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l294; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l294; else goto find_url_end_l1; find_url_end_l296: ++c; if (c == end) return out; if (*c < 91) if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l294; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l297: ++c; out = c; if (c == end) return out; if (*c < 58) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l298; else if (*c < 48) if (*c < 47) goto find_url_end_l299; else goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l298: ++c; if (c == end) return out; if (*c < 65) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_end_l1; else goto find_url_end_l298; else goto find_url_end_l1; else if (*c < 58) goto find_url_end_l297; else goto find_url_end_l1; else if (*c < 97) if (*c < 91) goto find_url_end_l297; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l299: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 63) if (*c < 58) goto find_url_end_l294; else goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l300: ++c; out = c; if (c == end) return out; if (*c < 64) if (*c < 47) if (*c < 45) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 46) goto find_url_end_l298; else goto find_url_end_l299; else if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 97) if (*c < 85) if (*c < 84) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l301; else if (*c < 91) goto find_url_end_l297; else goto find_url_end_l1; else if (*c < 117) if (*c < 116) goto find_url_end_l297; else goto find_url_end_l301; else if (*c < 123) goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l301: ++c; out = c; if (c == end) return out; if (*c < 64) if (*c < 47) if (*c < 45) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 46) goto find_url_end_l298; else goto find_url_end_l299; else if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 97) if (*c < 81) if (*c < 80) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l302; else if (*c < 91) goto find_url_end_l297; else goto find_url_end_l1; else if (*c < 113) if (*c < 112) goto find_url_end_l297; else goto find_url_end_l302; else if (*c < 123) goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l302: ++c; out = c; if (c == end) return out; if (*c < 58) if (*c < 46) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else if (*c < 45) goto find_url_end_l1; else goto find_url_end_l298; else if (*c < 48) if (*c < 47) goto find_url_end_l303; else goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 91) if (*c < 64) if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 123) if (*c < 97) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l303: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 63) if (*c < 58) goto find_url_end_l13; else goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l15; else goto find_url_end_l1; else if (*c < 123) goto find_url_end_l15; else goto find_url_end_l1; find_url_end_l304: ++c; out = c; if (c == end) return out; if (*c < 64) if (*c < 47) if (*c < 45) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 46) goto find_url_end_l298; else goto find_url_end_l299; else if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 97) if (*c < 88) if (*c < 87) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l305; else if (*c < 91) goto find_url_end_l297; else goto find_url_end_l1; else if (*c < 120) if (*c < 119) goto find_url_end_l297; else goto find_url_end_l305; else if (*c < 123) goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l305: ++c; out = c; if (c == end) return out; if (*c < 64) if (*c < 47) if (*c < 45) if (*c < 36) if (*c < 35) goto find_url_end_l1; else goto find_url_end_l16; else goto find_url_end_l1; else if (*c < 46) goto find_url_end_l298; else goto find_url_end_l299; else if (*c < 58) if (*c < 48) goto find_url_end_l1; else goto find_url_end_l297; else if (*c < 63) goto find_url_end_l1; else goto find_url_end_l23; else if (*c < 97) if (*c < 88) if (*c < 87) if (*c < 65) goto find_url_end_l1; else goto find_url_end_l297; else goto find_url_end_l302; else if (*c < 91) goto find_url_end_l297; else goto find_url_end_l1; else if (*c < 120) if (*c < 119) goto find_url_end_l297; else goto find_url_end_l302; else if (*c < 123) goto find_url_end_l297; else goto find_url_end_l1; find_url_end_l306: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 69) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 70) goto find_url_end_l307; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 102) if (*c < 101) goto find_url_end_l2; else goto find_url_end_l307; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l307: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 87) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 88) goto find_url_end_l308; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 120) if (*c < 119) goto find_url_end_l2; else goto find_url_end_l308; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l308: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 83) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 84) goto find_url_end_l31; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 116) if (*c < 115) goto find_url_end_l2; else goto find_url_end_l31; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l309: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 87) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 88) goto find_url_end_l310; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 120) if (*c < 119) goto find_url_end_l2; else goto find_url_end_l310; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l310: ++c; if (c == end) return out; if (*c < 64) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 36) goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 47) if (*c < 38) goto find_url_end_l3; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 61) if (*c < 59) if (*c < 58) goto find_url_end_l2; else goto find_url_end_l5; else if (*c < 60) goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 97) if (*c < 91) if (*c < 87) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else if (*c < 88) goto find_url_end_l311; else goto find_url_end_l2; else if (*c < 96) if (*c < 95) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 120) if (*c < 119) goto find_url_end_l2; else goto find_url_end_l311; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; find_url_end_l311: ++c; if (c == end) return out; if (*c < 61) if (*c < 46) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 38) if (*c < 37) goto find_url_end_l2; else goto find_url_end_l3; else goto find_url_end_l2; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_end_l271; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 60) if (*c < 59) goto find_url_end_l5; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 95) if (*c < 64) if (*c < 63) if (*c < 62) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 91) if (*c < 65) goto find_url_end_l8; else goto find_url_end_l2; else goto find_url_end_l1; else if (*c < 123) if (*c < 97) if (*c < 96) goto find_url_end_l2; else goto find_url_end_l1; else goto find_url_end_l2; else if (*c < 127) if (*c < 126) goto find_url_end_l1; else goto find_url_end_l2; else goto find_url_end_l1; } char* find_url_starts(const char* start, const char* end, char* scratch) { const char* c = end; scratch += (end - start); goto find_url_starts_start; find_url_starts_l0: *--scratch = 0; find_url_starts_start: if (c-- == start) return scratch; if (*c < 91) if (*c < 48) if (*c < 47) goto find_url_starts_l0; else goto find_url_starts_l1; else if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l1: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 48) if (*c < 47) goto find_url_starts_l0; else goto find_url_starts_l2; else if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l2: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l0; else goto find_url_starts_l2; else goto find_url_starts_l0; else if (*c < 59) goto find_url_starts_l3; else goto find_url_starts_l0; else if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l3: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 70) if (*c < 65) if (*c < 48) if (*c < 47) goto find_url_starts_l0; else goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 69) goto find_url_starts_l4; else goto find_url_starts_l72; else if (*c < 83) if (*c < 81) if (*c < 80) goto find_url_starts_l4; else goto find_url_starts_l75; else goto find_url_starts_l4; else if (*c < 84) goto find_url_starts_l80; else goto find_url_starts_l4; else if (*c < 113) if (*c < 102) if (*c < 101) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l4; else goto find_url_starts_l72; else if (*c < 112) goto find_url_starts_l4; else goto find_url_starts_l75; else if (*c < 116) if (*c < 115) goto find_url_starts_l4; else goto find_url_starts_l80; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l4: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l5: *--scratch = 0; if (c-- == start) return scratch; if (*c < 88) if (*c < 65) if (*c < 48) if (*c < 47) goto find_url_starts_l0; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 81) if (*c < 80) goto find_url_starts_l6; else goto find_url_starts_l67; else if (*c < 87) goto find_url_starts_l6; else goto find_url_starts_l70; else if (*c < 113) if (*c < 97) if (*c < 91) goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 112) goto find_url_starts_l6; else goto find_url_starts_l67; else if (*c < 120) if (*c < 119) goto find_url_starts_l6; else goto find_url_starts_l70; else if (*c < 123) goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l6: *--scratch = 0; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_starts_l0; else goto find_url_starts_l7; else goto find_url_starts_l5; else if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 123) goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l7: *--scratch = 0; if (c-- == start) return scratch; if (*c < 58) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_starts_l0; else goto find_url_starts_l7; else goto find_url_starts_l0; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l6; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 123) goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l8: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 38) if (*c < 37) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l10; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 97) if (*c < 91) if (*c < 71) if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l66; else goto find_url_starts_l65; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 126) if (*c < 123) if (*c < 103) goto find_url_starts_l66; else goto find_url_starts_l65; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l9: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 38) if (*c < 37) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l10; else goto find_url_starts_l12; else if (*c < 61) if (*c < 60) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 97) if (*c < 91) if (*c < 71) if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l66; else goto find_url_starts_l65; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 126) if (*c < 123) if (*c < 103) goto find_url_starts_l66; else goto find_url_starts_l65; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l10: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 38) if (*c < 37) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l11; else goto find_url_starts_l12; else if (*c < 61) if (*c < 60) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 97) if (*c < 91) if (*c < 71) if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l19; else goto find_url_starts_l65; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 126) if (*c < 123) if (*c < 103) goto find_url_starts_l19; else goto find_url_starts_l65; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l11: *--scratch = 0; if (c-- == start) return scratch; if (*c < 65) if (*c < 58) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 48) if (*c < 47) goto find_url_starts_l9; else goto find_url_starts_l1; else goto find_url_starts_l11; else if (*c < 61) if (*c < 60) if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 62) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 97) if (*c < 95) if (*c < 91) if (*c < 71) goto find_url_starts_l19; else goto find_url_starts_l65; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 126) if (*c < 123) if (*c < 103) goto find_url_starts_l19; else goto find_url_starts_l65; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l12: *--scratch = 0; if (c-- == start) return scratch; if (*c < 91) if (*c < 65) if (*c < 48) if (*c < 47) goto find_url_starts_l0; else goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 80) if (*c < 79) goto find_url_starts_l4; else goto find_url_starts_l13; else goto find_url_starts_l4; else if (*c < 112) if (*c < 111) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l4; else goto find_url_starts_l13; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l13: *--scratch = 0; if (c-- == start) return scratch; if (*c < 85) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 84) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l14; else if (*c < 116) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 117) goto find_url_starts_l14; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l14: *--scratch = 0; if (c-- == start) return scratch; if (*c < 77) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 76) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l15; else if (*c < 108) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 109) goto find_url_starts_l15; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l15: *--scratch = 0; if (c-- == start) return scratch; if (*c < 74) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 73) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l16; else if (*c < 105) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 106) goto find_url_starts_l16; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l16: *--scratch = 0; if (c-- == start) return scratch; if (*c < 66) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 65) if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else goto find_url_starts_l17; else if (*c < 98) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l17; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l17: *--scratch = 0; if (c-- == start) return scratch; if (*c < 78) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 77) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l18; else if (*c < 109) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 110) goto find_url_starts_l18; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l18: *--scratch = 1; if (c-- == start) return scratch; if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l19: *--scratch = 0; if (c-- == start) return scratch; if (*c < 64) if (*c < 48) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 47) if (*c < 46) goto find_url_starts_l9; else goto find_url_starts_l20; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l11; else goto find_url_starts_l12; else goto find_url_starts_l9; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 97) if (*c < 91) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l19; else goto find_url_starts_l65; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 126) if (*c < 123) if (*c < 103) goto find_url_starts_l19; else goto find_url_starts_l65; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l20: *--scratch = 0; if (c-- == start) return scratch; if (*c < 81) if (*c < 58) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 47) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l21; else if (*c < 62) if (*c < 60) if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 71) if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l21; else if (*c < 80) goto find_url_starts_l23; else goto find_url_starts_l25; else if (*c < 112) if (*c < 95) if (*c < 88) if (*c < 87) goto find_url_starts_l23; else goto find_url_starts_l62; else if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else if (*c < 97) if (*c < 96) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 103) goto find_url_starts_l21; else goto find_url_starts_l23; else if (*c < 123) if (*c < 119) if (*c < 113) goto find_url_starts_l25; else goto find_url_starts_l23; else if (*c < 120) goto find_url_starts_l62; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l21: *--scratch = 0; if (c-- == start) return scratch; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l22; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l20; else goto find_url_starts_l1; else goto find_url_starts_l24; else if (*c < 60) if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 62) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l24; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l24; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l22: *--scratch = 0; if (c-- == start) return scratch; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l22; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l9; else goto find_url_starts_l1; else goto find_url_starts_l21; else if (*c < 60) if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 62) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l21; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l21; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l23: *--scratch = 0; if (c-- == start) return scratch; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l22; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l20; else goto find_url_starts_l1; else goto find_url_starts_l21; else if (*c < 60) if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 62) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l21; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l21; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l24: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 46) if (*c < 45) goto find_url_starts_l9; else goto find_url_starts_l22; else goto find_url_starts_l20; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l24; else goto find_url_starts_l12; else if (*c < 61) if (*c < 60) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else goto find_url_starts_l24; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l24; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l25: *--scratch = 0; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 46) goto find_url_starts_l22; else goto find_url_starts_l20; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l21; else if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 97) if (*c < 85) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l21; else if (*c < 84) goto find_url_starts_l23; else goto find_url_starts_l26; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 123) if (*c < 116) if (*c < 103) goto find_url_starts_l21; else goto find_url_starts_l23; else if (*c < 117) goto find_url_starts_l26; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l26: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l22; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l20; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l21; else goto find_url_starts_l12; else if (*c < 61) if (*c < 60) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else if (*c < 70) goto find_url_starts_l21; else goto find_url_starts_l27; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 102) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l21; else if (*c < 103) goto find_url_starts_l27; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l27: *--scratch = 1; if (c-- == start) return scratch; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l22; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l20; else goto find_url_starts_l1; else goto find_url_starts_l24; else if (*c < 60) if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 62) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l28; else goto find_url_starts_l24; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l24; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l28: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 47) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l29; else goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l61; else if (*c < 95) if (*c < 91) goto find_url_starts_l60; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l61; else goto find_url_starts_l60; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l29: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 47) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l30; else goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l48; else if (*c < 95) if (*c < 91) goto find_url_starts_l60; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l48; else goto find_url_starts_l60; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l30: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 58) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 48) if (*c < 47) goto find_url_starts_l28; else goto find_url_starts_l1; else goto find_url_starts_l30; else if (*c < 61) if (*c < 60) if (*c < 59) goto find_url_starts_l31; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 63) if (*c < 62) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 97) if (*c < 91) if (*c < 71) if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l48; else goto find_url_starts_l60; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 126) if (*c < 123) if (*c < 103) goto find_url_starts_l48; else goto find_url_starts_l60; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l31: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 47) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l32; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l47; else if (*c < 95) if (*c < 91) goto find_url_starts_l46; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l47; else goto find_url_starts_l46; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l32: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 47) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l33; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l34; else if (*c < 95) if (*c < 91) goto find_url_starts_l46; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l34; else goto find_url_starts_l46; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l33: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 58) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 48) if (*c < 47) goto find_url_starts_l31; else goto find_url_starts_l1; else goto find_url_starts_l33; else if (*c < 61) if (*c < 60) if (*c < 59) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 63) if (*c < 62) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 97) if (*c < 91) if (*c < 71) if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l34; else goto find_url_starts_l46; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 126) if (*c < 123) if (*c < 103) goto find_url_starts_l34; else goto find_url_starts_l46; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l34: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 47) if (*c < 46) goto find_url_starts_l31; else goto find_url_starts_l35; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l33; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l31; else goto find_url_starts_l8; else goto find_url_starts_l34; else if (*c < 95) if (*c < 91) goto find_url_starts_l46; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l34; else goto find_url_starts_l46; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l35: *--scratch = 1; if (c-- == start) return scratch; if (*c < 80) if (*c < 59) if (*c < 38) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 37) goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 48) if (*c < 47) goto find_url_starts_l31; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l36; else goto find_url_starts_l0; else if (*c < 63) if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 62) goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 65) if (*c < 64) goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 71) goto find_url_starts_l36; else goto find_url_starts_l38; else if (*c < 103) if (*c < 91) if (*c < 87) if (*c < 81) goto find_url_starts_l40; else goto find_url_starts_l38; else if (*c < 88) goto find_url_starts_l43; else goto find_url_starts_l38; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l36; else if (*c < 120) if (*c < 113) if (*c < 112) goto find_url_starts_l38; else goto find_url_starts_l40; else if (*c < 119) goto find_url_starts_l38; else goto find_url_starts_l43; else if (*c < 126) if (*c < 123) goto find_url_starts_l38; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l36: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l37; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l35; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l39; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l39; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l39; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l37: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l37; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l31; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l36; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l36; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l36; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l38: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l37; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l35; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l36; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l36; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l36; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l39: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 45) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 47) if (*c < 46) goto find_url_starts_l37; else goto find_url_starts_l35; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l39; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l31; else goto find_url_starts_l8; else goto find_url_starts_l39; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l39; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l40: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 46) goto find_url_starts_l37; else goto find_url_starts_l35; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l36; else if (*c < 59) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 97) if (*c < 85) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l36; else if (*c < 84) goto find_url_starts_l38; else goto find_url_starts_l41; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 123) if (*c < 116) if (*c < 103) goto find_url_starts_l36; else goto find_url_starts_l38; else if (*c < 117) goto find_url_starts_l41; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l41: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 46) goto find_url_starts_l37; else goto find_url_starts_l35; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l36; else if (*c < 59) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l31; else goto find_url_starts_l8; else if (*c < 70) goto find_url_starts_l36; else goto find_url_starts_l42; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 102) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l36; else if (*c < 103) goto find_url_starts_l42; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l42: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l37; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l35; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l39; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 65) goto find_url_starts_l28; else goto find_url_starts_l39; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l39; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l43: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 46) goto find_url_starts_l37; else goto find_url_starts_l35; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l36; else if (*c < 59) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 97) if (*c < 88) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l36; else if (*c < 87) goto find_url_starts_l38; else goto find_url_starts_l44; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 123) if (*c < 119) if (*c < 103) goto find_url_starts_l36; else goto find_url_starts_l38; else if (*c < 120) goto find_url_starts_l44; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l44: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 46) goto find_url_starts_l37; else goto find_url_starts_l35; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l36; else if (*c < 59) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 97) if (*c < 88) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l36; else if (*c < 87) goto find_url_starts_l38; else goto find_url_starts_l45; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l31; else goto find_url_starts_l0; else if (*c < 123) if (*c < 119) if (*c < 103) goto find_url_starts_l36; else goto find_url_starts_l38; else if (*c < 120) goto find_url_starts_l45; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l45: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l37; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l35; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l36; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 65) goto find_url_starts_l28; else goto find_url_starts_l36; else if (*c < 95) if (*c < 91) goto find_url_starts_l38; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l36; else goto find_url_starts_l38; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l46: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 46) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l35; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l32; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l47; else if (*c < 95) if (*c < 91) goto find_url_starts_l46; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l47; else goto find_url_starts_l46; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l47: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 46) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l35; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l33; else goto find_url_starts_l0; else if (*c < 61) if (*c < 60) goto find_url_starts_l31; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l34; else if (*c < 95) if (*c < 91) goto find_url_starts_l46; else goto find_url_starts_l0; else goto find_url_starts_l31; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l34; else goto find_url_starts_l46; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l31; else goto find_url_starts_l0; find_url_starts_l48: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 47) if (*c < 46) goto find_url_starts_l28; else goto find_url_starts_l49; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l30; else goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l28; else goto find_url_starts_l8; else goto find_url_starts_l48; else if (*c < 95) if (*c < 91) goto find_url_starts_l60; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l48; else goto find_url_starts_l60; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l49: *--scratch = 1; if (c-- == start) return scratch; if (*c < 80) if (*c < 59) if (*c < 38) if (*c < 36) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 37) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 48) if (*c < 47) goto find_url_starts_l28; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l50; else goto find_url_starts_l31; else if (*c < 63) if (*c < 61) if (*c < 60) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 62) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 65) if (*c < 64) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 71) goto find_url_starts_l50; else goto find_url_starts_l52; else if (*c < 103) if (*c < 91) if (*c < 87) if (*c < 81) goto find_url_starts_l54; else goto find_url_starts_l52; else if (*c < 88) goto find_url_starts_l57; else goto find_url_starts_l52; else if (*c < 96) if (*c < 95) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l50; else if (*c < 120) if (*c < 113) if (*c < 112) goto find_url_starts_l52; else goto find_url_starts_l54; else if (*c < 119) goto find_url_starts_l52; else goto find_url_starts_l57; else if (*c < 126) if (*c < 123) goto find_url_starts_l52; else goto find_url_starts_l0; else if (*c < 127) goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l50: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l51; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l49; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l53; else goto find_url_starts_l31; else if (*c < 61) if (*c < 60) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l53; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l53; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l51: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l51; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l28; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l50; else goto find_url_starts_l31; else if (*c < 61) if (*c < 60) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 65) goto find_url_starts_l0; else goto find_url_starts_l50; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l50; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l52: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l51; else if (*c < 59) if (*c < 48) if (*c < 47) goto find_url_starts_l49; else goto find_url_starts_l1; else if (*c < 58) goto find_url_starts_l50; else goto find_url_starts_l31; else if (*c < 61) if (*c < 60) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l50; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l50; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l53: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 48) if (*c < 45) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 47) if (*c < 46) goto find_url_starts_l51; else goto find_url_starts_l49; else goto find_url_starts_l1; else if (*c < 60) if (*c < 59) if (*c < 58) goto find_url_starts_l53; else goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l28; else goto find_url_starts_l8; else goto find_url_starts_l53; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l53; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l54: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 46) goto find_url_starts_l51; else goto find_url_starts_l49; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l50; else if (*c < 59) goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 97) if (*c < 85) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l50; else if (*c < 84) goto find_url_starts_l52; else goto find_url_starts_l55; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 123) if (*c < 116) if (*c < 103) goto find_url_starts_l50; else goto find_url_starts_l52; else if (*c < 117) goto find_url_starts_l55; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l55: *--scratch = 1; if (c-- == start) return scratch; if (*c < 63) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 46) goto find_url_starts_l51; else goto find_url_starts_l49; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l50; else if (*c < 59) goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l28; else goto find_url_starts_l8; else if (*c < 70) goto find_url_starts_l50; else goto find_url_starts_l56; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 102) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l50; else if (*c < 103) goto find_url_starts_l56; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l56: *--scratch = 1; if (c-- == start) return scratch; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l51; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l49; else goto find_url_starts_l1; else goto find_url_starts_l53; else if (*c < 60) if (*c < 59) goto find_url_starts_l31; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 63) if (*c < 62) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l28; else goto find_url_starts_l53; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l53; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l57: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 46) goto find_url_starts_l51; else goto find_url_starts_l49; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l50; else if (*c < 59) goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 97) if (*c < 88) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l50; else if (*c < 87) goto find_url_starts_l52; else goto find_url_starts_l58; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 123) if (*c < 119) if (*c < 103) goto find_url_starts_l50; else goto find_url_starts_l52; else if (*c < 120) goto find_url_starts_l58; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l58: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 46) goto find_url_starts_l51; else goto find_url_starts_l49; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l50; else if (*c < 59) goto find_url_starts_l31; else goto find_url_starts_l28; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 97) if (*c < 88) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l50; else if (*c < 87) goto find_url_starts_l52; else goto find_url_starts_l59; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 123) if (*c < 119) if (*c < 103) goto find_url_starts_l50; else goto find_url_starts_l52; else if (*c < 120) goto find_url_starts_l59; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l59: *--scratch = 1; if (c-- == start) return scratch; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l51; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l49; else goto find_url_starts_l1; else goto find_url_starts_l50; else if (*c < 60) if (*c < 59) goto find_url_starts_l31; else goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 63) if (*c < 62) goto find_url_starts_l28; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l28; else goto find_url_starts_l50; else if (*c < 95) if (*c < 91) goto find_url_starts_l52; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l50; else goto find_url_starts_l52; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l60: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 46) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l49; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l29; else goto find_url_starts_l31; else if (*c < 61) if (*c < 60) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l61; else if (*c < 95) if (*c < 91) goto find_url_starts_l60; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l61; else goto find_url_starts_l60; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l61: *--scratch = 1; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 46) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l49; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l30; else goto find_url_starts_l31; else if (*c < 61) if (*c < 60) goto find_url_starts_l28; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 63) goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l48; else if (*c < 95) if (*c < 91) goto find_url_starts_l60; else goto find_url_starts_l0; else goto find_url_starts_l28; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l48; else goto find_url_starts_l60; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l28; else goto find_url_starts_l0; find_url_starts_l62: *--scratch = 0; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 46) goto find_url_starts_l22; else goto find_url_starts_l20; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l21; else if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 97) if (*c < 88) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l21; else if (*c < 87) goto find_url_starts_l23; else goto find_url_starts_l63; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 123) if (*c < 119) if (*c < 103) goto find_url_starts_l21; else goto find_url_starts_l23; else if (*c < 120) goto find_url_starts_l63; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l63: *--scratch = 0; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 46) goto find_url_starts_l22; else goto find_url_starts_l20; else if (*c < 60) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l21; else if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else if (*c < 62) if (*c < 61) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 97) if (*c < 88) if (*c < 71) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l21; else if (*c < 87) goto find_url_starts_l23; else goto find_url_starts_l64; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else if (*c < 96) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 123) if (*c < 119) if (*c < 103) goto find_url_starts_l21; else goto find_url_starts_l23; else if (*c < 120) goto find_url_starts_l64; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l64: *--scratch = 1; if (c-- == start) return scratch; if (*c < 61) if (*c < 46) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 45) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l22; else if (*c < 58) if (*c < 48) if (*c < 47) goto find_url_starts_l20; else goto find_url_starts_l1; else goto find_url_starts_l21; else if (*c < 60) if (*c < 59) goto find_url_starts_l12; else goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 96) if (*c < 71) if (*c < 64) if (*c < 62) goto find_url_starts_l9; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l28; else goto find_url_starts_l21; else if (*c < 95) if (*c < 91) goto find_url_starts_l23; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l21; else goto find_url_starts_l23; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l65: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 46) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l20; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l10; else goto find_url_starts_l12; else if (*c < 61) if (*c < 60) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else goto find_url_starts_l66; else if (*c < 95) if (*c < 91) goto find_url_starts_l65; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l66; else goto find_url_starts_l65; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l66: *--scratch = 0; if (c-- == start) return scratch; if (*c < 62) if (*c < 47) if (*c < 37) if (*c < 34) if (*c < 33) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 36) goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 46) if (*c < 38) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l20; else if (*c < 59) if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l11; else goto find_url_starts_l12; else if (*c < 61) if (*c < 60) goto find_url_starts_l9; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 96) if (*c < 71) if (*c < 65) if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else goto find_url_starts_l19; else if (*c < 95) if (*c < 91) goto find_url_starts_l65; else goto find_url_starts_l0; else goto find_url_starts_l9; else if (*c < 123) if (*c < 103) if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l19; else goto find_url_starts_l65; else if (*c < 127) if (*c < 126) goto find_url_starts_l0; else goto find_url_starts_l9; else goto find_url_starts_l0; find_url_starts_l67: *--scratch = 0; if (c-- == start) return scratch; if (*c < 84) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_starts_l0; else goto find_url_starts_l7; else if (*c < 47) goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) if (*c < 58) goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l6; else if (*c < 116) if (*c < 91) if (*c < 85) goto find_url_starts_l68; else goto find_url_starts_l6; else if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l6; else if (*c < 123) if (*c < 117) goto find_url_starts_l68; else goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l68: *--scratch = 0; if (c-- == start) return scratch; if (*c < 70) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_starts_l0; else goto find_url_starts_l7; else if (*c < 47) goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) if (*c < 58) goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l6; else if (*c < 102) if (*c < 91) if (*c < 71) goto find_url_starts_l69; else goto find_url_starts_l6; else if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l6; else if (*c < 123) if (*c < 103) goto find_url_starts_l69; else goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l69: *--scratch = 1; if (c-- == start) return scratch; if (*c < 64) if (*c < 47) if (*c < 46) if (*c < 45) goto find_url_starts_l0; else goto find_url_starts_l7; else goto find_url_starts_l5; else if (*c < 58) if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 97) if (*c < 91) if (*c < 65) goto find_url_starts_l28; else goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 123) goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l70: *--scratch = 0; if (c-- == start) return scratch; if (*c < 87) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_starts_l0; else goto find_url_starts_l7; else if (*c < 47) goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) if (*c < 58) goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l6; else if (*c < 119) if (*c < 91) if (*c < 88) goto find_url_starts_l71; else goto find_url_starts_l6; else if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l6; else if (*c < 123) if (*c < 120) goto find_url_starts_l71; else goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l71: *--scratch = 0; if (c-- == start) return scratch; if (*c < 87) if (*c < 48) if (*c < 46) if (*c < 45) goto find_url_starts_l0; else goto find_url_starts_l7; else if (*c < 47) goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) if (*c < 58) goto find_url_starts_l6; else goto find_url_starts_l0; else if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l6; else if (*c < 119) if (*c < 91) if (*c < 88) goto find_url_starts_l69; else goto find_url_starts_l6; else if (*c < 97) goto find_url_starts_l0; else goto find_url_starts_l6; else if (*c < 123) if (*c < 120) goto find_url_starts_l69; else goto find_url_starts_l6; else goto find_url_starts_l0; find_url_starts_l72: *--scratch = 0; if (c-- == start) return scratch; if (*c < 77) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 76) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l73; else if (*c < 108) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 109) goto find_url_starts_l73; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l73: *--scratch = 0; if (c-- == start) return scratch; if (*c < 74) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 73) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l74; else if (*c < 105) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 106) goto find_url_starts_l74; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l74: *--scratch = 0; if (c-- == start) return scratch; if (*c < 71) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 70) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l18; else if (*c < 102) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 103) goto find_url_starts_l18; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l75: *--scratch = 0; if (c-- == start) return scratch; if (*c < 85) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 66) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l76; else if (*c < 84) goto find_url_starts_l4; else goto find_url_starts_l78; else if (*c < 116) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else if (*c < 98) goto find_url_starts_l76; else goto find_url_starts_l4; else if (*c < 123) if (*c < 117) goto find_url_starts_l78; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l76: *--scratch = 0; if (c-- == start) return scratch; if (*c < 78) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 77) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l77; else if (*c < 109) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 110) goto find_url_starts_l77; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l77: *--scratch = 0; if (c-- == start) return scratch; if (*c < 74) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 73) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l18; else if (*c < 105) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 106) goto find_url_starts_l18; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l78: *--scratch = 0; if (c-- == start) return scratch; if (*c < 85) if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else if (*c < 71) if (*c < 70) goto find_url_starts_l4; else goto find_url_starts_l18; else if (*c < 84) goto find_url_starts_l4; else goto find_url_starts_l79; else if (*c < 103) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else if (*c < 102) goto find_url_starts_l4; else goto find_url_starts_l18; else if (*c < 117) if (*c < 116) goto find_url_starts_l4; else goto find_url_starts_l79; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l79: *--scratch = 0; if (c-- == start) return scratch; if (*c < 73) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 72) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l18; else if (*c < 104) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 105) goto find_url_starts_l18; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l80: *--scratch = 0; if (c-- == start) return scratch; if (*c < 88) if (*c < 65) if (*c < 48) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else goto find_url_starts_l1; else if (*c < 64) goto find_url_starts_l0; else goto find_url_starts_l8; else if (*c < 81) if (*c < 80) goto find_url_starts_l4; else goto find_url_starts_l75; else if (*c < 87) goto find_url_starts_l4; else goto find_url_starts_l81; else if (*c < 113) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else if (*c < 112) goto find_url_starts_l4; else goto find_url_starts_l75; else if (*c < 120) if (*c < 119) goto find_url_starts_l4; else goto find_url_starts_l81; else if (*c < 123) goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l81: *--scratch = 0; if (c-- == start) return scratch; if (*c < 70) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 69) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l82; else if (*c < 101) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 102) goto find_url_starts_l82; else goto find_url_starts_l4; else goto find_url_starts_l0; find_url_starts_l82: *--scratch = 0; if (c-- == start) return scratch; if (*c < 79) if (*c < 64) if (*c < 47) if (*c < 46) goto find_url_starts_l0; else goto find_url_starts_l5; else if (*c < 48) goto find_url_starts_l1; else goto find_url_starts_l0; else if (*c < 78) if (*c < 65) goto find_url_starts_l8; else goto find_url_starts_l4; else goto find_url_starts_l18; else if (*c < 110) if (*c < 97) if (*c < 91) goto find_url_starts_l4; else goto find_url_starts_l0; else goto find_url_starts_l4; else if (*c < 123) if (*c < 111) goto find_url_starts_l18; else goto find_url_starts_l4; else goto find_url_starts_l0; } lurker-2.3/render/mindex.cpp0000644000175000017500000001114111267074431013055 00000000000000/* $Id: mindex.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * mindex.cpp - Handle a mindex/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include "commands.h" #include "Search.h" #include "Cache.h" using namespace std; int handle_mindex(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); cfg.options = req.options; string::size_type o = req.options.find('@'); if (o == string::npos || !MessageId::is_full(req.options.c_str()+o+1) || req.options.length() != o+1+MessageId::full_len) error(_("Bad request"), param, _("The given parameter was not of the correct format. " "A mindex request must be formatted like: " "mindex/list@YYYYMMDD.HHMMSS.hashcode.xml where list " "is the id of an indexed mailing list.")); MessageId id(req.options.c_str()+o+1); string listn(req.options, 0, o); const Config::Lists::const_iterator li = cfg.lists.find(listn); // Identical error message if it's missing or not allowed (security) if (li == cfg.lists.end() || !li->second.allowed) error(_("No such list"), listn, _("The specified mailing list is not available in this " "archive. Perhaps you misspelled it or went to the " "wrong server?")); const List& list = li->second; // Right! Everything the user did is ok. vector forward, backward, queue; Search backwardk(cfg, db, Backward, id); backwardk.keyword(LU_KEYWORD_LIST + list.mbox); Search forwardk (cfg, db, Forward, id); forwardk .keyword(LU_KEYWORD_LIST + list.mbox); string ok; if (!forwardk .pull(35, forward ) || !backwardk.pull(35, backward)) error(_("Database mindex seek failure"), "pull", _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "furth assistence.")); vector::size_type left, right, i; if (forward.size() + backward.size() < 20) { left = backward.size(); right = forward.size(); } else if (forward.size() < 10) { right = forward.size(); left = 20 - right; } else if (backward.size() < 10) { left = backward.size(); right = 20 - left; } else { left = right = 10; } assert (left <= backward.size()); assert (right <= forward .size()); for (i = left; i > 0; --i) queue.push_back(backward[i-1]); for (i = 0; i < right; ++i) queue.push_back(forward[i]); for (i = 0; i < queue.size(); ++i) if ((ok = queue[i].load(db, cfg)) != "") break; if (ok != "") error(_("Database mindex pull failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); Cache cache(cfg, "mindex", param, req.ext); cache.o << "\n" << "\n" << "\n" << " " << req.ext << "\n" << " " << cfg(req.language) << "\n" << " " << list(req.language) << "\n"; if (right < forward.size()) { // we need a next link i = min(right+9, forward.size()-1); MessageId nd(forward[i].id()); nd.increment(); // hope that it doesn't exist (-> skips one) cache.o << " " << nd.serialize() << "\n"; } if (left < backward.size()) { // we need a prev link i = min(left+10, backward.size()-1); MessageId pd(backward[i].id()); pd.increment(); cache.o << " " << pd.serialize() << "\n"; } for (i = 0; i < queue.size(); ++i) { if (queue[i].id() == id) cache.o << " "; else cache.o << " "; cache.o << queue[i] << "\n"; } cache.o << "\n"; return 0; } lurker-2.3/render/message.cpp0000644000175000017500000006066711267146642013242 00000000000000/* $Id: message.cpp 1658 2009-10-19 20:35:45Z terpstra $ * * message.cpp - Handle a message/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "commands.h" #include "Threading.h" #include "Search.h" #include "Cache.h" #define OLD_PGP_HEADER "-----BEGIN PGP SIGNED MESSAGE-----\n" #define OLD_PGP_DIVIDER "-----BEGIN PGP SIGNATURE-----\n" #define OLD_PGP_ENDER "-----END PGP SIGNATURE-----\n" const char* find_art_end(const char* start, const char* end); const char* find_quote_end(const char* start, const char* end); const char* find_email_end(const char* start, const char* end); const char* find_url_end(const char* start, const char* end); char* find_art_starts(const char* start, const char* end, char* scratch); char* find_quote_starts(const char* start, const char* end, char* scratch); char* find_email_starts(const char* start, const char* end, char* scratch); char* find_url_starts(const char* start, const char* end, char* scratch); void my_service_mailto( ostream& o, char* s0, const char* b0, const char* bE, const Config& cfg) { if (b0 == bE) return; char* sE = s0+(bE-b0); char* si = s0; const char* bi = b0; find_email_starts(b0, bE, s0); while (si != sE) { if (*si) { o << xmlEscape << string(bi, (si-s0)-(bi-b0)); bi = b0 + (si-s0); const char* bj = find_email_end(bi, bE); if (cfg.hide_email) { string addr(bi, bj-bi); string::size_type l = addr.find('@'); if (l != string::npos) addr.resize(l); o << xmlEscape << addr << "@???"; } else { o << ""; o << xmlEscape << string(bi, bj-bi); o << ""; } bi = bj; si = s0 + (bi - b0); } else { ++si; } } o << xmlEscape << string(bi, bE-bi); } void my_service_url( ostream& o, char* s0, const char* b0, const char* bE, const Config& cfg) { if (b0 == bE) return; char* sE = s0+(bE-b0); char* si = s0; const char* bi = b0; find_url_starts(b0, bE, s0); while (si != sE) { if (*si) { my_service_mailto(o, s0, bi, b0+(si-s0), cfg); bi = b0 + (si-s0); const char* bj = find_url_end(bi, bE); o << ""; o << xmlEscape << string(bi, bj-bi); o << ""; bi = bj; si = s0 + (bi - b0); } else { ++si; } } my_service_mailto(o, s0, bi, bE, cfg); } void my_service_art( ostream& o, char* s0, const char* b0, const char* bE, const Config& cfg) { if (b0 == bE) return; char* sE = s0+(bE-b0); char* si = s0; const char* bi = b0; find_art_starts(b0, bE, s0); while (si != sE) { if (*si) { my_service_url(o, s0, bi, b0+(si-s0), cfg); o << ""; bi = b0 + (si-s0); const char* bj = find_art_end(bi, bE); my_service_url(o, s0, bi, bj, cfg); o << ""; bi = bj; si = s0 + (bi - b0); } else { ++si; } } my_service_url(o, s0, bi, bE, cfg); } void my_service_quote( ostream& o, char* s0, const char* b0, const char* bE, const Config& cfg) { if (b0 == bE) return; char* sE = s0+(bE-b0); char* si = s0; const char* bi = b0; find_quote_starts(b0, bE, s0); while (si != sE) { if (*si) { my_service_art(o, s0, bi, b0+(si-s0), cfg); o << ""; bi = b0 + (si-s0); const char* bj = find_quote_end(bi, bE); my_service_art(o, s0, bi, bj, cfg); o << ""; bi = bj; si = s0 + (bi - b0); } else { ++si; } } my_service_art(o, s0, bi, bE, cfg); } void my_service_process( ostream& o, const char* b0, long len, const Config& cfg) { const char* bE = b0 + len; char* s0 = new char [len]; my_service_quote(o, s0, b0, bE, cfg); delete s0; } static void find_and_replace(string& target, const string& token, const string& value) { string::size_type x = 0; while ((x = target.find(token, x)) != string::npos) target.replace(x, token.length(), value); } const Config* pgp_config = 0; string pgp_name_prefix; int pgp_part = 0; string pgp_tmpfile(const string& type) { char buf[10]; sprintf(buf, "%d", pgp_part); return string("../attach/") + buf + "@" + pgp_name_prefix + "." + type; } void pgp_writefile(ostream& o, const DwString& data) { size_t s, e; s = 0; while (1) // signed data must have CRLF endcoding { e = data.find_first_of("\r\n", s); if (e == DwString::npos) break; o.write(data.c_str() + s, e - s); if (data[e] == '\n') o << "\r\n"; s = e+1; } o.write(data.c_str() + s, data.length() - s); } void run_pgp(ostream& o, string& command) { string photo = pgp_tmpfile("photo"); find_and_replace(command, "%p", photo); string details; int status; FILE* pgp = popen(command.c_str(), "r"); if (pgp != 0) { char buf[1024]; size_t got; while ((got = fread(buf, 1, sizeof(buf), pgp)) > 0) { details.append(buf, got); if (got != sizeof(buf)) break; } status = pclose(pgp); if (WIFEXITED(status)) { status = WEXITSTATUS(status); } else { details += "\n" + command + " exited abnormally"; status = 2; } } else { details = command + " failed with " + strerror(errno); status = 2; } o << "" << "
" << xmlEscape << details << "
"; if (access(photo.c_str(), R_OK) == 0) { o << "" << photo << ""; } } bool handle_signed_inline(ostream& o, const DwString& s) { string command = pgp_config->pgpv_inline; if (command == "off") return false; string cleartext = pgp_tmpfile("cleartext"); find_and_replace(command, "%b", cleartext); if (1) { // create the cleartext std::ofstream body(cleartext.c_str()); pgp_writefile(body, s); } run_pgp(o, command); return true; } bool handle_signed_mime(ostream& o, DwEntity& e) { // rfc 1847 says we have 2 bodyparts: // 1. the original data // 2. the signature DwBodyPart* body = e.Body().FirstBodyPart(); if (!body) return false; DwBodyPart* sig = body->Next(); if (!sig) return false; if (sig->Next() != 0) return false; // signature has no type if (!sig->Headers().HasContentType() || sig->Headers().ContentType().Type() != DwMime::kTypeApplication) return false; DwString st = sig->Headers().ContentType().SubtypeStr(); st.ConvertToLowerCase(); if (st != "pgp-signature") return false; string command = pgp_config->pgpv_mime; if (command == "off") return false; string cleartext = pgp_tmpfile("cleartext"); string signature = pgp_tmpfile("signature"); find_and_replace(command, "%b", cleartext); find_and_replace(command, "%s", signature); if (1) { // create the cleartext std::ofstream bodyf(cleartext.c_str()); pgp_writefile(bodyf, body->AsString()); } if (1) { // create the signature std::ofstream sigf(signature.c_str()); pgp_writefile(sigf, sig->Body().AsString()); } run_pgp(o, command); return true; } void process_text(ostream& o, bool html, const string& charset, const DwString& out, const Config& cfg) { CharsetEscape decode(charset.c_str()); string utf8 = decode.write(out.c_str(), out.length()); if (!decode.valid()) { utf8 = "<-- Warning: charset '" + charset + "' is not supported -->\n\n" + utf8; } if (html) { string::size_type start, end; start = 0; while ((end = utf8.find('<', start)) != string::npos) { my_service_process(o, utf8.c_str()+start, end-start, cfg); start = utf8.find('>', end); if (start == string::npos) break; ++start; } // deal with half-open tag at end of input if (start != string::npos) my_service_process(o, utf8.c_str()+start, utf8.length()-start, cfg); } else { my_service_process(o, utf8.c_str(), utf8.length(), cfg); } } void message_display(ostream& o, DwEntity& e, const string& charset, bool html, const Config& cfg) { // Oldschool pgp usually works by invoking a helper program which // cannot control how the email client then encodes the signed data. // Hence we nede to decode the transfer-encoding for verification // to get back what the helper program probably gave the MUA. DwString out; // if (e.hasHeaders() && if (e.Headers().HasContentTransferEncoding()) { switch (e.Headers().ContentTransferEncoding().AsEnum()) { case DwMime::kCteQuotedPrintable: DwDecodeQuotedPrintable(e.Body().AsString(), out); break; case DwMime::kCteBase64: DwDecodeBase64(e.Body().AsString(), out); break; case DwMime::kCteNull: case DwMime::kCteUnknown: case DwMime::kCte7bit: case DwMime::kCte8bit: case DwMime::kCteBinary: out = e.Body().AsString(); break; } } else { out = e.Body().AsString(); } // We do NOT convert the charset because the user probably signed // the text in the charset as which it was delivered. If it wasn't, // we wouldn't be able to help anyways because we don't know what // to convert to. size_t pgp_last, pgp_header, pgp_divider, pgp_ender; for (pgp_last = 0; ((pgp_header = out.find(OLD_PGP_HEADER, pgp_last)) != DwString::npos) && ((pgp_divider = out.find(OLD_PGP_DIVIDER, pgp_header)) != DwString::npos) && ((pgp_ender = out.find(OLD_PGP_ENDER, pgp_divider))!= DwString::npos); pgp_last = pgp_ender) { pgp_ender += sizeof(OLD_PGP_ENDER)-1; // include endline, not null // deal with leading text (substr is copy-free) process_text(o, html, charset, out.substr(pgp_last, pgp_header-pgp_last), cfg); bool signOpen = false; if (handle_signed_inline(o, out.substr(pgp_header, pgp_ender-pgp_header))) { signOpen = true; o << ""; } // skip the header + hash line + blank line // (safe b/c we have 3 \n s for sure) pgp_header += sizeof(OLD_PGP_HEADER)-1; // eol, !null pgp_header = out.find('\n', pgp_header) + 1; pgp_header = out.find('\n', pgp_header) + 1; if (pgp_header < pgp_divider) { // signed text process_text(o, html, charset, out.substr(pgp_header, pgp_divider-pgp_header), cfg); } if (signOpen) { o << "
"; } } // trailing text process_text(o, html, charset, out.substr(pgp_last, out.length()-pgp_last), cfg); } // this will only output mime information if the dump is false void message_build(ostream& o, DwEntity& e, const string& parentCharset, bool dump, long& x, const Config& cfg) { // We are the requested entity. pgp_part = ++x; string charset = parentCharset; string type = "text/plain"; string name = ""; // if (e.hasHeaders() && if (e.Headers().HasContentType()) { DwMediaType& mt = e.Headers().ContentType(); DwString ftype = mt.TypeStr() + "/" + mt.SubtypeStr(); ftype.ConvertToLowerCase(); type = ftype.c_str(); name = mt.Name().c_str(); for (DwParameter* p = mt.FirstParameter(); p; p = p->Next()) { DwString attr = p->Attribute(); attr.ConvertToLowerCase(); // case insens if (attr == "charset") charset = p->Value().c_str(); } } if (e.Headers().HasContentDisposition()) { DwDispositionType& dt = e.Headers().ContentDisposition(); if (dt.Filename() != "") name = dt.Filename().c_str(); } // The question is: which charset affects the headers? // I claim that the parent charset does - this is being friendly // anyways since one shouldn't have non us-ascii in the headers CharsetEscape ches(parentCharset.c_str()); o << ""; bool signedopen = false; // if (e.hasHeaders() && if (e.Headers().HasContentType()) { DwMediaType& t = e.Headers().ContentType(); switch (t.Type()) { case DwMime::kTypeMessage: if (e.Body().Message()) message_build(o, *e.Body().Message(), charset, dump, x, cfg); break; case DwMime::kTypeMultipart: if (1) { // scope in the string DwString s = t.SubtypeStr(); s.ConvertToLowerCase(); if (s == "signed") { // verify the signature signedopen = handle_signed_mime(o, e); } } // first body part is the signed data if (signedopen) o << ""; for (DwBodyPart* p = e.Body().FirstBodyPart(); p != 0; p = p->Next()) { bool plain = false; if (p->Headers().HasContentType()) { DwMediaType& mt = p->Headers().ContentType(); plain = mt.Type() == DwMime::kTypeText && mt.Subtype() == DwMime::kSubtypePlain; } if (t.Subtype() != DwMime::kSubtypeAlternative || p->Next() == 0 || plain) { // display all parts, or plain, or last message_build(o, *p, charset, dump, x, cfg); // if we printed something, we are done if (t.Subtype() == DwMime::kSubtypeAlternative) dump = false; } else { message_build(o, *p, charset, false, x, cfg); } if (signedopen) { // done the first section which was signed o << ""; signedopen = false; } } break; case DwMime::kTypeText: if (dump) message_display(o, e, charset, t.Subtype() == DwMime::kSubtypeHtml, cfg); break; } } else { if (dump) message_display(o, e, charset, false, cfg); } o << ""; } void message_format_address(ostream& o, DwAddress* a, const string& charset, const Config& cfg) { for (; a != 0; a = a->Next()) { if (a->IsGroup()) { DwGroup* g = dynamic_cast(a); if (g) message_format_address( o, g->MailboxList().FirstMailbox(), charset, cfg); } else { DwMailbox* m = dynamic_cast(a); if (m) { string name = m->FullName().c_str(); if (name.length() >= 2 && name[0] == '"') name = name.substr(1, name.length()-2); if (name == "") name = m->LocalPart().c_str(); // Deal with the horror name = decode_header(name, charset.c_str()); if (name.length() >= 2 && name[0] == '"') name = name.substr(1, name.length()-2); DwString addr = m->LocalPart() + "@" + m->Domain(); for (size_t i = 0; i < addr.length(); ++i) { if (addr[i] <= 0x20 || addr[i] >= 0x7f) { // fucked up address addr = ""; break; } } if (addr.length() > 128) addr = ""; o << ""; } } } } struct MBox { List cfg; Summary prev; Summary next; MBox() { } MBox(const List& cfg_) : cfg(cfg_) { } string load(ESort::Reader* db, const MessageId& rel, const Config& cfg); }; string MBox::load(ESort::Reader* db, const MessageId& rel, const Config& conf) { string ok; vector
sum; Search n(conf, db, Forward, rel); n.keyword(LU_KEYWORD_LIST + cfg.mbox); if (!n.pull(2, sum)) return "Pulling next two failed"; if (sum.size() < 1 || sum[0].id() != rel) return "Relative message does not exist"; if (sum.size() >= 2) { next = sum[1]; if ((ok = next.load(db, conf)) != "") return ok; } sum.clear(); Search p(conf, db, Backward, rel); p.keyword(LU_KEYWORD_LIST + cfg.mbox); if (!p.pull(1, sum)) return "Pulling previous failed"; if (sum.size() >= 1) { prev = sum[0]; if ((ok = prev.load(db, conf)) != "") return ok; } return ""; } int handle_message(const Config& cfg, ESort::Reader* db, const string& param) { Request req = parse_request(param); cfg.options = req.options; if (!MessageId::is_full(req.options.c_str()) || req.options.length() != MessageId::full_len) error(_("Bad request"), param, _("The given parameter was not of the correct format. " "A message request must be formatted like: " "message/YYYYMMDD.HHMMSS.hashcode.lc.xml")); MessageId id(req.options.c_str()); pgp_config = &cfg; // hackish pgp_name_prefix = id.serialize(); string ok; Summary source(id); // Identical error if missing or forbidden (security) if ((ok = source.load(db, cfg)) != "" || !source.allowed()) { if (ok == "") ok = "not in a mailbox"; // fake error(_("Database message source pull failure"), ok, _("The specified message does not exist.")); } if (source.deleted()) error(_("Database message source pull failure"), "not found", _("The specified message has been deleted.")); Threading::Key spot; Threading thread; if ((ok = thread.load(db, source, spot)) != "" || (ok = thread.draw_snippet(db, spot, cfg)) != "") error(_("Database message tree load failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); Summary thread_prev; Summary thread_next; if ((ok = thread.findprev(spot, db, cfg, thread_prev)) != "" || (ok = thread.findnext(spot, db, cfg, thread_next)) != "") error(_("Thread prev/next load failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); DwMessage message; if ((ok = source.message(cfg.dbdir, message)) != "") error(_("MBox read failure"), ok, _("Unable to open message in the mailbox. " "Perhaps it has been deleted or moved?")); map followups; // these are all followups NOT in the tree if (message.Headers().HasMessageId()) { vector mids = extract_message_ids( message.Headers().MessageId().AsString().c_str()); vector sums; vector::iterator sum; vector::iterator mid; for (mid = mids.begin(); mid != mids.end(); ++mid) { // cout << "MID: " << *mid << "\n"; Search k(cfg, db, Forward); k.keyword(LU_KEYWORD_REPLY_TO + *mid); if (!k.pull(1000, sums)) break; } if (ok == "") for (sum = sums.begin(); sum != sums.end(); ++sum) { // cout << "SUM: " << *sum << "\n"; string hash = sum->id().hash(); if (thread.hasMessage(hash)) continue; if (followups.find(hash) != followups.end()) continue; followups[hash] = *sum; if ((ok = followups[hash].load(db, cfg)) != "") break; } } if (ok != "") error(_("Database followups load failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); map repliesTo; // what messages this one replies to if (message.Headers().HasInReplyTo()) { vector mids = extract_message_ids( message.Headers().InReplyTo().AsString().c_str()); vector sums; vector::iterator sum; vector::iterator mid; for (mid = mids.begin(); mid != mids.end(); ++mid) { Search k(cfg, db, Forward); k.keyword(LU_KEYWORD_MESSAGE_ID + *mid); if (!k.pull(1000, sums)) break; } if (ok == "") for (sum = sums.begin(); sum != sums.end(); ++sum) { string hash = sum->id().hash(); // only things not in the tree if (thread.hasMessage(hash)) continue; if (repliesTo.find(hash) != repliesTo.end()) continue; repliesTo[hash] = *sum; if ((ok = repliesTo[hash].load(db, cfg)) != "") break; } } if (ok != "") error(_("Database replies load failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); vector boxes; set::iterator mbox; for (mbox = source.mboxs().begin(); mbox != source.mboxs().end(); ++mbox) { Config::Lists::const_iterator j = cfg.lists.find(*mbox); if (j == cfg.lists.end()) continue; // impossible! if (!j->second.allowed) continue; boxes.push_back(MBox(j->second)); if ((ok = boxes.back().load(db, id, cfg)) != "") break; } if (ok != "") error(_("Database list links load failure"), ok, _("Something internal to the database failed. " "Please contact the lurker user mailing list for " "further assistence.")); Cache cache(cfg, "message", param, req.ext); cache.o << "\n" << "\n" << "\n" << " " << req.ext << "\n" << " " << cfg(req.language) << "\n" << " " << source << "\n"; vector::iterator m; for (m = boxes.begin(); m != boxes.end(); ++m) { cache.o << " \n" << " " << m->cfg(req.language) << "\n"; if (m->next.id().timestamp() != 0) cache.o << " " << m->next << "\n"; if (m->prev.id().timestamp() != 0) cache.o << " " << m->prev << "\n"; cache.o << " \n"; } // Find the charset for the overall message, if any. string charset; if (message.Headers().HasContentType()) { DwParameter* p = message.Headers().ContentType().FirstParameter(); while (p) { if (p->Attribute() == "charset") charset = p->Value().c_str(); p = p->Next(); } } // if (message.hasHeaders() && if (message.Headers().HasTo()) { cache.o << " "; message_format_address( cache.o, message.Headers().To().FirstAddress(), charset, cfg); cache.o << "\n"; } // if (message.hasHeaders() && if (message.Headers().HasCc()) { cache.o << " "; message_format_address( cache.o, message.Headers().Cc().FirstAddress(), charset, cfg); cache.o << "\n"; } // Output the snippet cache.o << " \n \n "; int head = -2; // magic, don't ask. thread.draw_snippet_row(cache.o, &head, 0, spot); cache.o << "\n "; thread.draw_snippet_row(cache.o, &head, 1, spot); cache.o << "\n "; thread.draw_snippet_row(cache.o, &head, 2, spot); cache.o << "\n"; // Output all summaries needed by the snippet Threading::Key i; for (i = 0; i < thread.size(); ++i) { Summary& sum = thread.getSummary(i); if (sum.loaded()) cache.o << " " << sum << "\n"; } cache.o << " \n"; if (thread_prev.id() != id) cache.o << " " << thread_prev << "\n"; if (thread_next.id() != id) cache.o << " " << thread_next << "\n"; if (!repliesTo.empty()) { cache.o << " \n"; map::iterator irt; for (irt = repliesTo.begin(); irt != repliesTo.end(); ++irt) cache.o << " " << irt->second << "\n"; cache.o << " \n"; } if (!followups.empty()) { cache.o << " \n"; map::iterator drift; for (drift = followups.begin(); drift != followups.end(); ++drift) cache.o << " " << drift->second << "\n"; cache.o << " \n"; } #if 0 // These are already included; don't print twice set replies = thread.replies(spot); if (!replies.empty()) { cache.o << " \n"; set::iterator rep; for (rep = replies.begin(); rep != replies.end(); ++rep) cache.o << " " << *rep << "\n"; cache.o << " \n"; } #endif cache.o << " \n"; if (message.Headers().HasMessageId()) { vector mids = extract_message_ids( message.Headers().MessageId().AsString().c_str()); if (mids.size() > 0) cache.o << " " << xmlEscape << mids[0] << "\n"; } long aid = 0; // default charset is ISO-8859-1 message_build(cache.o, message, "ISO-8859-1", true, aid, cfg); cache.o << "\n"; return 0; } lurker-2.3/render/parse.cpp0000644000175000017500000001076611267074431012717 00000000000000/* $Id: parse.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * parse.cpp - Deal with CGI ugliness * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include "parse.h" inline int fromHex(char c) { if (c >= 'A' && c <= 'Z') return c - 'A' + 10; if (c >= 'a' && c <= 'z') return c - 'a' + 10; if (c >= '0' && c <= '9') return c - '0'; return -1; } string decipherHalf(const string& str) { // cout << "deciper: " << str << endl; string out; int high, low; string::size_type b = 0, e; while ((e = str.find_first_of("%+", b)) != string::npos) { out.append(str, b, e - b); if (str[e] == '+') out.append(" "); else if (str.length() > e+2 && (high = fromHex(str[e+1])) != -1 && (low = fromHex(str[e+2])) != -1) { int ch = high << 4 | low; out += ((char)ch); e += 2; } else { // keep the broken escape char out.append("%"); } b = e+1; } out.append(str, b, string::npos); return out; } pair splitParam(const string& str) { // cout << "split: " << str << endl; string::size_type split = str.find('='); if (split == string::npos) return pair(decipherHalf(str), ""); else return pair( decipherHalf(str.substr(0, split)), decipherHalf(str.substr(split+1, string::npos))); } map getParams() { map out; const char* x = getenv("QUERY_STRING"); string str = x?x:""; // cout << "parse: " << str << endl; string::size_type b = str.find_first_not_of('&', 0), e; if (b == string::npos) return out; while ((e = str.find_first_of('&', b)) != string::npos) { out.insert(splitParam(str.substr(b, e - b))); b = str.find_first_not_of('&', e+1); if (b == string::npos) break; } if (b != string::npos) out.insert(splitParam(str.substr(b, str.length() - b))); return out; } map getCookies() { map out; const char* x = getenv("HTTP_COOKIE"); string str = x?x:""; // cout << "parse: " << str << endl; string::size_type b = str.find_first_not_of("; ", 0), e; if (b == string::npos) return out; while ((e = str.find_first_of("; ", b)) != string::npos) { out.insert(splitParam(str.substr(b, e - b))); b = str.find_first_not_of("; ", e+1); if (b == string::npos) break; } if (b != string::npos) out.insert(splitParam(str.substr(b, str.length() - b))); return out; } string uriEncode(const string& str) { string out; static const char tbl[17] = "0123456789ABCDEF"; string::size_type b = 0, e; while ((e = str.find_first_not_of( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~:/.,@-!", b)) != string::npos) { out.append(str, b, e - b); out += '%'; out += tbl[(str[e] >> 4) & 0xF]; out += tbl[(str[e] >> 0) & 0xF]; b = e+1; } out.append(str, b, str.length() - b); return out; } int redirectUrl(const string& url) { string proto(url, 0, 11); for (string::size_type i = 0; i < proto.length(); ++i) if (proto[i] >= 'A' && proto[i] <= 'Z') proto[i] += 'a' - 'A'; if (proto == "javascript:") { cout << "Status: 200 OK\r\n" << "Content-type: text/plain\r\n\r\n" << "Javascript go awaaayyyyyaaayyy! GO AWAY!\n"; } else { cout << "Status: 303 Moved Permanently\r\n" << "Location: " << uriEncode(url) << "\r\n" << "Content-type: text/html\r\n\r\n" << "\r\n" << "\r\n" << "301 Moved Permanently\r\n" << "\r\n" << "

Moved Permanently

\r\n" << "The document has moved here.\r\n" << "


\r\n" << "\r\n"; } return 0; } lurker-2.3/COPYING0000644000175000017500000004312711267070017010646 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. lurker-2.3/common/0000777000175000017500000000000011272633207011162 500000000000000lurker-2.3/common/Summary.h0000644000175000017500000000447111267074431012714 00000000000000/* $Id: Summary.h 1649 2009-10-19 14:35:01Z terpstra $ * * Summary.h - Helper which can load a message given MessageId * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SUMMARY_H #define SUMMARY_H #include #include "MessageId.h" #include "ConfigFile.h" #include #include // off_t #include class DwMessage; using std::set; using std::ostream; using namespace ESort; // Convert all linear white space into a single space string whitespace_sanitize(const string& x); class Summary { protected: MessageId id_; bool deleted_; bool allowed_; string author_email_; string author_name_; string subject_; string mbox_; off_t offset_; unsigned long length_; set mboxs_; public: Summary() { } Summary(const MessageId& id) : id_(id), deleted_(false), allowed_(true) { } string load(Reader* r, const Config& cfg); // "" is success bool loaded() const { return mbox_ != ""; } bool deleted() const { return deleted_; } bool allowed() const { return allowed_; } const MessageId& id() const { return id_; } const string& author_email() const { return author_email_; } const string& author_name () const { return author_name_; } const string& subject () const { return subject_; } const set& mboxs() const { return mboxs_; } string message(const string& dbdir, DwMessage& out) const; // "" is success bool operator < (const Summary& o) const { return id_ < o.id_; } }; ostream& operator << (ostream& o, const Summary& s); #endif lurker-2.3/common/ConfigFile.cpp0000644000175000017500000006105011267074431013613 00000000000000/* $Id: ConfigFile.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * ConfigFile.cpp - Knows how to load the config file * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "ConfigFile.h" #include "XmlEscape.h" #include "Summary.h" #include #include #include #ifdef HAVE_SYS_PARAM_H #include #endif #include #include #include #include #include #include #include using namespace std; #define ERROR error << file << ":" << c << ": " map* lstring::c = 0; lstring::lstring(const string& fallback) { s[""] = fallback; } string simplifyPath(string& path) { string error = ""; #ifdef HAVE_REALPATH char clean[PATH_MAX]; if (realpath(path.c_str(), clean) != 0) { path = clean; return ""; } else { // on linux, realpath files if the last part DNE string dir(path, 0, path.rfind('/')); string tag(path, dir.length(), string::npos); if (realpath(dir.c_str(), clean) != 0) { path = clean + tag; return ""; } } // realpath failed, report the problem path error = clean; // fall through with best attempt to clean it up anyways #endif // The least we can do is to trim trailing '/'s and simplify '//'s while (path.length() && path[path.length()-1] == '/') path.resize(path.length()-1); string::size_type x = 0; while ((x = path.find("//", x)) != string::npos) path.erase(x, 1); return error; } void lstring::prep_c() { c = new map(); // source: http://www.w3.org/WAI/ER/IG/ert/iso639.htm static const char* code[][2] = { {"abk", "ab"}, {"aar", "aa"}, {"afr", "af"}, {"alb", "sq"}, {"amh", "am"}, {"ara", "ar"}, {"arm", "hy"}, {"asm", "as"}, {"aym", "ay"}, {"aze", "az"}, {"bak", "ba"}, {"baq", "eu"}, {"ben", "bn"}, {"bih", "bh"}, {"bis", "bi"}, {"bre", "be"}, {"bul", "bg"}, {"bur", "my"}, {"bel", "be"}, {"cat", "ca"}, {"chi", "zh"}, {"cos", "co"}, {"ces", "cs"}, {"dan", "da"}, {"dut", "nl"}, {"dzo", "dz"}, {"eng", "en"}, {"epo", "eo"}, {"est", "et"}, {"fao", "fo"}, {"fij", "fj"}, {"fin", "fi"}, {"fra", "fr"}, {"fry", "fy"}, {"glg", "gl"}, {"geo", "ka"}, {"deu", "de"}, {"ell", "el"}, {"kal", "kl"}, {"grn", "gn"}, {"guj", "gu"}, {"hau", "ha"}, {"heb", "he"}, {"hin", "hi"}, {"hun", "hu"}, {"ice", "is"}, {"ind", "id"}, {"ina", "ia"}, {"iku", "iu"}, {"ipk", "ik"}, {"gai", "ga"}, {"ita", "it"}, {"jpn", "ja"}, {"jav", "jv"}, {"kan", "kn"}, {"kas", "ks"}, {"kaz", "kk"}, {"khm", "km"}, {"kin", "rw"}, {"kir", "ky"}, {"kor", "ko"}, {"kur", "ku"}, {"oci", "oc"}, {"lao", "lo"}, {"lat", "la"}, {"lav", "lv"}, {"lin", "ln"}, {"lit", "lt"}, {"mac", "mk"}, {"mlg", "mg"}, {"may", "ms"}, {"mlt", "ml"}, {"mao", "mi"}, {"mar", "mr"}, {"mol", "mo"}, {"mon", "mn"}, {"nau", "na"}, {"nep", "ne"}, {"nor", "no"}, {"ori", "or"}, {"orm", "om"}, {"pan", "pa"}, {"fas", "fa"}, {"pol", "pl"}, {"por", "pt"}, {"pus", "ps"}, {"que", "qu"}, {"roh", "rm"}, {"ron", "ro"}, {"run", "rn"}, {"rus", "ru"}, {"smo", "sm"}, {"sag", "sg"}, {"san", "sa"}, {"scr", "sh"}, {"sna", "sn"}, {"snd", "sd"}, {"sin", "si"}, {"ssw", "ss"}, {"slk", "sk"}, {"slv", "sl"}, {"som", "so"}, {"sot", "st"}, {"esl", "es"}, {"sun", "su"}, {"swa", "sw"}, {"sve", "sv"}, {"tgl", "tl"}, {"tgk", "tg"}, {"tam", "ta"}, {"tat", "tt"}, {"tel", "te"}, {"tha", "th"}, {"bod", "bo"}, {"tir", "ti"}, {"tog", "to"}, {"tso", "ts"}, {"tsn", "tn"}, {"tur", "tr"}, {"tuk", "tk"}, {"twi", "tw"}, {"uig", "ug"}, {"ukr", "uk"}, {"urd", "ur"}, {"uzb", "uz"}, {"vie", "vi"}, {"vol", "vo"}, {"cym", "cy"}, {"wol", "wo"}, {"xho", "xh"}, {"yid", "yi"}, {"yor", "yo"}, {"zha", "za"}, {"zul", "zu"}, {"sqi", "sq"}, {"hye", "hy"}, {"eus", "eu"}, {"mya", "my"}, {"zho", "zh"}, {"cze", "cs"}, {"nla", "nl"}, {"fre", "fr"}, {"kat", "ka"}, {"ger", "de"}, {"gre", "el"}, {"isl", "is"}, {"iri", "ga"}, {"jaw", "jv"}, {"mak", "mk"}, {"msa", "ms"}, {"mri", "mi"}, {"per", "fa"}, {"rum", "ro"}, {"slo", "sk"}, {"spa", "es"}, {"swe", "sv"}, {"tib", "bo"}, {"wel", "cy"}, // I think these are the same? {"jw", "jv"}, // ditto {"hr", "scc"}, {"sr", "scc"}, {"srp", "scc"}, {"", ""} }; for (unsigned int i = 0; code[i][0][0]; ++i) (*c)[code[i][0]] = code[i][1]; } bool lstring::lang_normalize(string& lang) { if (!c) prep_c(); if (lang.length() != 2 && lang.length() != 3) return false; // lower-case it: string iso(lang); for (string::size_type i = 0; i < iso.length(); ++i) { if (iso[i] >= 'A' && iso[i] <= 'Z') iso[i] = iso[i] - 'A' + 'a'; if (iso[i] < 'a' || iso[i] > 'z') return false; // not an ISO 639 code! } // Resolve different language spellings to one spelling if (c->find(iso) != c->end()) lang = (*c)[iso]; else lang = iso; return true; } bool lstring::locale_normalize(string& locale) { string::size_type i, e; if ((e = locale.find('-')) == string::npos && (e = locale.find('_')) == string::npos) e = locale.length(); string lang(locale, 0, e); if (!lang_normalize(lang)) return false; string region; if (e != locale.length()) { region.assign(locale, e+1, string::npos); if (region.length() != 2) return false; // not an ISO 3166 code for (i = 0; i < 2; ++i) { if (region[i] >= 'a' && region[i] <= 'z') region[i] = region[i] - 'a' + 'A'; if (region[i] < 'A' || region[i] > 'Z') return false; // not an ISO 3166 code! } locale = lang + "-" + region; } else { locale = lang; } return true; } bool lstring::translate(const string& language_, const string& translation) { string language(language_); if (language != "" && !locale_normalize(language)) return false; string::size_type i; // this overrides whatever we have got so far s[language] = translation; // maybe a localized string for which we lack a language setting? if ((i = language.find('-')) != string::npos) { string iso(language, 0, i); if (s.find(iso) == s.end()) translate(iso, translation); } // maybe we lack a fallback language completely if (s.find("") == s.end()) translate("", translation); return true; } string lstring::localize(const string& language_) const { string language(language_); if (language != "" && !locale_normalize(language)) return "(bug) bad locale"; map::const_iterator o; string::size_type i; // correct locale? use it if ((o = s.find(language)) != s.end()) return o->second; // correct language? use it if ((i = language.find('-')) != string::npos) { string iso(language, 0, i); if ((o = s.find(iso)) != s.end()) return o->second; } // fallback? use it if ((o = s.find("")) != s.end()) return o->second; return ""; // not set! } bool lstring::is_set() const { return !s.empty(); } Config::Config() : list(0), frontend(0), group(""), error(), lists(), groups(), file(""), dbdir(""), db_umask(-1), xslt("cat -"), delete_message(""), pgpv_mime("off"), pgpv_inline("off"), admin_address(""), archive("Unconfigured Archivew"), admin_name("Unset admin name"), web_cache(true), hide_email(false), raw_email(true), modified(0) { } void prune_back(string& line) { // Trim off eol and whitespace string::size_type whitespace = line.length(); while (whitespace > 0 && (line[whitespace-1] == ' ' || line[whitespace-1] == '\r' || line[whitespace-1] == '\n' || line[whitespace-1] == '\t')) whitespace--; line.resize(whitespace); } string::size_type skip_front(const string& line, string::size_type x = 0) { // Trim off eol and whitespace for (; x < line.length(); ++x) if (line[x] != ' ' && line[x] != '\r' && line[x] != '\n' && line[x] != '\t') break; return x; } int Config::load(const string& file, bool toplevel) { ifstream f(file.c_str()); if (!f.is_open()) { error << file << ":open: could not open!" << endl; return -1; } struct stat sbuf; if (stat(file.c_str(), &sbuf) < 0) { error << file << ":stat: could not stat!" << endl; return -1; } // deal with included file's timestamps if (sbuf.st_mtime > modified) modified = sbuf.st_mtime; string dir; string::size_type x = file.rfind('/'); if (x != string::npos) dir.assign(file, 0, x+1); string line; bool ok = true; int c = 0; string val, key; while (getline(f, line)) { // Increment line number ++c; // Trim off the comments string::size_type comment = line.find('#'); if (comment != string::npos) line.resize(comment); // Clear off trailing whitespace prune_back(line); // skip empty lines if (line.length() == 0) continue; string::size_type eq = line.find('='); if (eq == string::npos) { // this line continues the previous one. if (key == "") { ERROR << "No key for value '" << line << "'!" << endl; ok = false; } else { string::size_type fe = skip_front(line); val.append(" "); val.append(line, fe, string::npos); } } else { if (key != "" && process_command(file, c, key, val, dir) != 0) ok = false; string::size_type leadin = skip_front(line); key.assign(line, leadin, eq-leadin); val.assign(line, skip_front(line, eq+1), string::npos); prune_back(key); } } if (toplevel && key == "") { error << file << ":eof: No values set!" << endl; ok = false; } if (key != "" && process_command(file, c, key, val, dir) != 0) ok = false; if (toplevel) { // do some consistency checks // language field is required Lists::const_iterator i, e; for (i = lists.begin(), e = lists.end(); i != e; ++i) { if (i->second.languages.empty()) { error << file << ":eof: List '" << i->first << "' has no language!" << endl; return -1; } } // cache directories may not be prefixes Frontends::const_iterator fi, fn, fe; fe = frontends.end(); fi = frontends.begin(); fn = fi; if (fi != fe) while (1) { ++fn; if (fn == fe) break; if (fi->first + "/" == fn->first.substr(0, fi->first.length()+1)) { error << file << ":eof: Frontend '" << fi->first << "' is a prefix of '" << fn->first << "', which is forbidden!" << endl; return -1; } fi = fn; } this->file = file; } if (!ok) return -1; return 0; } bool isSimple(const string& s) { string::size_type x; for (x = 0; x < s.length(); ++x) { char y = s[x]; if (y >= 'a' && y <= 'z') continue; if (y >= '0' && y <= '9') continue; if (y == '.' || y == '-' || y == '_') continue; return false; } return true; } int Config::process_command(const string& file, int c, const string& keys, const string& val, const string& dir) { // cout << key << "-" << val << endl; string lc; // locale code string key(keys); string::size_type o, d; if ((o = key.find('[')) != string::npos && (d = key.find(']')) != string::npos && d > o) { // localization option lc.assign(key, o+1, (d-o) - 1); key.erase(o, (d-o) + 1); if (!lstring::locale_normalize(lc)) { ERROR << "Localization code '" << lc << "' is not valid." << endl; return -1; } } string::size_type len = string::npos; if (key == "group") { len = 128; if (!isSimple(val) || val.length() == 0) { ERROR << "Group id '" << val << "' is not a simple lowercase string!" << endl; return -1; } if (lc != "") { ERROR << "group id cannot be localized" << endl; return -1; } if (groups.find(val) != groups.end()) { ERROR << "Group id '" << val << "' already exists!" << endl; return -1; } group = val; groups[group]; // make sure it exists } else if (key == "heading") { len = 180; groups[group].heading.translate(lc, val); } else if (key == "list") { if (group == "") { ERROR << "List id '" << val << "' is not a member of any group!" << endl; return -1; } len = 128; if (!isSimple(val) || val.length() == 0) { ERROR << "List id '" << val << "' is not a simple lowercase string!" << endl; return -1; } if (lc != "") { ERROR << "list id cannot be localized" << endl; return -1; } if (lists.find(val) == lists.end()) { groups[group].members.insert(val); list = &lists[val]; list->mbox = val; list->group = group; list->offline = false; } else { ERROR << "List id '" << val << "' already exists!" << endl; return -1; } } else if (key == "title") { len = 180; if (!list) { ERROR << "No list has been defined for title '" << val << "'!" << endl; return -1; } list->title.translate(lc, val); } else if (key == "address") { if (!list) { ERROR << "No list has been defined for address '" << val << "'!" << endl; return -1; } if (lc != "") { ERROR << "list address cannot be localized" << endl; return -1; } list->address = val; } else if (key == "link") { if (!list) { ERROR << "No list has been defined for address '" << val << "'!" << endl; return -1; } list->link.translate(lc, val); } else if (key == "language") { if (!list) { ERROR << "No list has been defined for language '" << val << "'!" << endl; return -1; } if (lc != "") { ERROR << "list language cannot be localized" << endl; return -1; } string lval(val); if (!lstring::lang_normalize(lval)) { ERROR << "Language '" << val << "' is not an ISO 639 language code!" << endl; error << "Regional variants are not relevant for searches." << endl; return -1; } list->languages.insert(lval); } else if (key == "offline") { if (!list) { ERROR << "No list has been defined for offline setting '" << val << "'!" << endl; return -1; } if (lc != "") { ERROR << "list offline cannot be localized" << endl; return -1; } if (val == "off" || val == "false") list->offline = false; else if (val == "on" || val == "true") list->offline = true; else { ERROR << "offline must be set to on/off or true/false!" << endl; return -1; } } else if (key == "description") { if (!list) { ERROR << "No list has been defined for address '" << val << "'!" << endl; return -1; } list->description.translate(lc, val); } else if (key == "frontend") { len = 10240; // Long paths are ... ok if (lc != "") { ERROR << "frontend path '" << val << "' cannot be localized" << endl; return -1; } if (val.length() == 0 || val[0] != '/') { ERROR << "frontend path is not absolute '" << val << "' (must start with a '/')!" << endl; return -1; } // Cleanup the path, but ignore any problems with the path string sval(val); simplifyPath(sval); if (frontends.find(sval) == frontends.end()) { frontend = &frontends[sval]; // Inherit global values frontend->admin_name = admin_name; frontend->admin_address = admin_address; frontend->archive = archive; frontend->hide_email = hide_email; frontend->raw_email = raw_email; frontend->web_cache = web_cache; } else { ERROR << "Frontend '" << val << "' already exists!" << endl; return -1; } } else if (key == "allow_list") { if (frontend == 0) { ERROR << "No frontend defined for allow_list = '" << val << "'" << endl; return -1; } if (lists.find(val) == lists.end()) { ERROR << "List '" << val << "' does not exist for allow_list" << endl; return -1; } Frontend::Entry e; e.perm = Frontend::ALLOW; e.what = Frontend::LIST; e.key = val; frontend->entries.push_back(e); } else if (key == "deny_list") { if (frontend == 0) { ERROR << "No frontend defined for deny_list = '" << val << "'" << endl; return -1; } if (lists.find(val) == lists.end()) { ERROR << "List '" << val << "' does not exist for deny_list" << endl; return -1; } Frontend::Entry e; e.perm = Frontend::DENY; e.what = Frontend::LIST; e.key = val; frontend->entries.push_back(e); } else if (key == "allow_group") { if (frontend == 0) { ERROR << "No frontend defined for allow_group = '" << val << "'" << endl; return -1; } if (groups.find(val) == groups.end()) { ERROR << "Group '" << val << "' does not exist for allow_group" << endl; return -1; } Frontend::Entry e; e.perm = Frontend::ALLOW; e.what = Frontend::GROUP; e.key = val; frontend->entries.push_back(e); } else if (key == "deny_group") { if (frontend == 0) { ERROR << "No frontend defined for deny_group = '" << val << "'" << endl; return -1; } if (groups.find(val) == groups.end()) { ERROR << "Group '" << val << "' does not exist for deny_group" << endl; return -1; } Frontend::Entry e; e.perm = Frontend::DENY; e.what = Frontend::GROUP; e.key = val; frontend->entries.push_back(e); } else if (key == "dbdir") { if (lc != "") { ERROR << "dbdir cannot be localized" << endl; return -1; } if (val[0] == '/') dbdir = val; else dbdir = dir + val; } else if (key == "db_umask") { if (lc != "") { ERROR << "db_umask cannot be localized" << endl; return -1; } char* e; db_umask = strtol(val.c_str(), &e, 8); if (val.length() == 0 || *e != 0) { ERROR << "db_mask must be given an octal number, not '" << val << "'" << endl; return -1; } } else if (key == "admin_name") { if (frontend == 0) admin_name.translate(lc, val); else frontend->admin_name.translate(lc, val); } else if (key == "admin_address") { if (lc != "") { ERROR << "admin_address cannot be localized" << endl; return -1; } if (frontend == 0) admin_address = val; else frontend->admin_address = val; } else if (key == "archive") { if (frontend == 0) archive.translate(lc, val); else frontend->archive.translate(lc, val); } else if (key == "xslt") { if (lc != "") { ERROR << "xslt command cannot be localized" << endl; return -1; } xslt = val; } else if (key == "delete_message") { if (lc != "") { ERROR << "delete_message command cannot be localized" << endl; return -1; } delete_message = val; } else if (key == "pgp_verify_mime") { if (lc != "") { ERROR << "pgp_verify_mime command cannot be localized" << endl; return -1; } pgpv_mime = val; } else if (key == "pgp_verify_inline") { if (lc != "") { ERROR << "pgp_verify_inline command cannot be localized" << endl; return -1; } pgpv_inline = val; } else if (key == "web_cache") { if (lc != "") { ERROR << "web_cache cannot be localized" << endl; return -1; } bool newval; if (val == "off" || val == "false") newval = false; else if (val == "on" || val == "true") newval = true; else { ERROR << "web_cache must be set to on/off or true/false!" << endl; return -1; } if (frontend == 0) web_cache = newval; else frontend->web_cache = newval; } else if (key == "hide_email") { if (lc != "") { ERROR << "hide_email cannot be localized" << endl; return -1; } bool newval; if (val == "off" || val == "false") newval = false; else if (val == "on" || val == "true") newval = true; else { ERROR << "hide_email must be set to on/off or true/false!" << endl; return -1; } if (frontend == 0) hide_email = newval; else frontend->hide_email = newval; } else if (key == "raw_email") { if (lc != "") { ERROR << "raw_email cannot be localized" << endl; return -1; } bool newval; if (val == "off" || val == "false") newval = false; else if (val == "on" || val == "true") newval = true; else { ERROR << "raw_email must be set to on/off or true/false!" << endl; return -1; } if (frontend == 0) raw_email = newval; else frontend->raw_email = newval; } else if (key == "include") { if (lc != "") { ERROR << "include cannot be localized" << endl; return -1; } string file; if (val[0] == '/') file = val; else file = dir + val; DIR* d = opendir(file.c_str()); if (d) { struct dirent* e; struct stat s; vector paths; while ((e = readdir(d)) != 0) { int len = strlen(e->d_name); if (e->d_name[0] == '.') continue; if (len <= 5) continue; if (strcmp(".conf", &e->d_name[len-5])) continue; string path = file + '/' + e->d_name; if (stat(path.c_str(), &s) != 0) continue; if (!S_ISREG(s.st_mode)) continue; paths.push_back(path); } closedir(d); // Include them in sorted order sort(paths.begin(), paths.end()); for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { if (load(*i, false) != 0) return -1; } } else { if (load(file, false) != 0) return -1; } } else { ERROR << "Unknown configuration directive '" << key << "'!" << endl; return -1; } if (val.length() > len) { ERROR << "Value '" << val << "' is too long for directive '" << key << "'!" << endl; return -1; } return 0; } ostream& operator << (ostream& o, const List::SerializeMagic& lm) { const List& m = lm.m; const string& l = lm.l; o << "" << "" << m.mbox << "" << "" << m.group << ""; set::const_iterator i, e; for (i = m.languages.begin(), e = m.languages.end(); i != e; ++i) o << "" << *i << ""; if (m.offline) o << ""; if (m.link.is_set()) o << "" << xmlEscape << m.link(l) << ""; if (m.description.is_set()) o << "" << xmlEscape << m.description(l) << ""; o << " 0) o << " address=\"" << xmlEscape << m.address << "\""; if (m.title.is_set()) o << " name=\"" << xmlEscape << whitespace_sanitize(m.title(l)) << "\""; else o << " name=\"" << m.mbox << "\""; o << "/>"; return o; } ostream& operator << (ostream& o, const Config::SerializeMagic& cm) { const Config& c = cm.c; const string& l = cm.l; // expire = time(0) + 60*5; // 5 minute cache // // tm = gmtime(&expire); // strftime(&timebuf[0], sizeof(timebuf), // "%a, %d %b %Y %H:%M:%S GMT", tm); char year[40]; time_t end_of_archive = time(0) + 365*24*60*60; strftime(&year[0], sizeof(year), "%Y", gmtime(&end_of_archive)); o << "" << "" << VERSION << "" << "" << year << "" << "" << xmlEscape << c.docUrl << "" << "" << xmlEscape << c.cgiUrl << "" << "" << c.command << "" << "" << xmlEscape << c.options << ""; if (c.raw_email) o << ""; o << ""; if (c.archive.is_set()) o << xmlEscape << c.archive(l); else o << "Some Mailing List Archive"; o << " 0) o << " address=\"" << xmlEscape << c.admin_address << "\""; if (c.admin_name.is_set()) o << " name=\"" << xmlEscape << whitespace_sanitize(c.admin_name(l)) << "\""; o << "/>"; return o; } void Config::set_permissions(const Frontend& f) { vector::const_iterator ei, es = f.entries.begin(), ee = f.entries.end(); Lists::iterator li, ls = lists.begin(), le = lists.end(); // Empty list or first entry deny means default to allow bool def = (es == ee) || (es->perm == Frontend::DENY); for (li = ls; li != le; ++li) li->second.allowed = def; // Walk each entry toggling permissions as we go for (ei = es; ei != ee; ++ei) { bool allowed = (ei->perm == Frontend::ALLOW); if (ei->what == Frontend::LIST) { lists[ei->key].allowed = allowed; } else { // group Members::const_iterator mi, ms = groups[ei->key].members.begin(), me = groups[ei->key].members.end(); for (mi = ms; mi != me; ++mi) { lists[*mi].allowed = allowed; } } } // Take the specific settings for the globals archive = f.archive; admin_name = f.admin_name; admin_address = f.admin_address; hide_email = f.hide_email; raw_email = f.raw_email; web_cache = f.web_cache; } lurker-2.3/common/Makefile.in0000644000175000017500000003204711272632670013154 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = common DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libcommon_a_AR = $(AR) $(ARFLAGS) libcommon_a_LIBADD = am_libcommon_a_OBJECTS = md5.$(OBJEXT) Thread.$(OBJEXT) Keys.$(OBJEXT) \ CharsetEscape.$(OBJEXT) ConfigFile.$(OBJEXT) \ MessageId.$(OBJEXT) XmlEscape.$(OBJEXT) Search.$(OBJEXT) \ Summary.$(OBJEXT) libcommon_a_OBJECTS = $(am_libcommon_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/tools/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libcommon_a_SOURCES) DIST_SOURCES = $(libcommon_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/libesort noinst_LIBRARIES = libcommon.a libcommon_a_SOURCES = \ md5.cpp Thread.cpp Keys.cpp CharsetEscape.cpp ConfigFile.cpp \ MessageId.cpp XmlEscape.cpp Search.cpp Summary.cpp \ CharsetEscape.h ConfigFile.h Keys.h MessageId.h XmlEscape.h md5.h \ Search.h Summary.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libcommon.a: $(libcommon_a_OBJECTS) $(libcommon_a_DEPENDENCIES) -rm -f libcommon.a $(libcommon_a_AR) libcommon.a $(libcommon_a_OBJECTS) $(libcommon_a_LIBADD) $(RANLIB) libcommon.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CharsetEscape.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConfigFile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Keys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MessageId.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Search.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Summary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XmlEscape.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/common/XmlEscape.h0000644000175000017500000000271011267074431013132 00000000000000/* $Id: XmlEscape.h 1649 2009-10-19 14:35:01Z terpstra $ * * XmlEscape.h - A stream manipulator-like thing for escaping XML * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef XML_ESCAPE_H #define XML_ESCAPE_H #include #include using std::ostream; using std::string; // The empty type used to trigger our code. extern struct XmlEscape { } xmlEscape; class XmlOstream { protected: ostream& o; public: XmlOstream(ostream& o_) : o(o_) { } ostream& operator << (const string& s); ostream& operator << (const char* s); ostream& operator << (char c); }; inline XmlOstream operator << (ostream& o, const XmlEscape& e) { return XmlOstream(o); } #endif lurker-2.3/common/MessageId.h0000644000175000017500000001231711267074431013116 00000000000000/* $Id: MessageId.h 1649 2009-10-19 14:35:01Z terpstra $ * * MessageId.h - Helper class for manipulating internal message ids * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef MESSAGE_ID_H #define MESSAGE_ID_H #include #include using std::string; /** This class calculates lurker internal message ids. * It can save them to appropriate format, and parse them. */ class MessageId { protected: unsigned char time_[4]; unsigned char hash_[4]; public: /** Create a lurker message-id; you have to find the hash. */ MessageId(time_t date, const unsigned char* hash) { time_[3] = (date & 0xFF); date >>= 8; time_[2] = (date & 0xFF); date >>= 8; time_[1] = (date & 0xFF); date >>= 8; time_[0] = (date & 0xFF); hash_[0] = hash[0]; hash_[1] = hash[1]; hash_[2] = hash[2]; hash_[3] = hash[3]; } /** Create a MessageId for the purposes of seeking. * The hash component will be zero. */ MessageId(time_t date = 0) { time_[3] = (date & 0xFF); date >>= 8; time_[2] = (date & 0xFF); date >>= 8; time_[1] = (date & 0xFF); date >>= 8; time_[0] = (date & 0xFF); hash_[0] = hash_[1] = hash_[2] = hash_[3] = 0; } /** Create the MessageId from raw form. * The int arg is to disambiguate from the pretty constructor */ MessageId(const char* str, int) { time_[0] = *str; ++str; time_[1] = *str; ++str; time_[2] = *str; ++str; time_[3] = *str; ++str; hash_[0] = *str; ++str; hash_[1] = *str; ++str; hash_[2] = *str; ++str; hash_[3] = *str; } /** Create a MessageId from the pretty serialized form. */ MessageId(const char* str); /** Extract the message timestamp. */ time_t timestamp() const { time_t out; out = time_[0]; out <<= 8; out |= time_[1]; out <<= 8; out |= time_[2]; out <<= 8; out |= time_[3]; return out; } /** Retrieve the hash for use in threading. */ string hash() const { return string((const char*)hash_, 4); } /** Serialize the message-id for forward seeking. */ string raw() const { unsigned char tmp[8]; tmp[0] = time_[0]; tmp[1] = time_[1]; tmp[2] = time_[2]; tmp[3] = time_[3]; tmp[4] = hash_[0]; tmp[5] = hash_[1]; tmp[6] = hash_[2]; tmp[7] = hash_[3]; return string((const char*)tmp, 8); } /** Serialize it pretty for the user interface. */ string serialize() const; /** Slightly increase the MessageId. There can not exist any * messages between the old value and the new. * Returns true if the counter rolled over. */ bool increment() { return ++hash_[3] == 0 && ++hash_[2] == 0 && ++hash_[1] == 0 && ++hash_[0] == 0 && ++time_[3] == 0 && ++time_[2] == 0 && ++time_[1] == 0 && ++time_[0] == 0; } bool decrement() { return --hash_[3] == 0xFF && --hash_[2] == 0xFF && --hash_[1] == 0xFF && --hash_[0] == 0xFF && --time_[3] == 0xFF && --time_[2] == 0xFF && --time_[1] == 0xFF && --time_[0] == 0xFF; } /** Is the message id the same as another message? */ bool operator == (const MessageId& o) const { return hash_[0] == o.hash_[0] && hash_[1] == o.hash_[1] && hash_[2] == o.hash_[2] && hash_[3] == o.hash_[3] && time_[0] == o.time_[0] && time_[1] == o.time_[1] && time_[2] == o.time_[2] && time_[3] == o.time_[3]; } /** Is the message id the earlier than another message? */ bool operator < (const MessageId& o) const { return (time_[0] < o.time_[0] || (time_[0] == o.time_[0] && (time_[1] < o.time_[1] || (time_[1] == o.time_[1] && (time_[2] < o.time_[2] || (time_[2] == o.time_[2] && (time_[3] < o.time_[3] || (time_[3] == o.time_[3] && (hash_[0] < o.hash_[0] || (hash_[0] == o.hash_[0] && (hash_[1] < o.hash_[1] || (hash_[1] == o.hash_[1] && (hash_[2] < o.hash_[2] || (hash_[2] == o.hash_[2] && (hash_[3] < o.hash_[3] ) )) )) )) )) )) )) )); // return raw() < o.raw(); } bool operator != (const MessageId& o) const { return !(*this == o); } bool operator > (const MessageId& o) const { return o < *this; } bool operator >= (const MessageId& o) const { return !(*this < o); } bool operator <= (const MessageId& o) const { return !(o < *this); } static const unsigned int time_len; // 15 static const unsigned int full_len; // 24 static const unsigned int raw_len; // 8 static bool is_time(const char* s); static bool is_full(const char* s); }; #endif lurker-2.3/common/CharsetEscape.cpp0000644000175000017500000001162211267074431014320 00000000000000/* $Id: CharsetEscape.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * CharsetEscape.cpp - A stream manipulator-like thing for charset conversion * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #if __GNUC__ == 2 #include #else #include #endif #include "CharsetEscape.h" CharsetEscape::CharsetEscape(const char* charset) : ic(iconv_open("UTF-8", charset)) { } CharsetEscape::~CharsetEscape() { if (valid()) iconv_close(ic); } void iconv_bug_kill_nulls(char* ob, size_t is) { while (is != 0) { if (*ob == '\0') *ob = '?'; ++ob; --is; } } void CharsetEscape::write(ostream& o, const char* ib, size_t is) { if (!valid()) { // when not valid, just keep ascii chars while (1) { const char* s; const char* e; for (s = ib, e = s + is; s != e; ++s) { // if it moves, kill it! if ((*s < 0x20 || *s >= 0x7f) && (*s != '\n' && *s != '\t')) { break; } } // write out what we have if (s != ib) o.write(ib, long(s - ib)); is -= long(s - ib); ib = s; if (!is) return; // skip the offensive byte ++ib; --is; o << '?'; } } char buf[8096]; char* ob = &buf[0]; size_t os = sizeof(buf); // We forcibly type-cast iconv b/c it has different types on some // platforms, but the difference is only in the const. while (((size_t (*)(iconv_t, const char **, size_t*, char**, size_t*))&iconv) (ic, &ib, &is, &ob, &os) == (size_t)-1) { if (errno == EILSEQ) { // Output some stuff iconv_bug_kill_nulls(buf, sizeof(buf) - os); o.write(buf, sizeof(buf) - os); ob = &buf[0]; os = sizeof(buf); // skip a broken byte ++ib; --is; o << "?"; } else if (errno == EINVAL) { // Incomplete data break; } else { // E2BIG iconv_bug_kill_nulls(buf, sizeof(buf) - os); o.write(buf, sizeof(buf) - os); ob = &buf[0]; os = sizeof(buf); } } // success, write out tail. iconv_bug_kill_nulls(buf, sizeof(buf) - os); o.write(buf, sizeof(buf) - os); } string CharsetEscape::write(const char* ib, size_t is) { #if __GNUC__ == 2 strstream out; #else std::stringstream out; #endif write(out, ib, is); #if __GNUC__ == 2 char* tmpstr = out.str(); string ret(tmpstr, out.rdbuf()->pcount()); free(tmpstr); return ret; #else return out.str(); #endif } // Transform any =?charset?encoding?str?= stuff in the string to utf-8 string decode_header( const string& str, const char* default_coding) { #if __GNUC__ == 2 strstream out; #else std::stringstream out; #endif CharsetEscape code(default_coding); bool sawCodeWord = false; string::size_type b = 0, c, e, s, n; while ((c = str.find("=?", b)) != string::npos) { if ((e = str.find('?', c+2)) != string::npos && (s = str.find('?', e+1)) != string::npos && s == e + 2 && (n = str.find("?=", s+1)) != string::npos && str.find_first_of(" \t", c) > b) { // valid escape if (!sawCodeWord || // guaranteed not npos: (c has = ) str.find_first_not_of(" \r\n\t", b) < c) { code.write(out, str.c_str() + b, c - b); } sawCodeWord = true; c += 2; string charset(str, c, e - c); char encoding = str[e+1]; s += 1; DwString in(str.c_str() + s, n-s); DwString decode; b = n+2; if (encoding == 'Q' || encoding == 'q') { // Convert also all '_' to ' ' size_t x = 0; while ((x = in.find_first_of("_", x)) != DwString::npos) { in[x] = ' '; ++x; } DwDecodeQuotedPrintable(in, decode); } else if (encoding == 'B' || encoding == 'b') { DwDecodeBase64(in, decode); } else { decode = "<--corrupt-->"; } CharsetEscape subcode(charset.c_str()); subcode.write(out, decode.c_str(), decode.length()); } else { // not valid escape code.write(out, str.c_str() + b, c+2 - b); b = c+2; sawCodeWord = false; } } code.write(out, str.c_str() + b, str.length() - b); #if __GNUC__ == 2 char* tmpstr = out.str(); string ret(tmpstr, out.rdbuf()->pcount()); free(tmpstr); return ret; #else return out.str(); #endif } lurker-2.3/common/XmlEscape.cpp0000644000175000017500000000467711267074431013503 00000000000000/* $Id: XmlEscape.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * XmlEscape.cpp - A stream manipulator-like thing for escaping XML * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "XmlEscape.h" #include XmlEscape xmlEscape; ostream& XmlOstream::operator << (char c) { if (c >= 0 && c <= 0x1f) { switch (c) { case '\n': return o << "\n
"; case '\t': return o << ""; case '\r': return o; default: return o << "?"; // drop the char } } else { switch (c) { case '\'': return o << "'"; case '<': return o << "<"; case '>': return o << ">"; case '"': return o << """; case '&': return o << "&"; default: return o << c; // leave it alone // this case includes high-ascii utf-8 } } } string::size_type find_first_offensive_byte(const char* s, const char* e) { const char* b = s; while (s != e) { char x = *s; if (x >= 0 && x <= 0x1f) { // control char in utf-8 eh? return s - b; } else { switch (x) { case '\'': case '<': case '>': case '"': case '&': // xml doesn't like these dudes return s - b; } } ++s; } return s - b; // the eos } ostream& XmlOstream::operator << (const string& s) { string::size_type b = 0, e = s.length(); while (1) { string::size_type x = find_first_offensive_byte( s.c_str() + b, s.c_str() + e) + b; o.write(s.c_str() + b, x - b); if (x == e) return o; *this << s[x]; b = x+1; } } ostream& XmlOstream::operator << (const char* s) { while (1) { string::size_type x = find_first_offensive_byte(s, 0); o.write(s, x); s += x; if (!*s) return o; *this << *s; ++s; } } lurker-2.3/common/Makefile.am0000644000175000017500000000045711267070016013135 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/libesort noinst_LIBRARIES = libcommon.a libcommon_a_SOURCES = \ md5.cpp Thread.cpp Keys.cpp CharsetEscape.cpp ConfigFile.cpp \ MessageId.cpp XmlEscape.cpp Search.cpp Summary.cpp \ CharsetEscape.h ConfigFile.h Keys.h MessageId.h XmlEscape.h md5.h \ Search.h Summary.h lurker-2.3/common/md5.cpp0000644000175000017500000002030111267070016012260 00000000000000/* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. * * Changed so as no longer to depend on Colin Plumb's `usual.h' header * definitions; now uses stuff from dpkg's config.h. * - Ian Jackson . * Still in the public domain. * * This copy has been re-released as GPL by * Wesley W. Terpstra * for inclusion in the lurker project. It is now c++ code without autoconf. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #define _FILE_OFFSET_BITS 64 #include "md5.h" #include /* for memcpy() */ void doByteSwap(UWORD32 *buf, unsigned words) { md5byte *p = (md5byte *)buf; do { *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 | ((unsigned)p[1] << 8 | p[0]); p += 4; } while (--words); } bool doSwap = false; #define byteSwap(buf,words) if (doSwap) doByteSwap(buf, words) /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(struct MD5Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bytes[0] = 0; ctx->bytes[1] = 0; unsigned long x = 4; if (*((unsigned char*)&x) != 4) doSwap = true; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) { UWORD32 t; /* Update byte count */ t = ctx->bytes[0]; if ((ctx->bytes[0] = t + len) < t) ctx->bytes[1]++; /* Carry from low to high */ t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ if (t > len) { memcpy((md5byte *)ctx->in + 64 - t, buf, len); return; } /* First chunk is an odd size */ memcpy((md5byte *)ctx->in + 64 - t, buf, t); byteSwap(ctx->in, 16); MD5Transform(ctx->buf, ctx->in); buf += t; len -= t; /* Process data in 64-byte chunks */ while (len >= 64) { memcpy(ctx->in, buf, 64); byteSwap(ctx->in, 16); MD5Transform(ctx->buf, ctx->in); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memcpy(ctx->in, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void MD5Final(md5byte digest[16], struct MD5Context *ctx) { int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ md5byte *p = (md5byte *)ctx->in + count; /* Set the first char of padding to 0x80. There is always room. */ *p++ = 0x80; /* Bytes of padding needed to make 56 bytes (-8..55) */ count = 56 - 1 - count; if (count < 0) { /* Padding forces an extra block */ memset(p, 0, count + 8); byteSwap(ctx->in, 16); MD5Transform(ctx->buf, ctx->in); p = (md5byte *)ctx->in; count = 56; } memset(p, 0, count); byteSwap(ctx->in, 14); /* Append length in bits and transform */ ctx->in[14] = ctx->bytes[0] << 3; ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; MD5Transform(ctx->buf, ctx->in); byteSwap(ctx->buf, 4); memcpy(digest, ctx->buf, 16); memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ } /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f,w,x,y,z,in,s) \ (w += f(x,y,z) + in, w = (w<>(32-s)) + x) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ void MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) { register UWORD32 a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } lurker-2.3/common/Search.h0000644000175000017500000000273411267074431012464 00000000000000/* $Id: Search.h 1649 2009-10-19 14:35:01Z terpstra $ * * Search.h - Helper which can intersect keywords * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SEARCH_H #define SEACH_H #include #include #include "Summary.h" using namespace ESort; struct Criterea { Reader* db; MessageId source; Direction dir; }; class AndSearcher; class Config; class Search { protected: const Config& cfg; Criterea criterea; AndSearcher* root; bool need_any; public: Search(const Config& cfg_, Reader* db_, Direction dir_, const MessageId& id_ = MessageId(), bool skipdel = true); ~Search(); void keyword(const string& s); bool pull(int n, std::vector
& o); }; #endif lurker-2.3/common/ConfigFile.h0000644000175000017500000001151111267074431013255 00000000000000/* $Id: ConfigFile.h 1649 2009-10-19 14:35:01Z terpstra $ * * ConfigFile.h - Knows how to load the config file * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CONFIG_H #define CONFIG_H #include #include #include #include #include #if __GNUC__ == 2 #include #else #include #endif // get VERSION #include "../config.h" using std::string; using std::map; using std::set; using std::ostream; using std::vector; // simplify a path by removing trailing '/'s and duplicate '/'s string simplifyPath(string& path); // localized string class lstring { protected: map s; static map* c; // conversion from one spelling to common static void prep_c(); public: lstring(const string& fb); lstring() { } // If the locale is funky, returns false bool translate(const string& locale, const string& translation); string localize(const string& locale) const; string operator () (const string& locale) const { return localize(locale); } bool is_set() const; // normalize the language to a common spelling - false if broken static bool lang_normalize(string& lang); static bool locale_normalize(string& locale); }; struct List { // filenames and addresses are not localized, nor are identifiers string mbox; string address; string group; set languages; bool offline; bool allowed; // Set to true if the config file enabled this list // localize these lstring title; // could make sense in some cases lstring description; // clearly should be translated lstring link; // different language on different pages struct SerializeMagic { const List& m; string l; SerializeMagic(const List& m_, const string& l_) : m(m_), l(l_) { } }; SerializeMagic operator () (const string& locale) const { return SerializeMagic(*this, locale); } }; struct Frontend { enum Perm { ALLOW, DENY }; enum What { GROUP, LIST }; struct Entry { Perm perm; What what; string key; }; vector entries; lstring archive; lstring admin_name; string admin_address; bool hide_email; bool raw_email; bool web_cache; }; class Config { private: List* list; Frontend* frontend; string group; #if __GNUC__ == 2 strstream error; #else std::stringstream error; #endif public: typedef map Lists; typedef set Members; struct GroupData { lstring heading; Members members; }; typedef map Groups; typedef map Frontends; Lists lists; Groups groups; Frontends frontends; string file; // the name of this config file // never localize paths, commands, or addresses string dbdir; int db_umask; string xslt; string delete_message; string pgpv_mime; string pgpv_inline; string admin_address; // some names are spelt differently by locales lstring archive; lstring admin_name; bool web_cache; bool hide_email; bool raw_email; time_t modified; // the timestamp of modification for the config file // parameters specific for rendering string docUrl; string cgiUrl; string command; mutable string options; // get the error string string getError() { #if __GNUC__ == 2 string out(error.str(), error.rdbuf()->pcount()); return out; #else return error.str(); #endif } Config(); // Open the config from this file. int load(const string& file, bool toplevel = true); int process_command(const string& file, int c, const string& key, const string& val, const string& dir); // Set the allowed flag on lists void set_permissions(const Frontend& f); struct SerializeMagic { const Config& c; string l; SerializeMagic(const Config& c_, const string& l_) : c(c_), l(l_) { } }; SerializeMagic operator () (const string& locale) const { return SerializeMagic(*this, locale); } }; ostream& operator << (ostream& o, const List::SerializeMagic& lm); ostream& operator << (ostream& o, const Config::SerializeMagic& cm); #endif lurker-2.3/common/Summary.cpp0000644000175000017500000001237511267074431013251 00000000000000/* $Id: Summary.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Summary.cpp - Helper which can load a message given MessageId * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include "Summary.h" using namespace std; string Summary::load(Reader* r, const Config& cfg) { // Use the prefix limited search auto_ptr w(r->seek(LU_SUMMARY + id_.raw(), "", Forward)); Config::Lists::const_iterator li; allowed_ = false; // This will only walk records matching this id int ok; mbox_ = ""; while ((ok = w->advance()) != -1) { if (w->key.length() < 1 + 8 + 1) return "invalid mbox entry -- way too short"; // We use this for getting an unsigned value below. const unsigned char* k = (const unsigned char*)w->key.c_str()+1+8; // read all the values switch (*k) { case LU_MESSAGE_DELETED: deleted_ = true; break; case LU_MESSAGE_AUTHOR_EMAIL: author_email_ = w->key.substr(1+8+1, string::npos); if (cfg.hide_email) { string::size_type x = author_email_.find('@'); if (x != string::npos) author_email_.resize(x); if (!author_name_.length()) author_name_ = author_email_; author_email_ = ""; } break; case LU_MESSAGE_AUTHOR_NAME: if (w->key.length() > 1+8+1) author_name_ = w->key.substr(1+8+1, string::npos); break; case LU_MESSAGE_SUBJECT: subject_ = w->key.substr(1+8+1, string::npos); break; case LU_MESSAGE_MBOX: if (w->key.length() < 1+8+1+1+12) return "invalid mbox entry -- too short"; //!!! could be more careful about corrupt dbs here ++k; mbox_ = (const char*)k; // null terminated k += mbox_.length(); int i; offset_ = 0; for (i = 0; i < 8; ++i) { offset_ <<= 8; offset_ |= *++k; } length_ = 0; for (i = 8; i < 12; ++i) { length_ <<= 8; length_ |= *++k; } mboxs_.insert(mbox_); li = cfg.lists.find(mbox_); if (li == cfg.lists.end()) return "referenced list is missing: " + mbox_; if (li->second.allowed) allowed_ = true; break; default: return "unknown mbox summary control code"; } } if (mbox_ == "") return "not in a mailbox"; if (ok == -1 && errno != 0) return string("Walker::advance:") + strerror(errno); return ""; } string Summary::message(const string& dbdir, DwMessage& message) const { string name = dbdir + "/" + mbox_; int fd = open(name.c_str(), O_RDONLY); if (fd == -1) return name + ":open:" + strerror(errno); if (lseek(fd, offset_, SEEK_SET) != offset_) { close(fd); return name + ":lseek:" + strerror(errno); } gzFile gzf = gzdopen(fd, "rb"); if (gzf == 0) { close(fd); return name + ":gzdopen:" + strerror(errno); } DwString str; char buf[8192]; unsigned long want = length_; while (want) { long get; if (want < sizeof(buf)) get = want; else get = sizeof(buf); if (gzread(gzf, buf, get) != get) { gzclose(gzf); return name + ":gzread:" + strerror(errno); } str.append(buf, get); want -= get; } gzclose(gzf); // also closes fd message.FromString(str); message.Parse(); return ""; } ostream& operator << (ostream& o, const Summary& s) { o << "" << "" << s.id().serialize() << "" << "" << s.id().timestamp() << ""; if (s.deleted() || !s.allowed()) { o << ""; } else { if (s.subject().length() > 0) o << "" << xmlEscape << s.subject() << ""; o << " 0) o << " address=\"" << xmlEscape << s.author_email() << "\""; if (s.author_name().length() > 0) o << " name=\"" << xmlEscape << s.author_name() << "\""; o << "/>"; } o << ""; return o; } // Locale independent static inline bool my_isspace(char x) { return x == '\t' || x == '\n' || x == '\v' || x == '\f' || x == '\r' || x == ' '; } string whitespace_sanitize(const string& x) { string out; string::size_type i = 0; // Trim leading whitespace while (i < x.length() && my_isspace(x[i])) i++; while (1) { // Copy non-whitespace while (i < x.length() && !my_isspace(x[i])) out += x[i++]; while (i < x.length() && my_isspace(x[i])) i++; if (i == x.length()) break; // If we have more non-whitespace, and passed some whitespace, // then output a single space out += " "; } return out; } lurker-2.3/common/MessageId.cpp0000644000175000017500000001030711267074431013446 00000000000000/* $Id: MessageId.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * MessageId.cpp - Helper class for manipulating internal message ids * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "MessageId.h" #include "config.h" #include #include #include inline int dehex(char x) { if (x >= 'a' && x <= 'f') return x - 'a' + 10; if (x >= 'A' && x <= 'F') return x - 'A' + 10; return x - '0'; } #ifndef HAVE_TIMEGM // Contributed by: Moritz.Eysholdt@mail.uni-oldenburg.de static time_t my_timegm (struct tm *t) { time_t tl, tb; struct tm *tg; tl = mktime(t); if (tl == -1) { t->tm_hour--; tl = mktime (t); if (tl == -1) return -1; /* can't deal with output from strptime */ tl += 3600; } tg = gmtime (&tl); tg->tm_isdst = 0; tb = mktime (tg); if (tb == -1) { tg->tm_hour--; tb = mktime (tg); if (tb == -1) return -1; /* can't deal with output from gmtime */ tb += 3600; } return (tl - (tb - tl)); } #endif const unsigned int MessageId::time_len = 15; const unsigned int MessageId::full_len = 24; const unsigned int MessageId::raw_len = 8; /** Note; the serialized time is always in UTC! * * This is so that the same message will have the same lurker id across * all servers with the message, regardless of their timezone. */ MessageId::MessageId(const char* str) { if (strlen(str) > 14 && str[8] == '.') { struct tm t; memset(&t, 0, sizeof(t)); t.tm_year = (str[ 0] - '0') * 1000 + (str[ 1] - '0') * 100 + (str[ 2] - '0') * 10 + (str[ 3] - '0') - 1900; t.tm_mon = (str[ 4] - '0') * 10 + (str[ 5] - '0') - 1; t.tm_mday = (str[ 6] - '0') * 10 + (str[ 7] - '0'); t.tm_hour = (str[ 9] - '0') * 10 + (str[10] - '0'); t.tm_min = (str[11] - '0') * 10 + (str[12] - '0'); t.tm_sec = (str[13] - '0') * 10 + (str[14] - '0'); #ifdef HAVE_TIMEGM time_t tm = timegm(&t); #else time_t tm = my_timegm(&t); #endif time_[3] = (tm & 0xFF); tm >>= 8; time_[2] = (tm & 0xFF); tm >>= 8; time_[1] = (tm & 0xFF); tm >>= 8; time_[0] = (tm & 0xFF); } else { time_[0] = time_[1] = time_[2] = time_[3] = 0; } if (strlen(str) > 23 && str[15] == '.') { hash_[0] = dehex(str[16]) * 16 + dehex(str[17]); hash_[1] = dehex(str[18]) * 16 + dehex(str[19]); hash_[2] = dehex(str[20]) * 16 + dehex(str[21]); hash_[3] = dehex(str[22]) * 16 + dehex(str[23]); } else { hash_[0] = hash_[1] = hash_[2] = hash_[3] = 0; } } string MessageId::serialize() const { char buf[26]; time_t then = timestamp(); strftime(buf, 25, "%Y%m%d.%H%M%S", gmtime(&then)); snprintf(&buf[15], 10, ".%02x%02x%02x%02x", hash_[0], hash_[1], hash_[2], hash_[3]); return buf; } static inline bool is_digit(char c) { return (c >= '0' && c <= '9'); } static inline bool is_hex(char c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); } bool MessageId::is_time(const char* s) { return is_digit(s[0]) && is_digit(s[1]) && is_digit(s[2]) && is_digit(s[3]) && is_digit(s[4]) && is_digit(s[5]) && is_digit(s[6]) && is_digit(s[7]) && s[8] == '.' && is_digit(s[ 9]) && is_digit(s[10]) && is_digit(s[11]) && is_digit(s[12]) && is_digit(s[13]) && is_digit(s[14]); } bool MessageId::is_full(const char* s) { return is_time(s) && s[15] == '.' && is_hex(s[16]) && is_hex(s[17]) && is_hex(s[18]) && is_hex(s[19]) && is_hex(s[20]) && is_hex(s[21]) && is_hex(s[22]) && is_hex(s[23]); } lurker-2.3/common/md5.h0000644000175000017500000000447711267071326011752 00000000000000/* * This is the header file for the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. * * Changed so as no longer to depend on Colin Plumb's `usual.h' * header definitions; now uses stuff from dpkg's config.h * - Ian Jackson . * Still in the public domain. * * This copy has been re-released as GPL by * Wesley W. Terpstra * for inclusion in the lurker project. It is now c++ code without autoconf. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef MD5_H #define MD5_H #include #if UINT_MAX == 4294967295U typedef unsigned int UWORD32; #elif ULONG_MAX == 4294967295U typedef unsigned long UWORD32; #else #error "No 32 bit type" #endif #define md5byte unsigned char struct MD5Context { UWORD32 buf[4]; UWORD32 bytes[2]; UWORD32 in[16]; }; void MD5Init(struct MD5Context *context); void MD5Update(struct MD5Context *context, md5byte const *buf, unsigned len); void MD5Final(unsigned char digest[16], struct MD5Context *context); void MD5Transform(UWORD32 buf[4], UWORD32 const in[16]); #endif /* !MD5_H */ lurker-2.3/common/Keys.h0000644000175000017500000000616511267074431012174 00000000000000/* $Id: Keys.h 1649 2009-10-19 14:35:01Z terpstra $ * * Keys.h - What prefixs various database keys * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef KEYS_H #define KEYS_H #include #include using std::string; using std::vector; // These must have length 1 #define LU_THREADING "t" #define LU_KEYWORD "k" #define LU_SUMMARY "s" #define LU_CACHE "c" #define LU_NEW_TOPICS "n" #define LU_MESSAGE_DELETED 'd' #define LU_MESSAGE_AUTHOR_EMAIL 'e' #define LU_MESSAGE_AUTHOR_NAME 'n' #define LU_MESSAGE_SUBJECT 's' #define LU_MESSAGE_MBOX 'x' /* special keywords */ #define LU_KEYWORD_DELETED "id:deleted" /* a deleted message */ /* fields indexed early */ #define LU_KEYWORD_EVERYTHING "id:any" /* empty search */ #define LU_KEYWORD_MESSAGE_ID "id:" /* Message id */ #define LU_KEYWORD_REPLY_TO "rt:" /* Reply-to */ #define LU_KEYWORD_THREAD "th:" /* THread */ /* lu_import_message */ #define LU_KEYWORD_LIST "ml:" /* Mailing List */ #define LU_KEYWORD_AUTHOR "au:" /* AUthor */ #define LU_KEYWORD_SUBJECT "sb:" /* SuBject */ /* magic automatic keywords */ #define LU_KEYWORD_GROUP "gr:" /* Mailing group */ #define LU_KEYWORD_LANGUAGE "lang:" /* Language */ /* import processing */ #define LU_KEYWORD_WORD "" /* body keywords */ /* The longest length a keyword can be */ #define LU_KEYWORD_LEN 80 /* Analyze the string for keywords. */ extern int my_keyword_digest_string( const char* buf, int len, const char* prefix, int (*writefn)(const char* keyword, void* arg), void* arg, int do_div); const char* skipSubjectStart(const char* subject); string subject_hash(const char* subject); vector extract_message_ids(const char* str); /* The database has these types: * * Threading: * LU_THREADING * subject_hash * message_id * (reply_to_hash*) * * Summary: * LU_SUMMARY * message_id * DELETED/AUTHOR_EMAIL/AUTHOR_NAME/SUBJECT/MBOX * ... if it has any of these then it must have all of them, in that order * For all except the MBOX+DELETED, one has just a string value. * For Mbox: * '\0' <64bit offset> <32bit length> * * Keyword: * LU_KEYWORD * keyword * '\0' * mid * * Cache cleaning: * LU_CACHE * import timestamp as 4 bytes in bigendian order * mid * * New topics fields: * LU_NEW_TOPICS * listid '\0' * timestamp * threadhash */ #endif lurker-2.3/common/Thread.cpp0000644000175000017500000001153011267074431013013 00000000000000/* $Id: Thread.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Thread.h - Helper class for calculating threading * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include "md5.h" #include "Keys.h" using std::string; #define LU_SQUISHY_MAX 512 // Doesn't vary with charset inline bool lu_isspace(char x) { return x == ' ' || x == '\n' || x == '\r' || x == '\t'; } // Doesn't vary with charset inline bool lu_isalnum(char x) { return (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z') || (x >= '0' && x <= '9') || (((unsigned char)x) >= 0x80); // utf-8 is allowed } inline char lu_tolower(char x) { if (x >= 'A' && x <= 'Z') return x - 'A' + 'a'; return x; } const char* skipSubjectStart(const char* subject) { /* Skip past any number of: ' *[^ :]{0, 8}:' sequences * Also, any number of '\[[^\]]{0,16}\]' sequences */ int state = 1; const char* r; const char* s; r = s = subject; while (*s) { if (state == 0) { /* We are scanning a word that could be ...: */ if (*s == '[' && s == r) { state = 2; } if (*s == ':') { state = 1; } else if (*s == ' ' || s - r > 8) { break; } s++; } else if (state == 1) { /* We're skiping past whitespace */ if (lu_isspace(*s)) { s++; } else { r = s; state = 0; } } else { /* We're skipping past a [...] */ if (*s == ']') { state = 1; } else if (s - r > 40) { break; } s++; } } return r; } // Stolen from lurker 0.1g: int my_summary_squishy_subject( const char* subject, char* target) { /* Alright, we want to drop 're:', 'fwd:', etc. * Also drop [...] chunks * Anything after a 'was:' should be cut. * Changes in case shouldn't be confusing. * Punctuation is disregarded. * We want a maximum length. (LU_SQUISHY_MAX) */ const char* r; char* e; char* w; int ws; if (!subject) { *target = 0; return 0; } r = skipSubjectStart(subject); /* Ok, begin writing the string out to target. * We compress whitespace to a single space. * Change everything to lower case. * Drop punctuation on the floor. * Stop on a ':' and discard any word that preceded it. (was:) */ ws = 0; for ( w = target, e = w + LU_SQUISHY_MAX-1; *r && w != e; r++) { if (lu_isspace(*r)) { ws = 1; } else { if (*r == ':' && (w - target) > 8 && lu_tolower(*(r-1)) == 's' && lu_tolower(*(r-2)) == 'a' && lu_tolower(*(r-3)) == 'w') { /* Nasty colons! */ break; } if (lu_isalnum(*r)) { if (ws) { *w++ = ' '; ws = 0; /* Need to retest since we are doing a double * write */ if (w == e) break; } *w++ = lu_tolower(*r); } } } if (*r == ':') { /* Rewind 'w' by one word */ if (w != target) w--; for (; w != target; w--) if (lu_isspace(*w)) break; } *w = 0; return w - target; } string subject_hash(const char* subject) { char sbj[LU_SQUISHY_MAX]; my_summary_squishy_subject(subject, sbj); MD5Context ctx; unsigned char buf[16]; MD5Init(&ctx); MD5Update(&ctx, (unsigned char*)sbj, strlen(sbj)); MD5Final(buf, &ctx); unsigned char xord[4]; xord[0] = buf[0] ^ buf[4] ^ buf[ 8] ^ buf[12]; xord[1] = buf[1] ^ buf[5] ^ buf[ 9] ^ buf[13]; xord[2] = buf[2] ^ buf[6] ^ buf[10] ^ buf[14]; xord[3] = buf[3] ^ buf[7] ^ buf[11] ^ buf[15]; char code[9]; snprintf(code, sizeof(code), "%02x%02x%02x%02x", xord[0], xord[1], xord[2], xord[3]); return code; } vector extract_message_ids(const char* str) { vector out; while (1) { while (*str && *str != '<') ++str; if (!*str) break; const char* start = ++str; while (*str && *str != '>' && !lu_isspace(*str)) ++str; if (!*str) break; if (lu_isspace(*str)) continue; // this is a valid msg-id? string maybe(start, str - start); if (maybe.find('@')) { // cut stupid message-ids off AFTER we know it's an id // (this can remove the @ sign) if (maybe.length() > 100) maybe.resize(100); out.push_back(maybe); } } return out; } lurker-2.3/common/Keys.cpp0000644000175000017500000001330311267074431012517 00000000000000/* $Id: Keys.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Keys.cpp - Digest a hunk of string into keywords. * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 /* #define DEBUG 1 */ #include "Keys.h" #include /*------------------------------------------------ Private global vars */ /* These are characters which should be interpretted as both part of the word * and as a word seperator. eg: 'maul.sith.vpn' should be indexed as 'maul', * 'sith', 'vpn', and 'maul.sith.vpn' because '.' is listed here. */ static const char my_keyword_word_splits[] = "$@./:\\-_~&=%?#+"; static char my_keyword_is_split[256]; /* These are characters which should be interpretted as word breaks. * No known language should use these as letters in a word. * All chars 000-037 fall in this category too. */ static const char my_keyword_word_divs[] = " !\"'()*,;<>[]^`{|}"; static char my_keyword_is_div[256]; /* These tables are the conversion for characters being written to keywords. */ static const char my_keyword_orig[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static const char my_keyword_dest[] = "abcdefghijklmnopqrstuvwxyz"; static char my_keyword_conv[256]; /* We need to be initd */ static int my_keyword_initd = 1; /*------------------------------------------------ Private helper methods */ /* Combine the prefix with the substring */ static int my_keyword_index_hunk( const unsigned char* buf, const unsigned char* eos, const char* prefix, int (*writefn)(const char* keyword, void* arg), void* arg) { char out[LU_KEYWORD_LEN+1]; char* w; char* e; if (buf == eos) { /* Don't index nothing */ return 0; } /* A quick check to avoid function calls */ if (prefix[0]) { strcpy(&out[0], prefix); w = &out[strlen(prefix)]; } else { w = &out[0]; } e = &out[sizeof(out) - 1]; /* Copy the range into the buffer while converting it */ while (w != e && buf != eos) { *w++ = my_keyword_conv[*buf++]; } *w = 0; if (!out[0]) { /* Ignore this keyword */ return 0; } return writefn(&out[0], arg); } /* Look at a section of non-whitespace chars and decide what to do with it. */ static int my_keyword_digest_hunk( const unsigned char* buf, const unsigned char* eos, const char* prefix, int (*writefn)(const char* keyword, void* arg), void* arg, int do_div) { const unsigned char* start; const unsigned char* scan; /*!!! Make me work with non-romanian languages (eg. japanese) */ /* Japanese has no spaces to delineate words */ /* Don't index vapour. */ if (buf == eos) return 0; /* Firstly, index the entire chunk, with leading and trailing chars. */ /* Index the entire hunk. */ if (my_keyword_index_hunk(buf, eos, prefix, writefn, arg) != 0) return -1; if (!do_div) return 0; /* Now, divide the chunk into bits which we will keyword index */ start = 0; for (scan = buf; scan != eos; scan++) { if (my_keyword_is_split[*scan]) { if (start) { if (my_keyword_index_hunk(start, scan, prefix, writefn, arg) != 0) return -1; start = 0; } } else { if (!start) { start = scan; } } } if (start) { if (my_keyword_index_hunk(start, eos, prefix, writefn, arg) != 0) return -1; } return 0; } static void my_keyword_init(void) { unsigned int i; /* Clear the lookup tables */ memset(&my_keyword_is_split[0], 0, sizeof(my_keyword_is_split)); memset(&my_keyword_is_div [0], 0, sizeof(my_keyword_is_div)); /* Bootstrap the lookup tables */ for (i = 0; i < sizeof(my_keyword_word_splits)-1; i++) my_keyword_is_split[((int)my_keyword_word_splits[i])] = 1; for (i = 0; i < sizeof(my_keyword_word_divs)-1; i++) my_keyword_is_div[((int)my_keyword_word_divs[i])] = 1; /* All control characters divide words */ for (i = 0; i < 040; i++) my_keyword_is_div[i] = 1; /* Initialize conversion table */ for (i = 0; i < 256; i++) my_keyword_conv[i] = i; /* Fill the conversion entries */ for (i = 0; i < sizeof(my_keyword_orig)-1; i++) my_keyword_conv[((int)my_keyword_orig[i])] = my_keyword_dest[i]; my_keyword_initd = 0; } /*------------------------------------------------- Public component methods */ /* Run through a buffer looking for segments of non-divide characters. */ int my_keyword_digest_string( const char* buf, int len, const char* prefix, int (*writefn)(const char* keyword, void* arg), void* arg, int do_div) { const unsigned char* start; const unsigned char* scan; const unsigned char* eos = (const unsigned char*)buf + len; if (my_keyword_initd) my_keyword_init(); start = 0; for (scan = (const unsigned char*)buf; scan != eos; scan++) { if (my_keyword_is_div[*scan]) { if (start) { my_keyword_digest_hunk(start, scan, prefix, writefn, arg, do_div); start = 0; } } else { if (!start) { start = scan; } } } if (start) { my_keyword_digest_hunk(start, eos, prefix, writefn, arg, do_div); } return 0; } lurker-2.3/common/Search.cpp0000644000175000017500000002013211267074431013007 00000000000000/* $Id: Search.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Search.cpp - Execute a keyword search * * Copyright (C) 2004 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include "Search.h" #include "Keys.h" using namespace std; class Searcher { public: MessageId next_id; // not correct till first call of skipto /* Precoditions: * has never yet returned EOF. * later_than > next_id (wrt. the established direction) * Postconditions: * Returns false on EOF * Otherwise, next_id >= later_than (wrt. dir.) */ virtual bool skipto(MessageId later_than) = 0; virtual ~Searcher(); }; Searcher::~Searcher() { } class EmptySearcher : public Searcher // no messages { public: bool skipto(MessageId later_than) { return false; } }; class CompleteSearcher : public Searcher // every possible message { public: bool skipto(MessageId later_than) { next_id = later_than; return true; } }; class NotSearcher : public Searcher { protected: // Invariant: before first call, s->next_id == next_id // if s has ever hit EOF, s is null // else s->next_id is smallest > next_id (wrt. dir.) auto_ptr s; Direction d; public: NotSearcher(Searcher* s_, Direction d_) : s(s_), d(d_) { } bool skipto(MessageId later_than); }; bool NotSearcher::skipto(MessageId later_than) { if (s.get() && next_id == s->next_id) // detect startup { if (!s->skipto(later_than)) s.reset(); } next_id = later_than; while (s.get()) { if (d == Forward) { if (next_id > s->next_id) if (!s->skipto(next_id)) s.reset(); } else { if (next_id < s->next_id) if (!s->skipto(next_id)) s.reset(); } if (!s.get() || s->next_id != next_id) break; if (d == Forward) { if (next_id.increment()) return false; } else { if (next_id.decrement()) return false; } } return true; } class AndSearcher : public Searcher { protected: typedef std::list Parts; // Invariant: // all parts p: p->next_id == next_id (wrt. dir) // p has not returned EOF // OR we have returned EOF Direction d; Parts parts; public: AndSearcher(Direction d_) : d(d_) { } ~AndSearcher(); bool skipto(MessageId later_than); void push(Searcher* s) { parts.push_back(s); } Searcher* simplify(); }; AndSearcher::~AndSearcher() { for (Parts::iterator i = parts.begin(); i != parts.end(); ++i) delete *i; } bool AndSearcher::skipto(MessageId later_than) { assert (!parts.empty()); // simplify fixes this case /* First run, same source for all sub-problems -> precondition ok * Otherwise, all p->next_ids == next_id < later_than -> precondition ok */ for (Parts::iterator i = parts.begin(); i != parts.end(); ++i) if (!(*i)->skipto(later_than)) return false; while (1) { Searcher* low = parts.front(); Searcher* high = parts.front(); for (Parts::iterator i = parts.begin(); i != parts.end(); ++i) { if ((*i)->next_id < low ->next_id) low = *i; if ((*i)->next_id > high->next_id) high = *i; } if (high->next_id == low->next_id) { next_id = high->next_id; break; } // Pre-condition satisfied b/c of ordering: low < high if (d == Forward) { if (!low->skipto(high->next_id)) return false; } else { if (!high->skipto(low->next_id)) return false; } // low might become highest - something else is now lowest } return true; } Searcher* AndSearcher::simplify() { if (parts.empty()) { delete this; return new CompleteSearcher(); } if (parts.size() == 1) { Searcher* h = parts.front(); parts.pop_front(); delete this; return h; } return this; } class OrSearcher : public Searcher { protected: typedef std::list Parts; // Invariant: // all parts p: first p->next_id >= next_id (wrt direction) // p has never returned EOF Direction d; bool first; Parts parts; public: OrSearcher(Direction d_) : d(d_), first(true) { } ~OrSearcher(); bool skipto(MessageId later_than); void push(Searcher* s) { parts.push_back(s); } Searcher* simplify(); }; OrSearcher::~OrSearcher() { for (Parts::iterator i = parts.begin(); i != parts.end(); ++i) delete *i; } bool OrSearcher::skipto(MessageId later_than) { Searcher* high = 0; Searcher* low = 0; Parts::iterator i, j; for (i = parts.begin(); i != parts.end(); i = j) { j = i; ++j; if (first || (d == Forward && later_than > (*i)->next_id) || (d == Backward && later_than < (*i)->next_id)) { if (!(*i)->skipto(later_than)) { delete *i; parts.erase(i); continue; } } if (!low || (*i)->next_id < low ->next_id) low = *i; if (!high || (*i)->next_id > high->next_id) high = *i; } first = false; if (!low) return false; if (d == Forward) next_id = low->next_id; else next_id = high->next_id; return true; } Searcher* OrSearcher::simplify() { if (parts.empty()) { delete this; return new EmptySearcher(); } if (parts.size() == 1) { Searcher* h = parts.front(); parts.pop_front(); delete this; return h; } return this; } class WordSearcher : public Searcher { protected: Direction d; bool first; int prefix; auto_ptr walker; public: WordSearcher(const Criterea& c, const string& word); bool skipto(MessageId later_than); }; WordSearcher::WordSearcher(const Criterea& c, const string& word) : d(c.dir), first(true), prefix(sizeof(LU_KEYWORD)-1 + word.length() + 1), walker(c.db->seek(LU_KEYWORD + word + '\0', c.source.raw(), c.dir)) { } bool WordSearcher::skipto(MessageId later_than) { while (first || (d == Forward && later_than > next_id) || (d == Backward && later_than < next_id)) { // later_than > next_id, so we are free to advance. int out = walker->advance(); if (out == -1) return false; // hit end of file (errno == 0) ? if (walker->key.length() != prefix + MessageId::raw_len) return false; // corrupt! next_id = MessageId(walker->key.c_str() + prefix, MessageId::raw_len); first = false; } return true; } Search::Search(const Config& cfg_, ESort::Reader* db, Direction dir, const MessageId& source, bool skipdel) : cfg(cfg_) { criterea.db = db; criterea.dir = dir; criterea.source = source; root = new AndSearcher(dir); need_any = true; // until we see a search term without a '-' we need it // do not include deleted messages if (skipdel) keyword(string("-") + LU_KEYWORD_DELETED); } Search::~Search() { delete root; } void Search::keyword(const string& key) { string word; if (key[0] == '-' || key[0] == '+') word.assign(key, 1, string::npos); else word = key; if (key[0] != '-') need_any = false; Searcher* s = new WordSearcher(criterea, word); if (key[0] == '-') s = new NotSearcher(s, criterea.dir); root->push(s); } bool Search::pull(int n, vector& o) { if (need_any) { // if only negative terms are included, add this keyword(LU_KEYWORD_EVERYTHING); need_any = false; } while (n--) { if (!root->skipto(criterea.source)) break; // cout << "pushing: " << root->next_id.serialize() << "\n"; o.push_back(Summary(root->next_id)); criterea.source = root->next_id; if (criterea.dir == Forward && criterea.source.increment()) break; if (criterea.dir == Backward && criterea.source.decrement()) break; } return true; } lurker-2.3/common/CharsetEscape.h0000644000175000017500000000472011267073336013771 00000000000000/* $Rev$ * * CharsetEscape.h - A stream manipulator-like thing for charset conversion * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef CHARSET_ESCAPE_H #define CHARSET_ESCAPE_H #include #include #include #include using std::ostream; using std::string; /** Escape a charset into utf-8 */ class CharsetEscape { protected: iconv_t ic; public: // If the charset is invalid, iso-8859-1 is used instead CharsetEscape(const char* charset); ~CharsetEscape(); bool valid() const { return ic != (iconv_t)-1; } void write(ostream& o, const char* s, size_t amt); string write(const char* s, size_t amt); void write(ostream& o, const string& s) { write(o, s.c_str(), s.length()); } string write(const string& s) { return write(s.c_str(), s.length()); } void write(ostream& o, const char* s) { write(o, s, strlen(s)); } string write(const char* s) { return write(s, strlen(s)); } void write(ostream& o, char c) { write(o, &c, 1); } string write(char c) { return write(&c, 1); } }; class CharsetOstream { protected: ostream& o; CharsetEscape& e; public: CharsetOstream(ostream& o_, CharsetEscape& e_) : o(o_), e(e_) { } ostream& operator << (const string& s) { e.write(o, s); return o; } ostream& operator << (const char* s) { e.write(o, s); return o; } ostream& operator << (char c) { e.write(o, c); return o; } }; inline CharsetOstream operator << (ostream& o, CharsetEscape& e) { return CharsetOstream(o, e); } // Transform any =?charset?encoding?str?= stuff in the string to utf-8 string decode_header( const string& str, const char* default_coding); #endif lurker-2.3/config.h.in0000644000175000017500000000333411272632712011634 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* The default config file location */ #undef DEFAULT_CONFIG_FILE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYSEXITS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `timegm' function. */ #undef HAVE_TIMEGM /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION lurker-2.3/configure.ac0000644000175000017500000001120011272632647012075 00000000000000AC_INIT(lurker.conf.in) AC_CONFIG_AUX_DIR(tools) AC_PREREQ(2.57) AM_INIT_AUTOMAKE(lurker, 2.3) AC_SUBST(VERSION) AM_CONFIG_HEADER(config.h) AM_MAINTAINER_MODE AC_PROG_INSTALL AC_PROG_RANLIB AC_PROG_CC AC_PROG_CXX AC_LANG(C++) if test "x$USE_MAINTAINER_MODE" != "xno"; then CXXFLAGS="$CXXFLAGS -Wall -O0 -g" fi AC_CHECK_FUNCS([timegm realpath]) AC_CHECK_HEADERS([sysexits.h sys/param.h]) AC_SEARCH_HEADER_DIRS( [iconv.h], [/usr/local/include],, [AC_MSG_ERROR(Need iconv.h to compile)]) AC_SEARCH_EXPRESSION_LIBS([iconv_t ic = iconv_open("ISO-8859-1", "UTF-8")], [iconv], [#include ],, [AC_MSG_ERROR(Need iconv to link)]) AC_ARG_WITH([zlib-include], AC_HELP_STRING([--with-zlib-include=DIR], [Location of zlib.h]),, [with_zlib_include=""]) AC_SEARCH_HEADER_DIRS( [zlib.h], [$with_zlib_include /usr/include /usr/local/include],, [AC_MSG_ERROR(Need zlib.h to compile)]) AC_ARG_WITH([zlib-libname], AC_HELP_STRING([--with-zlib-libname=LIB], [Try an alternative library name]),, [with_zlib_libname=""]) AC_SEARCH_EXPRESSION_LIBS([gzFile f = gzdopen(0, "r")], [$with_zlib_libname zlib z libz], [#include ],, [AC_MSG_ERROR(Need zlib to link)]) AC_ARG_WITH([mimelib-local], AC_HELP_STRING([--with-mimelib-local], [Use internal lurker/mimelib/*]),, [with_mimelib_local="no"]) AC_ARG_WITH([mimelib-include], AC_HELP_STRING([--with-mimelib-include=DIR], [Location of mimelib/message.h]),, [with_mimelib_include=""]) if test "x$with_mimelib_local" != "xno"; then AM_CONDITIONAL(LOCAL_MIMELIB, true) AC_MSG_CHECKING(for mimelib) AC_MSG_RESULT(local) CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/mimelib" LIBS="-L\$(top_srcdir)/mymime -lmimelib $LIBS" else AM_CONDITIONAL(LOCAL_MIMELIB, false) AC_SEARCH_HEADER_DIRS( [mimelib/message.h], [$with_mimelib_include /usr/include/kde /usr/local/include /usr/local/include/kde],, [AC_MSG_ERROR(Need mimelib/*.h to compile)]) AC_ARG_WITH([mimelib-libname], AC_HELP_STRING([--with-mimelib-libname=LIB], [Try an alternative library name]),, [with_mimelib_libname=""]) AC_SEARCH_CLASS_LIBS(DwMessage, [$with_mimelib_libname mimelib mimepp], [#include ],, [AC_MSG_ERROR(Need mimelib to link)]) fi AC_ARG_WITH([default-config-dir], AC_HELP_STRING([--with-default-config-dir=DIR], [Where the lurker looks for a configuration files [default=SYSCONFDIR/lurker]]), default_config_dir="$withval", default_config_dir="\${sysconfdir}/\${PACKAGE}") AC_ARG_WITH([default-www-dir], AC_HELP_STRING([--with-default-www-dir=DIR], [Where the lurker places bootstrap web files [default=DATAROOTDIR/lurker/www]]), default_www_dir="$withval", default_www_dir="\${datarootdir}/\${PACKAGE}/www") AC_ARG_WITH([cgi-bin-dir], AC_HELP_STRING([--with-cgi-bin-dir=DIR], [Where the lurker places cgi files [default=LIBDIR/cgi-bin]]), cgi_bin_dir="$withval", cgi_bin_dir="\${libdir}/cgi-bin") AC_SUBST(default_config_dir) AC_SUBST(default_www_dir) AC_SUBST(cgi_bin_dir) # We need to fully evaluate some variables for the config and source files prefix_backup="$prefix" exec_prefix_backup="$exec_prefix" if test "x${prefix}" = "xNONE"; then prefix="${ac_default_prefix}"; fi if test "x${exec_prefix}" = "xNONE"; then exec_prefix="${prefix}"; fi LOCALSTATEDIR=`eval echo ${localstatedir}` DEFAULT_WWW_DIR=`eval echo ${default_www_dir}` DEFAULT_CONFIG_DIR=`eval echo ${default_config_dir}` CGI_BIN_DIR=`eval echo ${cgi_bin_dir}` BINDIR=`eval echo ${bindir}` LOCALSTATEDIR=`eval echo ${LOCALSTATEDIR}` DEFAULT_WWW_DIR=`eval echo ${DEFAULT_WWW_DIR}` DEFAULT_CONFIG_DIR=`eval echo ${DEFAULT_CONFIG_DIR}` CGI_BIN_DIR=`eval echo ${CGI_BIN_DIR}` BINDIR=`eval echo ${BINDIR}` prefix="$prefix_backup" exec_prefix="$exec_prefix_backup" # Needed in lurker.conf and apache.conf: AC_SUBST(LOCALSTATEDIR) AC_SUBST(DEFAULT_CONFIG_DIR) AC_SUBST(DEFAULT_WWW_DIR) AC_SUBST(CGI_BIN_DIR) AC_SUBST(BINDIR) # Needed in source: AC_DEFINE_UNQUOTED(DEFAULT_CONFIG_FILE, ["$DEFAULT_CONFIG_DIR/$PACKAGE.conf"], [The default config file location]) AC_CONFIG_FILES([ Makefile libesort/Makefile common/Makefile index/Makefile ui/Makefile imgs/Makefile prune/Makefile render/Makefile mymime/Makefile lurker.conf apache.conf]) AC_OUTPUT lurker-2.3/libesort/0000777000175000017500000000000011272633207011515 500000000000000lurker-2.3/libesort/Master.cpp0000644000175000017500000001316011267074431013373 00000000000000/* $Id: Master.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Master.cpp - Coordinate commit+read interface * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "io.h" #include "Master.h" #include "Source.h" #include "Failer.h" #include "Transaction.h" #include #include #include #include namespace ESort { Master::Master(const Parameters& p) : view(p), memory(), man() { } Master::~Master() { } int Master::init(const string& db, int mode) { if (man.dbopen(view, db, mode) != 0) return -1; return 0; } struct CleanupHelper { public: DbMan* man; int fd; string id; CleanupHelper(DbMan* man_) : man(man_), fd(-1) { } ~CleanupHelper() { if (fd != -1) { close(fd); man->killSub(id); } } }; int Master::commit() { if (memory.empty()) return 0; CleanupHelper scopedData(&man); scopedData.fd = man.openNew(scopedData.id); if (scopedData.fd == -1) return -1; Transaction tran(scopedData.fd, &view.params); Merger merge(view.params.unique(), true); // forward auto_ptr m(memory.openMemory("", true)); // forward int ok = m->advance(); assert (ok != -1); // memory was already checked -> not empty! merge.merge(m.get()); m.release(); // seperate in case of exception above // What category is our RAM? int category = memory.category(view.params); // std::cout << "Category: " << category << std::endl; View::Files::iterator kill; for (kill = view.files.begin(); kill != view.files.end(); ++kill) { // std::cout << "Merging: " << kill->category << std::endl; if (kill->category > category) break; // keep this one // If we have at least one of the same size, roll up as in // binary addition if (kill->category == category) category++; auto_ptr f( const_cast(&*kill)->openBlock(0, true)); if (!f.get()) return -1; // something broke? if (f->advance() == -1) return -1; // always has keys?! merge.merge(f.get()); f.release(); // above might throw } // The list of ids which we commit std::set keepIds; keepIds.insert(scopedData.id); // the new id // keep all of these ids for (View::Files::iterator keep = kill; keep != view.files.end(); ++keep) keepIds.insert(keep->id); if (merge.skiptill("", true) != 0) return -1; // must work?! ram has entries int dup; while ((dup = merge.advance()) != -1) { // there is stuff to merge if (tran.write(merge.key.length(), dup, merge.key.c_str()) != 0) return -1; } if (tran.finish() != 0) return -1; // Commit the summary information if (man.commit(view.params, keepIds) != 0) return -1; // done with the buffer memory.flush(); // Queue useless files for delete std::set killIds; for (View::Files::iterator zap = view.files.begin(); zap != kill; ++zap) killIds.insert(zap->id); // Purge useless files from the View (closes them) view.files.erase(view.files.begin(), kill); // Now that they are closed, delete them for (std::set::iterator del = killIds.begin(); del != killIds.end(); ++del) man.killSub(*del); // Move the transaction to a File; thus becoming a part of the view int fd = scopedData.fd; scopedData.fd = -1; view.files.insert(File(scopedData.id, fd, &view.params)); return 0; } int Master::insert(const string& k) { assert (k.length() < view.params.keySize()); // always succeeds memory.insert(k); return 0; } auto_ptr Master::seek(const string& k, Direction dir) { assert (dir == Forward || dir == Backward); auto_ptr out(new Merger(view.params.unique(), dir == Forward)); if (view.rawseek(out.get(), k, dir == Forward) != 0) return auto_ptr(new Failer(errno)); auto_ptr s = memory.openMemory(k, dir == Forward); assert (s.get()); // always works // only possible error is eof if (s->advance() != -1) out->merge(s.release()); // else kill it on scope out if (out->skiptill(k, dir == Forward) == -1) return auto_ptr(new Failer(errno)); return auto_ptr(out); } auto_ptr Master::seek(const string& pfx, const string& k, Direction dir) { assert (dir == Forward || dir == Backward); auto_ptr out(new PrefixMerger(view.params.unique(), dir == Forward)); if (view.rawseek(out.get(), pfx + k, dir == Forward) != 0) return auto_ptr(new Failer(errno)); auto_ptr s = memory.openMemory(k, dir == Forward); assert (s.get()); // always works // only possible error is eof if (s->advance() != -1) out->merge(s.release()); // else kill it on scope out if (out->skiptill(pfx, k, dir == Forward) == -1) return auto_ptr(new Failer(errno)); return auto_ptr(out); } auto_ptr Writer::opendb(const string& db, const Parameters& p, int mode) { auto_ptr m(new Master(p)); if (m->init(db, mode) != 0) return auto_ptr(0); return auto_ptr(m); } } lurker-2.3/libesort/esort.h0000644000175000017500000001424511267074431012746 00000000000000/* $Id: esort.h 1649 2009-10-19 14:35:01Z terpstra $ * * esort.h - Public interface to libesort * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef ESORT_H #define ESORT_H #include #include /* What is ESort? -- An Online External Sort * * ESort provides a very primitive database API: An insert-only set of keys. * * There are very different trade-offs when compared with a standard database. * * N = number of keys in the set, M = number of operations * The seeks needed to for each repeated operation in one transaction: * * ESort BTree Hash * Insertion O(1) O(M*log(N)) O(M) * Read in sequence O(1) O(M) impossible * Seek to key O(M*log^2(N)) O(M*log(N)) O(M) * Delete impossible O(M*log(N)) O(M) * * From this table, one can conclude that ESort allows blindly fast insertion * and sequential read, but pays in the cost to seek. This is what makes it * highly appropriate for keyword indexes. * * An additional restriction is that ESort only supports a single-writer. * An additional advantage is that ESort readers get snap-shots. */ namespace ESort { using std::string; using std::auto_ptr; /** These parameters specify minimum values required for a database. * If an existing database has too small a value, an error is returned. * The unique flag toggles whether the database is a set or multiset. */ class Parameters { protected: unsigned int version_; unsigned long blockSize_; unsigned long keySize_; bool unique_; bool synced_; unsigned int keyWidth_; public: // keySize & blockSize are the number of bytes maximum Parameters( bool synced = true, bool unique = true, unsigned int version = 1, unsigned long blockSize = 8192, unsigned long keySize = 255); bool isWider(const Parameters& o); unsigned int version () const { return version_; } unsigned long blockSize() const { return blockSize_; } unsigned long keySize () const { return keySize_; } bool unique () const { return unique_; } bool synced () const { return synced_; } unsigned int keyWidth () const { return keyWidth_; } static Parameters minimize(const Parameters& x) { return Parameters(x.synced(), x.unique(), 1, 8, 1); } }; /** The direction in which the Walker walks the database. * * A Forward Query will find the first key >= the request * A Backward Query will find the last key < the request * * The Forward Query moves the iterator so the key increases * The Backward Query moves the iterator so the key decreases * * In this manner Forward + Backward patition the database's keys */ enum Direction { Forward, Backward }; /** The Walker class walks the database in sorted order. * As from the chart above, each invokation of advance() pays 0 seeks. */ class Walker { public: /** The current key which the walker points to. * This is not valid until advance is called once. */ string key; /** Advance to the next key in the database. * Returned is the number of bytes in common with the last key. * -1 is returned on error, errno = 0 -> reached EOF. */ virtual int advance() = 0; virtual ~Walker(); }; /** A Reader object allows you to obtain Walkers. * * A Reader is atomic. When you obtain a Reader, the contents of the set * remain fixed for as long as you keep a hold of the handle. Furthermore, * a Reader will take snapshots of the database only between Writer commits. */ class Reader { public: virtual ~Reader(); /** Obtain a Walker as described in Direction. * This costs O(log^2(N)) seeks, so try not to call it too often. * * This operation never fails; you must call advance() before use. */ virtual auto_ptr seek(const string& k, Direction dir) = 0; /** Obtain a record Walker over only those records which are * prefixed by 'prefix'. When the last such is passed, eof is * returned. * * This operation never failes; you must call advance() before use. */ virtual auto_ptr seek(const string& prefix, const string& k, Direction dir) = 0; /** Open an existing database for reading. * 0 is returned and errno set on error. */ static auto_ptr opendb( const string& db, const Parameters& p = Parameters::minimize(Parameters())); }; /** The Writer object allows you to insert keys. * * The Writer is atomic. When a key is inserted, it immediately becomes * available in all Walkers & Readers obtained from the Writer. However, * all open Readers never see the inserted keys, and new Readers do not * see them until the Writer calls commit. */ class Writer : public Reader { public: /** Insert a key into the database. * If an error occures, -1 is returned and errno set, else 0. * Be sure the key is smaller than keySize on pain of EINVAL. */ virtual int insert(const string& k) = 0; /** Commit the changes to the database. * If an error occures, -1 is returned and errno set, else 0. */ virtual int commit() = 0; /** Open a database for writing. * It is created if it did not exist. * * The mode is identical to open(2). * * 0 is returned and errno set on error. */ static auto_ptr opendb( const string& db, const Parameters& p = Parameters(), int mode = 0666); }; } #endif lurker-2.3/libesort/DbMan.h0000644000175000017500000000431511267074431012570 00000000000000/* $Id: DbMan.h 1649 2009-10-19 14:35:01Z terpstra $ * * DbMan.h - Manage the commit'd segments and parameters * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef DBMAN_H #define DBMAN_H #include #include #include "io.h" // string on solaris undefs open, so this comes after namespace ESort { using std::string; class Parameters; class View; class DbMan { protected: string dbname; FILE* dbfile; int cmode; int dirfd; int dblock; std::set ids; static int qualify(string& db); int scanFile(Parameters& p); protected: /** Lock the snapshot against changes. */ int lock_snapshot_ro(); void unlock_snapshot_ro(); int lock_snapshot_rw(); void unlock_snapshot_rw(); // must be locked ro during call int snapshot(View& view); public: DbMan(); ~DbMan(); /** Open the database */ int dbopen(View& view, const string& db); // ro access int dbopen(View& view, const string& db, int mode); // rw /** Lock the database for this single writer. */ int lock_database_rw(); void unlock_database_rw(); /** Store the new db state * Must be lock_database_rw'd */ int commit(const Parameters& p, const std::set& ids); /** Open a new sub-database. * Must be lock_database_rw'd */ int openNew(string& id); /** Destroy a sub-database. * Must be lock_data_base_rw'd & after commit */ int killSub(const string& id); }; } #endif lurker-2.3/libesort/Failer.h0000644000175000017500000000222011267074431013002 00000000000000/* $Id: Failer.h 1649 2009-10-19 14:35:01Z terpstra $ * * Failer.h - Output an error on advance * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FAILER_H #define FAILER_H #include "esort.h" namespace ESort { class Failer : public Walker { protected: int out_errno; public: Failer(int out_errno_) : out_errno(out_errno_) { } int advance(); }; } #endif lurker-2.3/libesort/Makefile.in0000644000175000017500000003320011272632671013500 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = dump$(EXEEXT) subdir = libesort DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libesort_a_AR = $(AR) $(ARFLAGS) libesort_a_LIBADD = am_libesort_a_OBJECTS = Parameters.$(OBJEXT) Memory.$(OBJEXT) \ File.$(OBJEXT) Source.$(OBJEXT) Transaction.$(OBJEXT) \ Merger.$(OBJEXT) Failer.$(OBJEXT) View.$(OBJEXT) \ Master.$(OBJEXT) DbMan.$(OBJEXT) libesort_a_OBJECTS = $(am_libesort_a_OBJECTS) PROGRAMS = $(noinst_PROGRAMS) am_dump_OBJECTS = dump.$(OBJEXT) dump_OBJECTS = $(am_dump_OBJECTS) dump_DEPENDENCIES = libesort.a DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/tools/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libesort_a_SOURCES) $(dump_SOURCES) DIST_SOURCES = $(libesort_a_SOURCES) $(dump_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libesort.a libesort_a_SOURCES = \ Parameters.cpp Memory.cpp File.cpp Source.cpp Transaction.cpp \ Merger.cpp Failer.cpp View.cpp Master.cpp DbMan.cpp \ DbMan.h Failer.h File.h Master.h Memory.h Merger.h Source.h \ Transaction.h View.h esort.h io.h dump_SOURCES = dump.cpp dump_LDADD = libesort.a all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libesort/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu libesort/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libesort.a: $(libesort_a_OBJECTS) $(libesort_a_DEPENDENCIES) -rm -f libesort.a $(libesort_a_AR) libesort.a $(libesort_a_OBJECTS) $(libesort_a_LIBADD) $(RANLIB) libesort.a clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) dump$(EXEEXT): $(dump_OBJECTS) $(dump_DEPENDENCIES) @rm -f dump$(EXEEXT) $(CXXLINK) $(dump_OBJECTS) $(dump_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DbMan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Failer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/File.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Master.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Memory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Merger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Parameters.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Source.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Transaction.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/View.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/libesort/Transaction.cpp0000644000175000017500000000514511267074431014431 00000000000000/* $Id: Transaction.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Transaction.cpp - Write buffer for a commit * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "io.h" #include "Transaction.h" #include "esort.h" #include #include #include /* #define DEBUG */ namespace ESort { Transaction::Transaction(int fd_, const Parameters* p_) : fd(fd_), p(p_), buf(new unsigned char[p->blockSize()]), eof(buf + p->blockSize() - 2*(p->keyWidth() + 1)), off(buf) { } Transaction::~Transaction() { delete [] buf; } int Transaction::dump() { // std::cout << "BLOCK WRITE" << std::endl; ssize_t out = ::write(fd, buf, p->blockSize()); if (out != (ssize_t)p->blockSize()) { #ifdef DEBUG perror(__FILE__ ":" #__LINE__ ":write"); #endif return -1; } return 0; } int Transaction::write(long len, int dup, const char* key) { assert (dup < 256); // std::cout << "Write: " << len << " - " << dup << " - " << key << std::endl; long fragment = len - dup; if (off + fragment > eof) { // would overflow this block for (unsigned int i = 0; i < p->keyWidth(); ++i) off[i] = 0; off[p->keyWidth()] = 1; // (0, 1) is eof marker if (dump() != 0) return -1; off = buf; // first key has 0 compression dup = 0; fragment = len; } for (int i = p->keyWidth()-1; i >= 0; --i) { ((unsigned char*)off)[i] = len; len >>= 8; } off += p->keyWidth(); *off = dup; ++off; memcpy(off, key+dup, fragment); off += fragment; // std::cout << "Position: " << long(off - buf) << " from 0." << std::endl; return 0; } int Transaction::finish() { if (off != buf) { for (unsigned int i = 0; i < p->keyWidth(); ++i) off[i] = 0; off[p->keyWidth()] = 1; // (0, 1) is eof marker if (dump() != 0) return -1; } if (p->synced()) return fsync(fd); else return 0; } } lurker-2.3/libesort/dump.cpp0000644000175000017500000000300711267074431013104 00000000000000/* $Id: dump.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * dump.cpp - Dump the contents of a libesort database to cout * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "esort.h" #include #include #include #include using namespace std; using namespace ESort; int main(int argc, char** argv) { if (argc != 2) { cerr << "Syntax: " << argv[0] << " \n" << endl; return 1; } auto_ptr r(Reader::opendb(argv[1])); if (!r.get()) { perror("Reader::opendb"); return 1; } auto_ptr w(r->seek("", Forward)); while (w->advance() != -1) cout << w->key << "\n"; if (errno != 0) { perror("Walker::advance"); return 1; } return 0; } lurker-2.3/libesort/File.h0000644000175000017500000000332611267074431012467 00000000000000/* $Id: File.h 1649 2009-10-19 14:35:01Z terpstra $ * * Master.h - Disk segment for commit'd inserts * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FILE_H #define FILE_H #include #include "esort.h" namespace ESort { class Source; class FileSource; inline int categorize(long records) { return static_cast(floor(log(static_cast(records+2))/log(2))); } class File { protected: int fd; const Parameters* p; long where; public: /** Use this file descriptor for operation */ File(const string& id = "", int fd_ = -1, const Parameters* p_ = 0); File(const File& o); ~File(); // closes fd /** The id of the database. */ string id; /** The number of blocks in this file */ long blocks; /** The classification based on size for this file */ int category; /** Always succeeds */ auto_ptr openBlock(long block, bool forward); friend class FileSource; }; } #endif lurker-2.3/libesort/Merger.cpp0000644000175000017500000001427411267074431013370 00000000000000/* $Id: Merger.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Merger.cpp - Combine segments to obtain a database view * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "io.h" #include "Merger.h" #include "Source.h" #include #include namespace ESort { Walker::~Walker() { } Merger::~Merger() { for (Sources::iterator i = sources.begin(); i != sources.end(); ++i) delete i->source; } int Merger::real_advance() { // Did we last consume an empty queue? if (point == eov) { if (restart != 0) { // tell the user the first element is there point = restart; restart = 0; return 0; } else { // we are at the eof errno = 0; return -1; } } if (point == bov) { // No need to correct the base-case; always right. ++point; } // Correct the compression for min. Source* fix = (point-1)->min; unsigned int upto; if (fix->length > key.length()) upto = key.length(); else upto = fix->length; while (fix->dup < upto && fix->tail[0] == ((unsigned char)key[fix->dup])) { ++fix->tail; ++fix->dup; } // Correct the invariant to the eov while (point != eov) { // First, fix compression fix = point->source; if (fix->length > key.length()) upto = key.length(); else upto = fix->length; while (fix->dup < upto && fix->tail[0] == ((unsigned char)key[fix->dup])) { ++fix->tail; ++fix->dup; } // Now update the invariant. // Logically we are doing: // if (point->key < (point-1)->min->key) // point->min = point; // else point->min = (point-1)->min; Source* ms = (point-1)->min; Source* ps = point->source; // The key with the most in common must be smaller // (it must be larger if going backwards too) if (ps->dup < ms->dup) { // min has more in common! point->min = ms; } else if (ps->dup > ms->dup) { // point has more in common point->min = ps; } else { // string compare const unsigned char* mt = ms->tail; const unsigned char* pt = ps->tail; unsigned int ml = ms->length - ms->dup; unsigned int pl = ps->length - ps->dup; const unsigned char* me = mt; if (ml < pl) me += ml; else me += pl; while (mt != me && *mt == *pt) { ++mt; ++pt; } if (*mt < *pt) { // min is smaller. point->min = forward ? ms : ps; } else if (*mt > *pt) { // point is smaller point->min = forward ? ps : ms; } else if (ml < pl) { // point is longest, so min is smaller point->min = forward ? ms : ps; } else { point->min = forward ? ps : ms; } } ++point; } // Find the smallest element via pointer comparison while (1) { // Move back a step, the range satisfies the invariant. --point; // Is this the smallest? Source* s; if (point->min == (s = point->source)) { // Consume this record. This invalidates the invariant // for all records higher than here. // Move it in place key.resize(s->dup); // key.reserve(s->length); // std::string compares like it is unsigned. // so tail is kept as unsigned so we compare like // std::string, however, we thus need to cast it. key.append( reinterpret_cast(s->tail), s->length - s->dup); int out = s->dup; if (s->advance() != 0) { // Pass the error through if (errno != 0) return -1; // This entry is empty. Sources::iterator i = sources.begin(); i += int(point - bov); // This may relocate the vector. delete i->source; sources.erase(i); // Correct ptrs bov = &*sources.begin(); eov = bov + sources.size(); point = bov; if (point != eov) { point->min = point->source; } } return out; } } } int Merger::advance() { while (1) { int out = real_advance(); // Eliminate duplicates. if (unique && out == (int)key.length()) { if (key.length() == 0 && didempty == false) { // output the empty string once didempty = true; return out; } } else { return out; } } } int Merger::skiptill(const string& k, bool forward) { bov = &*sources.begin(); eov = bov + sources.size(); point = bov; restart = 0; if (point != eov) { // establish invariant for the base node point->min = point->source; } if (forward) { // !!! this can be much quicker while (advance() != -1) { if (key >= k) { restart = point; point = eov; return 0; } } } else { while (advance() != -1) { if (key < k) { restart = point; point = eov; return 0; } // else std::cout << "SKIP: " << key << std::endl; } } return -1; } int PrefixMerger::advance() { int o; switch (state) { case pSKIP: // pass through during skiptill return Merger::advance(); case pFIRST: Merger::advance(); state = pPART; return 0; case pPART: o = Merger::advance(); if (o >= minDup) return o; if (o == -1) return -1; state = pEOF; // pass through case pEOF: errno = 0; return -1; default: assert (0); errno = EINVAL; return -1; } } int PrefixMerger::skiptill(const string& pfx, const string& x, bool forward) { // First get in position if (Merger::skiptill(pfx + x, forward) != 0) return -1; // This much must be in common minDup = pfx.length(); state = pFIRST; // Use the fact we already loaded the first key if (key.substr(0, minDup) != pfx) { // already hit eof state = pEOF; } return 0; } } lurker-2.3/libesort/Source.h0000644000175000017500000000325011267074431013044 00000000000000/* $Id: Source.h 1649 2009-10-19 14:35:01Z terpstra $ * * Source.h - Common segment interface * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SOURCE_H #define SOURCE_H namespace ESort { /** One of the database fragments. */ class Source { public: virtual ~Source(); /** The tail of the returned key. * The length is for the whole key. * The tail includes only what is not compressed. * -- these are not initialized till first call of advance * * The tail MUST be unsigned. Why? Because std::string compares * as though it were unsigned. ie: '\0x7f' < '\0x80' even though * if it were really lexicographical compare it wouldn't. */ const unsigned char* tail; unsigned long length; unsigned int dup; // amount in common with last /** Advance to the next key in the source. * -1 on error, errno = 0 -> eof. */ virtual int advance() = 0; }; } #endif lurker-2.3/libesort/Memory.h0000644000175000017500000000314211267074431013054 00000000000000/* $Id: Memory.h 1649 2009-10-19 14:35:01Z terpstra $ * * Memory.h - Memory segment for inserts prior to commit * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef MEMORY_H #define MEMORY_H #include "esort.h" #include namespace ESort { class Source; class Parameters; class Memory { protected: typedef std::multiset Data; Data data; public: /** Insert a key into the memory. */ void insert(const string& k) { data.insert(k); } /** Flush out memory after commit. */ void flush() { data.clear(); } /** Empty? */ bool empty() { return data.empty(); } /** Summarize the size used. */ int category(const Parameters& p) const; /** Find the first key >= k. * Always succeeds */ auto_ptr openMemory(const string& k, bool forward); }; } #endif lurker-2.3/libesort/Makefile.am0000644000175000017500000000053011267070016013460 00000000000000noinst_LIBRARIES = libesort.a libesort_a_SOURCES = \ Parameters.cpp Memory.cpp File.cpp Source.cpp Transaction.cpp \ Merger.cpp Failer.cpp View.cpp Master.cpp DbMan.cpp \ DbMan.h Failer.h File.h Master.h Memory.h Merger.h Source.h \ Transaction.h View.h esort.h io.h noinst_PROGRAMS = dump dump_SOURCES = dump.cpp dump_LDADD = libesort.a lurker-2.3/libesort/View.h0000644000175000017500000000314611267074431012522 00000000000000/* $Id: View.h 1649 2009-10-19 14:35:01Z terpstra $ * * View.h - Snapshot of commit state * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef VIEW_H #define VIEW_H #include "esort.h" #include "Merger.h" #include "File.h" #include namespace ESort { class Merger; class View : public Reader { public: struct FileOrder { bool operator() (const File& x, const File& y) const { return x.category < y.category; } }; typedef std::multiset Files; Parameters params; View(const Parameters& p) : params(p) { } /** Collection of all files open - in INcreasing size. */ Files files; int rawseek(Merger* out, const string& k, bool forward); auto_ptr seek(const string& k, Direction dir); auto_ptr seek(const string& pfx, const string& k, Direction dir); }; } #endif lurker-2.3/libesort/Master.h0000644000175000017500000000267711267074431013053 00000000000000/* $Id: Master.h 1649 2009-10-19 14:35:01Z terpstra $ * * Master.h - Coordinate commit+read interface * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef MASTER_H #define MASTER_H #include "esort.h" #include "Memory.h" #include "View.h" #include "DbMan.h" namespace ESort { class Transaction; class Master : public Writer { protected: View view; Memory memory; DbMan man; public: Master(const Parameters& p); ~Master(); int init(const string& db, int mode); int commit(); int insert(const string& k); auto_ptr seek(const string& k, Direction dir); auto_ptr seek(const string& pfx, const string& k, Direction dir); }; } #endif lurker-2.3/libesort/Transaction.h0000644000175000017500000000302511267074431014071 00000000000000/* $Id: Transaction.h 1649 2009-10-19 14:35:01Z terpstra $ * * Transaction.h - Write buffer for a commit * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef TRANSACTION_H #define TRANSACTION_H namespace ESort { class Parameters; class Transaction { protected: int fd; const Parameters* p; unsigned char* buf; unsigned char* eof; unsigned char* off; /** Dump the buffer. */ int dump(); public: /** Write to this file descriptor. * We do NOT assume responsibility for closing the file!! */ Transaction(int fd_, const Parameters* p_); ~Transaction(); /** Output this to the file, 0 = success */ int write(long len, int dup, const char* key); /** Finalize the file, 0 = success */ int finish(); }; } #endif lurker-2.3/libesort/Merger.h0000644000175000017500000000511111267074431013023 00000000000000/* $Id: Merger.h 1649 2009-10-19 14:35:01Z terpstra $ * * Merger.h - Combine segments to obtain a database view * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef MERGER_H #define MERGER_H #include "esort.h" #include namespace ESort { class Source; class Merger : public Walker { protected: struct Element { Source* source; Source* min; Element(Source* s) : source(s), min(0) { } }; typedef std::vector Sources; bool unique; bool forward; bool didempty; /** Invariant: * for sources.begin() <= j < point: * j->min->key = min { k->key: sources.begin() <= k <= j } */ Sources sources; Element* point; Element* bov; Element* eov; Element* restart; int real_advance(); public: Merger(bool unique_, bool forward_) : unique(unique_), forward(forward_), didempty(false) { } ~Merger(); /* deletes all sources */ /** Add a Source to those which the merger merges. * Please add Sources in increasing magnitude. * Ensure that the source has been pre-advanced! * You must guaranteed s->dup == 0. * Never merge on something which is at EOF! */ void merge(Source* source) { // assert (source->dup == 0 && source->tail != 0); sources.push_back(source); } /* Implement the advance method. */ int advance(); /** Skip until we have something >= k * 0 on success, -1 on error. */ int skiptill(const string& k, bool forward); }; class PrefixMerger : public Merger { protected: enum State { pSKIP, pFIRST, pPART, pEOF } state; long minDup; public: PrefixMerger(bool unique_, bool forward_) : Merger(unique_, forward_), state(pSKIP) { } int advance(); // overload with the prefix test. int skiptill(const string& pfx, const string& k, bool forward); }; } #endif lurker-2.3/libesort/DbMan.cpp0000644000175000017500000001755011267074431013130 00000000000000/* $Id: DbMan.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * DbMan.cpp - Manage the commit'd segments and parameters * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 // #define DEBUG 1 #include "DbMan.h" #include "esort.h" #include "View.h" #include #include namespace ESort { static int shared_file_lock(int fd) { #ifdef LOCK_SH if (flock(fd, LOCK_SH) != 0) return -1; #else #ifdef F_SETLK struct flock lock; memset(&lock, 0, sizeof(lock)); lock.l_type = F_RDLCK; lock.l_whence = SEEK_SET; if (fcntl(fd, F_SETLKW, &lock) != 0) return -1; #endif #endif #ifdef DEBUG cout << "+ " << getpid() << " SHARE LOCK!" << endl; #endif return 0; } static int exclusive_file_lock(int fd) { #ifdef LOCK_EX if (flock(fd, LOCK_EX) != 0) return -1; #else #ifdef F_SETLK struct flock lock; memset(&lock, 0, sizeof(lock)); lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; if (fcntl(fd, F_SETLKW, &lock) != 0) return -1; #endif #endif #ifdef DEBUG cout << "+ " << getpid() << " OWN LOCK!" << endl; #endif return 0; } static int unlock_file_lock(int fd) { #ifdef LOCK_UN if (flock(fd, LOCK_UN) != 0) return -1; #else #ifdef F_SETLK struct flock lock; memset(&lock, 0, sizeof(lock)); lock.l_type = F_UNLCK; lock.l_whence = SEEK_SET; if (fcntl(fd, F_SETLKW, &lock) != 0) return -1; #endif #endif #ifdef DEBUG cout << "- " << getpid() << " RELEASED LOCK!" << endl; #endif return 0; } DbMan::DbMan() : dbname(), dbfile(0), cmode(0), dirfd(-1), dblock(-1) { } DbMan::~DbMan() { if (dbfile) fclose(dbfile); if (dblock != -1) unlock_database_rw(); if (dirfd != -1) close(dirfd); } int DbMan::qualify(string& db) { char buf[10240]; string::size_type slash = db.rfind('/'); string name, path; if (slash != string::npos) { getcwd(buf, sizeof(buf)); string old(buf); int cd = chdir(db.substr(0, slash).c_str()); if (cd != 0) return -1; getcwd(buf, sizeof(buf)); path = buf; path += "/"; name = db.substr(slash+1, string::npos); chdir(old.c_str()); } else { getcwd(buf, sizeof(buf)); path = buf; path += "/"; name = db; } db = path + name; return 0; } int DbMan::scanFile(Parameters& p) { int version; long blockSize, keySize; char id[80]; #ifdef DEBUG cout << " ??? " << getpid() << " SCANNING FILE" << endl; #endif rewind(dbfile); if (fscanf(dbfile, "%d %ld %ld", &version, &blockSize, &keySize) != 3) return -1; p = Parameters(p.synced(), p.unique(), version, blockSize, keySize); ids.clear(); fgets(id, sizeof(id), dbfile); // eat eof while (fgets(id, sizeof(id), dbfile) != 0) { string i = id; if (i[i.length()-1] == '\n') i.resize(i.length()-1); ids.insert(i); } return 0; } int DbMan::snapshot(View& view) { if (scanFile(view.params) != 0) return -1; view.files.clear(); for (std::set::iterator i = ids.begin(); i != ids.end(); ++i) { string name = dbname + "." + *i; int fd = open(name.c_str(), O_RDONLY); // std::cout << "opening: " << name << ": " << fd << std::endl; if (fd == -1) return -1; view.files.insert(File(*i, fd, &view.params)); } return 0; } int DbMan::dbopen(View& view, const string& db) { assert (dbname == ""); dbname = db; if (qualify(dbname) != 0) return -1; dbfile = fopen(dbname.c_str(), "r"); if (dbfile == 0) return -1; int ok = lock_snapshot_ro(); if (ok != 0) return ok; Parameters x = view.params; view.params = Parameters::minimize(x); if (snapshot(view) != 0) { int o = errno; unlock_snapshot_ro(); errno = o; return -1; } else { unlock_snapshot_ro(); if (x.isWider(view.params)) { errno = EINVAL; return -1; } else { return 0; } } } int DbMan::dbopen(View& view, const string& db, int mode) { assert (dbname == ""); dbname = db; cmode = mode; if (qualify(dbname) != 0) return -1; if (lock_database_rw() != 0) return -1; int fd = open(dbname.c_str(), O_RDWR | O_CREAT, cmode); if (fd == -1) return -1; dbfile = fdopen(fd, "r+"); assert (dbfile != 0); string dirname(dbname, 0, dbname.rfind('/')); dirfd = open(dirname.c_str(), O_RDONLY); // ignore the error; some OSes don't allow opening directories // We must lock rw since we may generate it int ok = lock_snapshot_rw(); if (ok != 0) return ok; fseek(dbfile, 0, SEEK_END); bool empty = ftell(dbfile) == 0; if (empty) { fprintf(dbfile, "%d %ld %ld\n", view.params.version(), view.params.blockSize(), view.params.keySize()); fflush(dbfile); unlock_snapshot_rw(); return 0; } else { // not empty Parameters x = view.params; view.params = Parameters::minimize(x); if (snapshot(view) != 0) { int o = errno; if (o == 0) o = EINVAL; unlock_snapshot_rw(); errno = o; return -1; } else { unlock_snapshot_rw(); if (x.isWider(view.params)) { errno = EINVAL; return -1; } else { return 0; } } } } int DbMan::lock_snapshot_ro() { assert (dbfile != 0); return shared_file_lock(fileno(dbfile)); } void DbMan::unlock_snapshot_ro() { assert (dbfile != 0); unlock_file_lock(fileno(dbfile)); } int DbMan::lock_snapshot_rw() { assert (dbfile != 0); return exclusive_file_lock(fileno(dbfile)); } void DbMan::unlock_snapshot_rw() { assert (dbfile != 0); unlock_file_lock(fileno(dbfile)); } int DbMan::lock_database_rw() { assert (dbname != "" && dblock == -1); string name = dbname + ".writer"; dblock = open(name.c_str(), O_RDWR | O_CREAT, cmode); if (dblock == -1) return -1; return exclusive_file_lock(dblock); } void DbMan::unlock_database_rw() { if (dblock == -1) return; unlock_file_lock(dblock); close(dblock); dblock = -1; } int DbMan::commit(const Parameters& p, const std::set& nids) { assert (dblock != -1); // must be lock_database_rw'd int ok = lock_snapshot_rw(); if (ok != 0) return ok; // make sure the new file is on stable storage if (p.synced()) if (dirfd != -1) fsync(dirfd); // sync the directory #ifdef DEBUG cout << " !!! " << getpid() << " COMMITING FILE" << endl; #endif // The underlying assumption here is that these calls all fit // within one block and thus can't fail. This should be valid for // even grossly enoromous databases on puny systems. rewind(dbfile); fprintf(dbfile, "%d %ld %ld\n", p.version(), p.blockSize(), p.keySize()); for (std::set::const_iterator i = nids.begin(); i != nids.end(); ++i) fprintf(dbfile, "%s\n", i->c_str()); if (fflush(dbfile) != 0 || ftruncate(fileno(dbfile), ftell(dbfile)) != 0) { unlock_snapshot_rw(); return -1; } ids = nids; // make sure the new summary is on stable storage (since it old // stuff gets unlinked on return) if (p.synced()) fsync(fileno(dbfile)); unlock_snapshot_rw(); return 0; } int DbMan::openNew(string& id) { char ext[4]; ext[0] = 'i'; ext[3] = 0; do { ext[1] = 'a' + (random() % 26); ext[2] = 'a' + (random() % 26); } while (ids.find(ext) != ids.end()); string name = dbname + "." + ext; int fd = open(name.c_str(), O_RDWR | O_CREAT | O_TRUNC, cmode); id = ext; return fd; } int DbMan::killSub(const string& id) { string name = dbname + "." + id; if (unlink(name.c_str()) != 0) return -1; return 0; } } lurker-2.3/libesort/Parameters.cpp0000644000175000017500000000313111267074431014240 00000000000000/* $Id: Parameters.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Parameters.cpp - Control how the database is stored * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "esort.h" #include #include namespace ESort { Parameters::Parameters( bool synced, bool unique, unsigned int version, unsigned long blockSize, unsigned long keySize) : version_(version), blockSize_(blockSize), keySize_(keySize), unique_(unique), synced_(synced) { assert (keySize_ > 0); assert (keySize_ * 8 <= blockSize_); keyWidth_ = static_cast( ceil( log(static_cast(keySize_)) / log(256) )); } bool Parameters::isWider(const Parameters& p) { return version_ > p.version_ || blockSize_ > p.blockSize_ || keySize_ > p.keySize_; } } lurker-2.3/libesort/Failer.cpp0000644000175000017500000000207611267074431013346 00000000000000/* $Id: Failer.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Failer.cpp - Output an error on advance * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "Failer.h" #include namespace ESort { int Failer::advance() { errno = out_errno; return -1; } } lurker-2.3/libesort/File.cpp0000644000175000017500000001343111267074431013020 00000000000000/* $Id: File.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * File.cpp - Disk segment for commit'd inserts * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "io.h" #include "File.h" #include "Source.h" #include "esort.h" /* #define DEBUG */ #include #include #include namespace ESort { class FileSource : public Source { protected: File* f; long block; unsigned char* buf; unsigned char* off; bool forward; unsigned char* inverseBuffer(); public: FileSource(File* f_, long block_, bool forward_); ~FileSource(); int loadBuf(); int advance(); }; FileSource::FileSource(File* f_, long block_, bool forward_) : f(f_), block(block_), buf(new unsigned char[f->p->blockSize()]), off(0), forward(forward_) { } FileSource::~FileSource() { delete [] buf; } int FileSource::loadBuf() { assert (block <= f->blocks && block >= -1); if (forward) { if (block == f->blocks) { // hit eof errno = 0; return -1; } } else { if (block == -1) { // hit eof errno = 0; return -1; } } if (f->where != block) { off_t go = block; go *= f->p->blockSize(); if (lseek(f->fd, go, SEEK_SET) != go) { #ifdef DEBUG perror(__FILE__ ":" #__LINE__ ": lseek"); #endif // keep errno return -1; } } if (read(f->fd, buf, f->p->blockSize()) != (ssize_t)f->p->blockSize()) { #ifdef DEBUG perror(__FILE__ ":" #__LINE__ ": read"); #endif if (errno == 0) errno = EAGAIN; // something obviously wrong return -1; } if (forward) { f->where = ++block; off = buf; } else { f->where = block+1; --block; off = inverseBuffer(); // flip the order of the records } return 0; } unsigned char* FileSource::inverseBuffer() { unsigned char* target = new unsigned char[f->p->blockSize()]; unsigned char* scratch = new unsigned char[f->p->keySize()]; unsigned char* r = buf; unsigned char* w = target + f->p->blockSize(); long thisLength, nextLength; // total key length long thisDup, nextDup; // amount in common long thisDelta, nextDelta; // amount unique //---------------- // teminate the scratch (0, 1) == eof --w; *w = 1; w -= f->p->keyWidth(); memset(w, 0, f->p->keyWidth()); thisLength = 0; for (unsigned int i = 0; i < f->p->keyWidth(); ++i) { thisLength <<= 8; thisLength += *r; ++r; } thisDup = *r; ++r; thisDelta = thisLength - thisDup; if (thisDelta < 0) return w; // corrupt! must have one record at least while (thisDelta != -1) { // r points at the unique tail // w point at the last completed record // Read the next record's values nextLength = 0; unsigned char* nextr = r + thisDelta; for (unsigned int i = 0; i < f->p->keyWidth(); ++i) { nextLength <<= 8; nextLength += *nextr; ++nextr; } nextDup = *nextr; ++nextr; nextDelta = nextLength - nextDup; if (nextDelta < -1) return w; // corrupt! (-1 == eof) if (nextDelta == -1) nextDup = 0; // first record has 0 dup'd // Skip to next cell long wDelta = thisLength - nextDup; unsigned char* tailw = w - wDelta; unsigned char* nextw = tailw - 1 - f->p->keyWidth(); // Write out the lengh for (int i = f->p->keyWidth()-1; i >= 0; --i) { nextw[i] = thisLength; thisLength >>= 8; } // We use nextDup for our dup *(tailw-1) = nextDup; // Now, write out the tail memcpy(scratch+thisDup, r, thisDelta); memcpy(tailw, scratch+nextDup, wDelta); // std::cout << " SCRATCH: "; // std::cout.write((const char*)scratch, thisDup + thisDelta); // std::cout << std::endl; // move along thisLength = nextLength; thisDup = nextDup; thisDelta = nextDelta; r = nextr; w = nextw; } delete [] scratch; delete [] buf; buf = target; return w; } int FileSource::advance() { // printf("off: %d, buf: %d, wid: %d\n", off, buf, f->p->keyWidth()); assert ((off - buf) + f->p->keyWidth() + 1 <= f->p->blockSize()); length = 0; while (1) { for (unsigned int i = 0; i < f->p->keyWidth(); ++i) { length <<= 8; length += *off; ++off; } dup = *off; ++off; if (length == 0) { if (dup == 0) break; // (0, 1) == eof assert (dup == 1); } else break; if (loadBuf() != 0) return -1; } tail = off; off += length - dup; // std::cout << " GET: " << length << ", " << dup << ": "; // std::cout.write((const char*)tail, length-dup); // std::cout << std::endl; return 0; } File::File(const string& id_, int fd_, const Parameters* p_) : fd(fd_), p(p_), where(0), id(id_) { off_t len = lseek(fd, 0, SEEK_END); assert (len % p->blockSize() == 0); where = blocks = len / p->blockSize(); category = categorize(blocks); } File::File(const File& f) : fd(dup(f.fd)), p(f.p), where(f.where), id(f.id), blocks(f.blocks), category(f.category) { } File::~File() { close(fd); } auto_ptr File::openBlock(long block, bool forward) { assert (block <= blocks); auto_ptr out(new FileSource(this, block, forward)); if (out->loadBuf() != 0) return auto_ptr(0); return auto_ptr(out); } } lurker-2.3/libesort/Memory.cpp0000644000175000017500000000501611267074431013411 00000000000000/* $Id: Memory.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Memory.cpp - Memory segment for inserts prior to commit * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "io.h" #include "Memory.h" #include "Source.h" #include "esort.h" #include "File.h" namespace ESort { class ForwardMemorySource : public Source { protected: typedef std::multiset Data; Data::iterator i, e; public: ForwardMemorySource(Data::iterator i_, Data::iterator e_) : i(i_), e(e_) { } int advance(); }; int ForwardMemorySource::advance() { // Test for eof if (i == e) { errno = 0; return -1; } // Return the key tail = reinterpret_cast(i->c_str()); length = i->length(); dup = 0; ++i; return 0; } class BackwardMemorySource : public Source { protected: typedef std::multiset Data; Data::iterator i, b; public: BackwardMemorySource(Data::iterator i_, Data::iterator b_) : i(i_), b(b_) { } int advance(); }; int BackwardMemorySource::advance() { // Test for eof if (i == b) { errno = 0; return -1; } // move to the next position --i; // Return the key tail = reinterpret_cast(i->c_str()); length = i->length(); dup = 0; return 0; } auto_ptr Memory::openMemory(const string& k, bool forward) { if (forward) return auto_ptr( new ForwardMemorySource(data.lower_bound(k), data.end())); else return auto_ptr( new BackwardMemorySource(data.lower_bound(k), data.begin())); } int Memory::category(const Parameters& p) const { long sum = 0; for (Data::const_iterator i = data.begin(); i != data.end(); ++i) sum += i->length(); return categorize((sum / p.blockSize()) + 1); //!!! +1 is evil } } lurker-2.3/libesort/View.cpp0000644000175000017500000001037511267074431013057 00000000000000/* $Id: View.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * View.cpp - Snapshot of commit state * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "io.h" #include "View.h" #include "Merger.h" #include "Source.h" #include "File.h" #include "DbMan.h" #include "Failer.h" #include #include namespace ESort { int View::rawseek(Merger* out, const string& k, bool forward) { /* The goal is to find the last sector in each file whose first key * is < k. If we are forward reading, merging from here makes no * mistakes since the first key >= lies ahead. If we are backward * reading, merging from here makes no mistakes since the first * key not in the sector is >= k and thus too big for it. */ // Push in decreasing size for (Files::iterator i = files.begin(); i != files.end(); ++i) { /* Binary search till we find key */ int stop = 0; long left = 0; long right = i->blocks; long mid = -1; std::auto_ptr s(0); // consider starting s at [left, right) while ((right - left) > 1) { // mid is rounded down -> mid < right mid = (left + right) / 2; // Use a temporary to work around g++ 2.95 brokenness auto_ptr st(const_cast(&*i)->openBlock(mid, true)); s = st; if (!s.get()) return -1; // eof is impossible since mid < right if ((stop = s->advance()) == -1) return -1; if (s->dup != 0) // first key; no compression { errno = EINVAL; return -1; } if (string( // std::string compares like unsigned char reinterpret_cast(s->tail), s->length) >= k) right = mid; else left = mid; } if (forward && mid != left) // s hold mid { // Work around g++ 2.95 bug auto_ptr st(const_cast(&*i)->openBlock(left, true)); s = st; if (!s.get()) return -1; // empty File is impossible if ((stop = s->advance()) == -1) { if (errno == 0) errno = EINVAL; return -1; } } else if (!forward) { // Work around g++ 2.95 bug auto_ptr st(const_cast(&*i)->openBlock(left, false)); s = st; if (!s.get()) return -1; // empty File is impossible if ((stop = s->advance()) == -1) { if (errno == 0) errno = EINVAL; return -1; } } if (s->dup != 0) { // must be uncompressed! errno = EINVAL; return -1; } out->merge(s.release()); } return 0; } auto_ptr View::seek(const string& k, Direction dir) { assert (dir == Forward || dir == Backward); auto_ptr out(new Merger(params.unique(), dir == Forward)); if (rawseek(out.get(), k, dir == Forward) != 0) return auto_ptr(new Failer(errno)); if (out->skiptill(k, dir == Forward) == -1) return auto_ptr(new Failer(errno)); return auto_ptr(out); } auto_ptr View::seek(const string& pfx, const string& k, Direction dir) { assert (dir == Forward || dir == Backward); auto_ptr out(new PrefixMerger(params.unique(), dir == Forward)); if (rawseek(out.get(), pfx + k, dir == Forward) != 0) return auto_ptr(new Failer(errno)); if (out->skiptill(pfx, k, dir == Forward) == -1) return auto_ptr(new Failer(errno)); return auto_ptr(out); } auto_ptr Reader::opendb(const string& db, const Parameters& p) { DbMan man; auto_ptr out(new View(p)); if (man.dbopen(*out.get(), db) != 0) return auto_ptr(0); return auto_ptr(out); } Reader::~Reader() { } } lurker-2.3/libesort/Source.cpp0000644000175000017500000000200511267074431013374 00000000000000/* $Id: Source.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * Source.cpp - Common segment interface * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "Source.h" namespace ESort { Source::~Source() { } } lurker-2.3/libesort/io.h0000644000175000017500000000205711267074431012217 00000000000000/* $Id: io.h 1649 2009-10-19 14:35:01Z terpstra $ * * io.h - I/O headers needed for the OS * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include lurker-2.3/Makefile.in0000644000175000017500000005026711272632673011673 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/apache.conf.in \ $(srcdir)/config.h.in $(srcdir)/lurker.conf.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ tools/depcomp tools/install-sh tools/missing \ tools/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = lurker.conf apache.conf SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = mymime libesort common index prune render ui imgs . EXTRA_DIST = FAQ all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 lurker.conf: $(top_builddir)/config.status $(srcdir)/lurker.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ apache.conf: $(top_builddir)/config.status $(srcdir)/apache.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d $(distdir) || mkdir $(distdir) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-data-local install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-data-local install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am install-data-local: $(mkinstalldirs) $(DESTDIR)$(default_config_dir) @echo @echo "*** PLEASE READ ***" @echo @echo "Lurker config files have not been installed (for your protection)" @echo "If you would like the default config files installed, run:" @echo " make install-config" @echo @echo "*** PLEASE READ ***" @echo install-config: $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/$(PACKAGE) if ! test -f $(DESTDIR)$(localstatedir)/lib/$(PACKAGE)/db; then \ echo 1 8192 255 > $(DESTDIR)$(localstatedir)/lib/$(PACKAGE)/db; \ fi $(mkinstalldirs) $(DESTDIR)$(default_config_dir) $(INSTALL_DATA) lurker.conf apache.conf $(DESTDIR)$(default_config_dir) @echo @echo "Now put 'include $(default_config_dir)/apache.conf' in your apache config" @echo "And don't forget to setup a cron job as described in the INSTALL file" # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/acinclude.m40000644000175000017500000000633011267070017011777 00000000000000# AC_SEARCH_HEADER_DIRS(HEADER-FILE, SEARCH-DIRS, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [INCLUDES]) AC_DEFUN([AC_SEARCH_HEADER_DIRS], [AS_VAR_PUSHDEF([ac_Header], [ac_cv_header_$1])dnl AC_CACHE_CHECK([for $1], ac_Header, [ac_header_search_save_CPPFLAGS=$CPPFLAGS AS_VAR_SET(ac_Header, no) AC_COMPILE_IFELSE([AC_LANG_SOURCE([AC_INCLUDES_DEFAULT([$5]) @%:@include <$1>])], [AS_VAR_SET(ac_Header, standard)]) if test AS_VAR_GET(ac_Header) = no; then for ac_inc in $2; do CPPFLAGS="-I$ac_inc $ac_header_search_save_CPPFLAGS" AC_COMPILE_IFELSE([AC_LANG_SOURCE([AC_INCLUDES_DEFAULT([$5]) @%:@include <$1>])], [AS_VAR_SET(ac_Header, -I$ac_inc) break]) done fi CPPFLAGS=$ac_header_search_save_CPPFLAGS]) AS_IF([test AS_VAR_GET(ac_Header) != no], [test AS_VAR_GET(ac_Header) = standard || CPPFLAGS="AS_VAR_GET(ac_Header) $CPPFLAGS" $3], [$4])dnl AS_VAR_POPDEF([ac_Header])dnl ]) # AC_SEARCH_EXPRESSION_LIBS(EXPR, SEARCH-LIBS, [INCLUDES] # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) AC_DEFUN([AC_SEARCH_EXPRESSION_LIBS], [AS_VAR_PUSHDEF([ac_Expression], [ac_cv_expression_$1])dnl AC_CACHE_CHECK([how $1 links], ac_Expression, [ac_expression_search_save_LIBS=$LIBS AS_VAR_SET(ac_Expression, no) AC_LINK_IFELSE([AC_LANG_PROGRAM([$3],[$1])], [AS_VAR_SET(ac_Expression, "standard")]) if test "AS_VAR_GET(ac_Expression)" = "no"; then for ac_lib in $2; do LIBS="-l$ac_lib $6 $ac_expression_search_save_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([$3], [$1])], [AS_VAR_SET(ac_Expression, -l$ac_lib) break]) done fi LIBS=$ac_expression_search_save_LIBS]) AS_IF([test "AS_VAR_GET(ac_Expression)" != "no"], [test "AS_VAR_GET(ac_Expression)" = "standard" || LIBS="AS_VAR_GET(ac_Expression) $LIBS" $4], [$5])dnl AS_VAR_POPDEF([ac_Expression])dnl ]) # AC_SEARCH_CLASS_LIBS(CLASS, SEARCH-LIBS, [INCLUDES] # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) AC_DEFUN([AC_SEARCH_CLASS_LIBS], [AC_CACHE_CHECK([for library containing class $1], [ac_cv_class_$1], [ac_class_search_save_LIBS=$LIBS ac_cv_class_$1=no AC_LINK_IFELSE([AC_LANG_PROGRAM([$3],[$1 foobar])], [ac_cv_class_$1="none required"]) if test "$ac_cv_class_$1" = no; then for ac_lib in $2; do LIBS="-l$ac_lib $6 $ac_class_search_save_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([$3], [$1 foobar])], [ac_cv_class_$1="-l$ac_lib" break]) done fi LIBS=$ac_class_search_save_LIBS]) AS_IF([test "$ac_cv_class_$1" != no], [test "$ac_cv_class_$1" = "none required" || LIBS="$ac_cv_class_$1 $LIBS" $4], [$5])dnl ]) AC_DEFUN([AC_DEFINE_DIR], [prefix_backup="$prefix" exec_prefix_backup="$exec_prefix" ac_define_dir_result="$2" if test "x${prefix}" = "xNONE"; then prefix="${ac_default_prefix}"; fi if test "x${exec_prefix}" = "xNONE"; then exec_prefix="${prefix}"; fi while echo "$ac_define_dir_result" | grep '\$' >/dev/null; do ac_define_dir_result=`eval echo $ac_define_dir_result` done prefix="${prefix_backup}" exec_prefix="${exec_prefix}" $1="$ac_define_dir_result" AC_SUBST($1) ]) lurker-2.3/lurker.conf.in0000644000175000017500000002167111267070017012373 00000000000000 # Lurker configuration file (lurker.conf). # Install as @DEFAULT_CONFIG_DIR@/@PACKAGE@.conf on your system. ############################################################################# # Global configuration ############################################################################# # The name lurker uses to refer to the archive. # # This will be displayed at the top-right of every page. # Clicking on it will return the user to the front page. # Since it is up top, you should try to keep it relatively short. # The example below is about the maximum string length you should consider. archive = Some Mailing List Archive # You can also localize web viewable strings. # The most appropriate will be automatically selected when rendering. # # *** THE CHARSET MUST IN ALL CASES BE UTF-8 OR IT WON'T LOAD *** # # Some examples: # archive[de] = Einige Mailing-Lists # archive[pt] = ... # archive[pt-BR] = ... # The administrative contact information. # # This will be displayed at the bottom-right of every page. # Users can use this information to help you fix things on your archive. # However, using your private address is probably a bad idea due to spam. admin_name = Unconfigured admin_address = nill@bitbucket.org # The command invoked to transform xml into html. # # Lurker normally generates xml web pages from the database. # However, this is very badly supported in even mainstream browsers. # Thus lurker is designed to have the output xml transformed to html. # Default XSLT style-sheets are included with lurker for this purpose. # Lurker itself does not provide facilities to perform the XSLT transform. # This command is fed xml via stdin and expected to produce html on stdout. xslt = xsltproc --nonet - # The command invoked to delete a message. # # Lurker will feed a password from the UI into this command via stdin. # The substitution %c denotes the config file of the database to affect. # The substitution %i is the lurker message ID of the target email. # The recommended setup is to have a 'lurker' group owning /var/lib/lurker # Then for the example command to work, you must set 'gpasswd lurker'. # On some systems this is 'passwd -g lurker', there may be other variants. # Alternately, you can make the lurker db writable by the CGI. # Then use the second alternative after changing 'password'. delete_message = sg lurker -c "@BINDIR@/lurker-search -d -f -q -i -c %c %i" # delete_message = if test "password" = "`cat`"; then @BINDIR@/lurker-search -d -f -q -i -c %c %i; fi # The commands lurker uses to verify signatures. # # Lurker can optionally invoke a command to verify pgp signatures. # gpg can be used for this purpose although >= 1.2 is needed. # Personally I just keep a keyring of only keys which I trust. # Then gpg has no need to check trust or consult keyservers -> faster. # # The output of these commands is displayed in the signature block. # The output must be encoded with a charset of UTF-8. # The return status must be: 0 = ok, 1 = bad sig, other = unknown # The photo id (if any) should be output to provided photo filename. # The substitutions %s, %b, and %p are the signature, body, and photo. # # pgp_verify_mime = gpg # --keyring /usr/share/keyrings/debian-keyring.gpg # --no-default-keyring # --homedir /tmp # --always-trust # --no-secmem-warning # --batch # --quiet # --photo-viewer "cat %i >%p" # --verify-options show-photos # --charset utf-8 # --verify %s %b 2>&1 # pgp_verify_inline = gpg # --keyring /usr/share/keyrings/debian-keyring.gpg # --no-default-keyring # --homedir /tmp # --always-trust # --no-secmem-warning # --batch # --quiet # --photo-viewer "cat %i >%p" # --verify-options show-photos # --charset utf-8 # --verify %b 2>&1 # The directory where lurker keeps the database. # # This database directory should be writable by lurker-index. # It should be readable by lurker.cgi and lurker-prune. # Do not mess with the files in this directory on pain of death. # Before taking a backup, make sure your MTA has a frozen mail queue. # The path is taken relative to the location of the config file. dbdir = @LOCALSTATEDIR@/lib/@PACKAGE@ # The umask to use when creating files in the database. # # If this is unset, the umask from the environment of the user is used. # You would want to set this to make sure that permissions stay correct. # If you want a group writable db, use 002 and a setgid dbdir (rwxrwsr-x). # If you want a user only db, use 022 and a dbdir with rwxr-xr-x. # # db_umask = 002 # Include another file for additional configuration. # # If you have a large number of mailing lists it may help to group them. # One strategy to keep organised is to have one config file per group. # This also allows collaboratively maintained archives (different owners). # If a directory is specified, then all files ending in '.conf' are included. # The path is interpretted relative to the path of the including config file. # # include = another.conf # include = /etc/lurker/conf.d # Tell lurker to generate web cache. # # Normally, lurker writes request output to the www directory for caching. # Then repeated requests only need to be uploaded and not recomputed. # This additionally allows things like HEAD requests to check for changes. # However, the cache is only updated whenever lurker-prune is run. # If you are debugging your installation it may help to turn caching off. # # web_cache = on # Tell lurker to hide email addresses. # # Normally, lurker includes all email addresses in the source email message. # Some people feel that this helps spammers with email address harvesting. # However, removing addresses makes your archive less useful to visitors. # # This will also try to obscure email addresses found in message bodies. # This option will not affect display of mailing list or admin addresses. # # hide_email = off # Tell lurker to enable access to raw email data. # # Normally, lurker allows access to the raw contents of email messages. # With proper MIME settings, this enables replies from the archive web pages. # Attachments and other MIME components can also be retrieved by default. # These are all quite useful features for open policy lists. # However, if you intend to hide email addresses, or are concerned about # people contracting viruses from archived mails, turn this off. # # raw_email = on ############################################################################# # Mailing list configuration. ############################################################################# # Lurker needs to be told all of the lists you will be archiving here. # New mailing lists may be added at any time and the archive will adjust. # If you must remove a list, you will need to run lurker-regenerate. # # Mailing lists are collected into groups on the front page and for searching. # Each group has an id used for searches and a heading. # The id of a group must be a string containing only a-z 0-9 and -_. # If you need to move a mailing list to a new group, run this command: # lurker-search ml:listid -q -k gr:groupid # # Each mailing list must also have an id for searching. # These identifiers must be shorter than 128 bytes and simple like group ids. # Mailing lists may have a title, address, link, and description. # # Furthermore, you MUST specify the languages spoken on a mailing list. # If you change the language spoken on a list, this will only affect new mail. # If you need to tag old email to 'listid' as being french, run this command: # lurker-search ml:listid -q -k lang:fr # group = open-source # heading = Open-Source Mailing Lists # # # list = lurker-users # title[en] = Lurker-Users # title[de] = Lurkerbenutzer # language = en # address = lurker-users@lists.sourceforge.net # link = http://lists.sourceforge.net/lists/listinfo/lurker-users # # offline = true # set this, if you don't archive this list # # list = some-mixed-language-list # title = Some List # language = en # language = fr # posts are tagged as both english and french # language = ru # posts might be russian too! # description = A list for talking about the latest ___. # Please restrict posts to English, French, or # Russian. Thank you. ############################################################################# # Front-end configuration ############################################################################# # Lurker can manage multiple frontends/web interfaces. # A frontend always has (and is identified by) it's cache directory. # Each frontend specifies which lists/groups should be included. # This front-end will include all lists/groups frontend = @DEFAULT_WWW_DIR@ # Here are some more examples: # This front-end will include only the list lurker-users # frontend = /var/www/only-one # allow_list = lurker-users # This front-end will include all lists, except lurker-users # frontend = /var/www/all-but-one # deny_list = lurker-users # This front-end will include only group open-source, but omit lurker-users # frontend = /var/www/one-group-without-one-list # allow_group = open-source # deny_list = lurker-users lurker-2.3/tools/0000777000175000017500000000000011272633206011031 500000000000000lurker-2.3/tools/mkinstalldirs0000755000175000017500000000370411267070017013556 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here lurker-2.3/tools/install-sh0000755000175000017500000001572211267070017012757 00000000000000#!/bin/sh # # install - install a program, script, or datafile # # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd=$cpprog shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "$0: no input file specified" >&2 exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d "$dst" ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f "$src" ] || [ -d "$src" ] then : else echo "$0: $src does not exist" >&2 exit 1 fi if [ x"$dst" = x ] then echo "$0: no destination specified" >&2 exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d "$dst" ] then dst=$dst/`basename "$src"` else : fi fi ## this sed command emulates the dirname command dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp='' while [ $# -ne 0 ] ; do pathcomp=$pathcomp$1 shift if [ ! -d "$pathcomp" ] ; then $mkdirprog "$pathcomp" else : fi pathcomp=$pathcomp/ done fi if [ x"$dir_arg" != x ] then $doit $instcmd "$dst" && if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename "$dst"` else dstfile=`basename "$dst" $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename "$dst"` else : fi # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/#inst.$$# rmtmp=$dstdir/#rm.$$# # Trap to clean up temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Move or copy the file name to the temp name $doit $instcmd "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && # Now remove or move aside any old file at destination location. We try this # two ways since rm can't unlink itself on some systems and the destination # file might be busy for other reasons. In this case, the final cleanup # might fail but the new file should still install successfully. { if [ -f "$dstdir/$dstfile" ] then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi && # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } lurker-2.3/tools/depcomp0000755000175000017500000003176711267070017012337 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. This file always lives in the current directory. # Also, the AIX compiler puts `$object:' at the start of each line; # $object doesn't have directory information. stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" outname="$stripped.o" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Must come before tru64. # Intel's C compiler understands `-MD -MF file'. However # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^[^:]*: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a space and a tab in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 lurker-2.3/tools/missing0000755000175000017500000002403611267070017012350 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.4 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. You can get \`$1Help2man' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 lurker-2.3/INSTALL0000644000175000017500000001503711267070017010643 00000000000000Quick start =========== 0 Find and install development files for: g++ >= 3.2 - http://gcc.gnu.org/ zlib - http://www.gzip.org/zlib/ mimelib (kdenetwork) - ftp://download.uk.kde.org/pub/kde/stable/latest/src xsltproc (libxslt1) - http://xmlsoft.org/XSLT/ If you need to, lurker can be built using only g++ 2.95, however 3.2+ is recommended as the resulting binaries are much smaller and faster. If you do not want kdenetwork, you can also download mimelib separately from http://sourceforge.net/project/showfiles.php?group_id=8168 and tell lurker to compile it and statically link to it. xsltproc is not strictly required for lurker. It is not used during compile and is only used if your lurker.conf references it. However, it is the preferred method for rendering html, so we recommend installing it. For debian: apt-get install xsltproc libmimelib1-dev g++ zlib1g-dev 1 [flags] ./configure [options] To control the mimelib location, setting these options may help: --with-mimelib-local Use internal lurker/mimelib/* --with-mimelib-include=DIR Location of mimelib/message.h --with-mimelib-libname=LIB Try an alternative library name To control the zlib location, setting these options may help: --with-zlib-include=DIR Location of zlib.h --with-zlib-libname=LIB Try an alternative library name These settings also help control where lurker installs: --prefix=/usr Put programs in /usr/bin and /usr/lib/cgi-bin --localstatedir=/var Put db in /var/lib/lurker, web in /var/www/lurker --sysconfdir=/etc Put config files in /etc/lurker --with-default-www-dir=/var/www/lurker More specific control --with-default-config-dir=/etc/lurker Lurker finds config here by default --with-cgi-bin-dir=/usr/lib/cgi-bin Place cgi programs in another spot 2 make 3 make install (as root if you don't have permission) You may want to strip the binaries as they can be quite large. eg: strip -s /usr/lib/cgi-bin/*.cgi /usr/bin/lurker-* This will install these files: (with-cgi-bin [/usr/local/lib/cgi-bin])/*.cgi - The CGIs which power lurker - These must be placed such that the webserver can run them (default-www-dir [/usr/local/var/www])/* - The lurker content which must be web accessible - The subdirectories "attach, list, mbox, message, mindex, search, splash, thread, and zap" must all be writeable by whatever user executes lurker.cgi (bindir [/usr/local/bin])/lurker-* - Command-line utilities for importing email, cleaning cached web files, and interfacing with shell scripts (localstatedir [/usr/local/var])/lib/lurker/* - The lurker database directory where mail is imported to - The directory and its contents must be writeable by the user who runs lurker-index - This must be readable by the user who runs lurker.cgi If this is a new installation of lurker, try also: make install-config Then customize the template lurker.conf file. Make certain that lurker.cgi can modify /usr/local/var/www/lurker. If CGI programs run as www-data: chown -R www-data /usr/local/var/www/lurker Make certain that the CGI can read /usr/local/var/lib/lurker. Run 'lurker-index' with umask 002 to ensure it remains readable. lurker-index and lurker-prune (cronjob) modify /usr/local/var/lib/lurker. Make sure they have write access, but leave it accessible to the CGI. 4 Setup delivery of new mail to lurker-index For procmail and a simple one user install: :0 w * ^X-Mailing-List: .* | lurker-index -l japanese -m If you have a lurker group: Set 'db_umask = 002' in the lurker.conf file. chmod 02775 /usr/local/var/lib/lurker 5 Feed archived mail through lurker-index. lurker-index -l devel < debian-devel.mbox lurker-index -l devel -i debian-devel.maildir 6 Setup a cronjob to update the archive every 15 minutes If you are installing lurker system-wide, put this in /etc/cron.d/lurker: 0,15,30,45 * * * * www-data lurker-prune If you are installing lurker in your home directory, add: 0,15,30,45 * * * * lurker-prune This must be run with the ability to read and delete files from the web-server cache directory. If you don't configure this correctly, new email will not appear in your archive. 7 Configure your webserver. If you are using apache, and ran 'make install-config', then you should just need to put 'include /usr/local/etc/lurker/apache.conf' in your apache configuration. You will also need to enable mod_rewrite. To keep the hostname listed in cached HTML consistent, you might want to give your server a specific name and instruct it to always use this name for self-referencing URLs. In apache this is done with: ServerName www.mydomain.com UseCanonicalName on The following instructions apply to users of other web servers: You must make certain that .xsl and .xml files have type text/xml. You must set the default charset to UTF-8 for these files. You must make lurker your 404 error handler or another way of creating missing cache files (eg: apache's RewriteRule). You must pass the configured frontend to lurker.cgi in the QUERY_STRING. For example, invoking lurker as: 'lurker.cgi?/usr/local/var/www/lurker' will probably set this variable for you. Here are some samples of how to configure lurker with apache: (If you actually run apache, use the supplied config file instead!) These commands setup lurker to handle missing pages: AddType text/xml .xsl AddType text/xml .xml AddType message/rfc822 .rfc822 AddDefaultCharset UTF-8 # Optionally over-rule lurker's default config (needs mod_env) # SetEnv LURKER_CONFIG /path/to/lurker.conf # If you have multiple frontends, you need to specify which this is: # SetEnv LURKER_FRONTEND /usr/local/var/www ErrorDocument 404 /cgi-bin/lurker.cgi If you can use a Rewite Engine (avoids 404 log messages), this is best: AddType text/xml .xsl AddType text/xml .xml AddType message/rfc822 .rfc822 AddDefaultCharset UTF-8 # The E=LURKER_CONFIG is optional if you use the default config file # The E=LURKER_FRONTEND is optional if there is only one frontend RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-s RewriteRule ^(attach|list|mbox|message|mindex|search|splash|thread|zap)/[^/]+$ /cgi-lurker/lurker.cgi [L,PT,E=LURKER_CONFIG:/path/to/lurker.conf,E=LURKER_FRONTEND:%{REQUEST_FILENAME}] 8 Point your browser at the url where lurker is installed Enjoy! lurker-2.3/prune/0000777000175000017500000000000011272633207011023 500000000000000lurker-2.3/prune/PTable.h0000644000175000017500000000527511267074431012272 00000000000000/* $Id: PTable.h 1649 2009-10-19 14:35:01Z terpstra $ * * PTable.cpp - Prune table records state for pruning * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2.1. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef PTABLE_H #define PTABLE_H #include #include #include #include #include #include #include using std::set; using std::map; using std::string; class PTable { protected: struct KillState { time_t mtime; time_t atime; bool kill; }; struct Summary { string subject; set lists; bool changed; }; typedef set MessageIds; typedef map State; typedef map Summaries; typedef set Threads; typedef map Lists; typedef map::iterator KSI; const Config& cfg; ESort::Reader* reader; time_t config; time_t stamp; time_t now; bool purge; bool verbose; time_t modifiedLimit; time_t accessedLimit; MessageIds newIds; State state; Summaries summaries; Threads threads; Lists lists; void calc_list (KSI i); void calc_message(KSI i); void calc_thread (KSI i); void calc_mindex (KSI i); void calc_splash (KSI i); void calc_search (KSI i); void calc_attach (KSI i); void calc_mbox (KSI i); bool test_list (KSI i); bool test_message(KSI i); bool test_thread (KSI i); bool test_mindex (KSI i); bool test_splash (KSI i); bool test_search (KSI i); bool test_attach (KSI i); bool test_mbox (KSI i); string loadNewIds(); string loadDir(const string& dir, bool yank); string loadSummaries(); string loadThreads(); string loadLists(); public: PTable(const Config& cfg, ESort::Reader* reader, time_t stamp, bool purge, bool verbose, time_t modifiedLimit, time_t accessedLimit); string load(); // pull all summaries off disk string calc(); // decide what to do with cache string kill(); // prune any cache we don't like }; #endif lurker-2.3/prune/search.cpp0000644000175000017500000000407411267074431012717 00000000000000/* $Id: search.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * mbox.cpp - Cleanup after an mbox/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include // cache a search for only 2 hours #define EXPIRE_TIME_CREATION 60*60*2 using namespace std; bool PTable::test_search(KSI ks) { /* format: id@keywords.* */ const string::size_type skip = sizeof("search"); // null is / string::size_type o = ks->first.find('@', skip); return o != string::npos && o == MessageId::full_len + skip && MessageId::is_full(ks->first.c_str() + skip); } void PTable::calc_search(KSI ks) { /* search contents are very hard to predict * * Policy: * kill it after a short expiry */ if (!test_search(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } if (ks->second.mtime <= cfg.modified) { // die - it's older than the config file ks->second.kill = true; if (verbose) cout << ks->first << ": older than config file." << endl; return; } if (now - ks->second.mtime >= EXPIRE_TIME_CREATION) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (verbose) cout << ks->first << ": not expired" << endl; } lurker-2.3/prune/lurker-prune.10000644000175000017500000000727611267070016013465 00000000000000.TH "LURKER\-PRUNE" "1" .SH "NAME" lurker\-prune \(em prunes the web-server cache .SH "SYNOPSIS" .PP \fBlurker\-prune\fR [\-c ] [\-f ] [\-m ] [\-a ] [\-p \-v] .SH "DESCRIPTION" .PP \fBlurker\-prune\fR prunes obsolete or stale files from the web-server accessible cache. This command must be run at regular intervals from eg. a cronjob. If it is not run, then the lurker web interface will appear to not be receiving new mail or have contradictory links between pages. A good interval is every 15 minutes and should not exceed one hour. .PP Be aware that it is possible for an attacker to use up a large amount of disk space through lurker. An attacker could request many distinct lurker web pages each of which is cached, thus using disk space. Please setup a quota for the lurker user, read your logs, and follow whatever site-specific policies you have for denial of service. .PP A good script to run in parallel with normal lurker\-prune use is one similar to: if test `du \-s /var/www/lurker | cut \-f1` \-gt 32768; then lurker\-prune \-p; fi This might help guard against a potential denial-of-service attack. .SH "OPTIONS" .IP "\fB\-c config-file\fP" 10 Use this config file for lurker settings. .IP "\fB\-f frontend\fP" 10 The directory of the lurker frontend cache to clean. You can selectively purge cache with this option. By default, lurker-prune will clean all frontends specified in the config file. .IP "\fB\-m days\fP" 10 Keep cached files for at most this many days. Any cached file regardless of last access will be deleted after the specified number of days (defaults to 7). Files which are obsolete due to new mail, config changes, or no accesses will be deleted earlier. Deleted files will be automagically regenerated if needed. .IP "\fB\-a days\fP" 10 Kill cache files not accessed for this many days. Any cached file which has not been read from for the specified number of days (defaults to 1) will be deleted. Files which are obsolete due to new mail or config changes will be deleted earlier. Deleted files will be automagically regenerated if needed. .IP "\fB\-p\fP" 10 Purge mode. Delete all cache files even if they do not appear to be expired. This will only deletes files that are generated by lurker, and is thus preferable to rm */*. .IP "\fB\-v\fP" 10 Verbose operation. Indicate which files are being deleted and the reasoning behind lurker's decisions. This can help in tracking down why some files are deleted and not others. .SH "SEE ALSO" .PP lurker\-index(1), lurker\-params(1), lurker\-list(1) .PP lurker documentation on http://lurker.sourceforge.net/ .SH "COPYRIGHT" .PP Copyright (C) 2002: Wesley W. Terpstra .PP This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. .PP This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. .PP You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place \- Suite 330, Boston, MA 02111-1307, USA. .SH "BUGS" .PP Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to . .\" created by instant / docbook-to-man, Thu 27 Apr 2006, 19:46 lurker-2.3/prune/splash.cpp0000644000175000017500000000403511267074431012741 00000000000000/* $Id: splash.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * splash.cpp - Cleanup after a splash/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include using namespace std; bool PTable::test_splash(KSI ks) { return string(ks->first, 0, 13) == "splash/index."; } void PTable::calc_splash(KSI ks) { /* Splash pages depend solely on the config file * * Policy: * kill if obsolete due to config file * kill if older than a fixed time * kill if no recent accesses */ if (!test_splash(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } if (ks->second.mtime <= cfg.modified) { // die - it's older than the config file ks->second.kill = true; if (verbose) cout << ks->first << ": older than config file." << endl; return; } if (now - ks->second.mtime >= modifiedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (now - ks->second.atime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to no access." << endl; return; } if (verbose) cout << ks->first << ": not expired" << endl; } lurker-2.3/prune/Makefile.in0000644000175000017500000003767511272632672013033 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = lurker-prune$(EXEEXT) subdir = prune DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_lurker_prune_OBJECTS = prune.$(OBJEXT) PTable.$(OBJEXT) \ attach.$(OBJEXT) list.$(OBJEXT) mbox.$(OBJEXT) \ message.$(OBJEXT) mindex.$(OBJEXT) search.$(OBJEXT) \ splash.$(OBJEXT) thread.$(OBJEXT) lurker_prune_OBJECTS = $(am_lurker_prune_OBJECTS) lurker_prune_LDADD = $(LDADD) lurker_prune_DEPENDENCIES = ../common/libcommon.a \ ../libesort/libesort.a DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/tools/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(lurker_prune_SOURCES) DIST_SOURCES = $(lurker_prune_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = lurker-prune.sgml dist_man_MANS = lurker-prune.1 AM_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/libesort LDADD = ../common/libcommon.a ../libesort/libesort.a lurker_prune_SOURCES = \ prune.cpp PTable.cpp attach.cpp list.cpp mbox.cpp message.cpp \ mindex.cpp search.cpp splash.cpp thread.cpp PTable.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu prune/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu prune/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) lurker-prune$(EXEEXT): $(lurker_prune_OBJECTS) $(lurker_prune_DEPENDENCIES) @rm -f lurker-prune$(EXEEXT) $(CXXLINK) $(lurker_prune_OBJECTS) $(lurker_prune_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PTable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attach.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mindex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prune.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-man uninstall-man1 @MAINTAINER_MODE_TRUE@lurker-prune.1: lurker-prune.sgml @MAINTAINER_MODE_TRUE@ docbook-to-man $< > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/prune/thread.cpp0000644000175000017500000000465111267074431012722 00000000000000/* $Id: thread.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * thread.cpp - Cleanup after a thread/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include using namespace std; bool PTable::test_thread(KSI ks) { const string::size_type skip = sizeof("thread"); return MessageId::is_full(ks->first.c_str() + skip); } void PTable::calc_thread(KSI ks) { /* Threads depend on thread data! * * ... but also include: * host info (from config file) * * Policy: * kill if obsolete due to above * kill if older than a fixed time * kill if no recent accesses */ if (!test_thread(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } MessageId id(ks->first.c_str() + 7); if (ks->second.mtime <= cfg.modified) { // die - it's older than the config file ks->second.kill = true; if (verbose) cout << ks->first << ": older than config file." << endl; return; } if (now - ks->second.mtime >= modifiedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (now - ks->second.atime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to no access." << endl; return; } Summary& sum = summaries[id]; string tid(subject_hash(sum.subject.c_str())); if (threads.find(tid) != threads.end()) { // die - the thread changed ks->second.kill = true; if (verbose) cout << ks->first << ": thread modified." << endl; return; } if (verbose) cout << ks->first << ": not expired" << endl; } lurker-2.3/prune/list.cpp0000644000175000017500000000731411272625741012427 00000000000000/* $Id: list.cpp 1667 2009-10-30 18:09:31Z terpstra $ * * mindex.cpp - Cleanup after a mindex/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include using namespace std; bool PTable::test_list(KSI ks) { const string::size_type skip = sizeof("list"); // null is / /* We need to work around list-ids which contain a '.' * For legacy reasons there may be URLs with only a single '.' * We cannot support legacy URLs AND list-ids with '.', but that's ok. * Compromise: Strip last two '.'s -- or only last '.' if not two. */ string::size_type o = ks->first.rfind('.'); if (o != string::npos && o > skip) { string::size_type tmp = ks->first.rfind('.', o-1); if (tmp != string::npos && tmp >= skip) o = tmp; } return o != string::npos && o >= skip && cfg.lists.find(string(ks->first, skip, o-skip)) != cfg.lists.end(); } void PTable::calc_list(KSI ks) { /* List entries are invalidated by any new message to the list * * ... but list includes: * list info (from config file) * * Policy: * kill if older than newest message to list * kill if older than a fixed time * kill if no recent accesses */ if (!test_list(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } if (ks->second.mtime <= cfg.modified) { // die - it's older than the config file ks->second.kill = true; if (verbose) cout << ks->first << ": older than config file." << endl; return; } // Don't let the page get too old; it is time dependent if (now - ks->second.mtime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (now - ks->second.atime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to no access." << endl; return; } string query(ks->first, 5, string::npos); string::size_type at = query.rfind('.'); /* Same work-around as test_list */ if (at != string::npos && at > 0) { string::size_type tmp = ks->first.rfind('.', at-1); if (tmp != string::npos) at = tmp; } string listn(query, 0, at); if (lists.find(listn) == lists.end()) { // this list has not changed if not pulled if (verbose) cout << ks->first << ": not a modified list." << endl; return; } MessageIds& list = lists[listn]; if (list.empty()) { if (verbose) cout << ks->first << ": empty list." << endl; return; } // Any new message (even in the past) will affect this page MessageIds::iterator id; for (id = list.begin(); id != list.end(); ++id) { Summaries::const_iterator s; if ((s = summaries.find(*id)) != summaries.end() && s->second.changed) { ks->second.kill = true; if (verbose) cout << ks->first << ": " << id->serialize() << " is new." << endl; return; } } if (verbose) cout << ks->first << ": nothing newer than page." << endl; } lurker-2.3/prune/mbox.cpp0000644000175000017500000000352111267074431012413 00000000000000/* $Id: mbox.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * mbox.cpp - Cleanup after an mbox/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include using namespace std; bool PTable::test_mbox(KSI ks) { const string::size_type skip = sizeof("mbox"); // null is / return MessageId::is_full(ks->first.c_str() + skip); } void PTable::calc_mbox(KSI ks) { /* MBox contents never change * * Policy: * kill after a bounded lifetime * kill after a period of no accesses */ if (!test_mbox(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } if (now - ks->second.mtime >= modifiedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (now - ks->second.atime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to no access." << endl; return; } if (verbose) cout << ks->first << ": not expired" << endl; } lurker-2.3/prune/Makefile.am0000644000175000017500000000067011267070016012773 00000000000000EXTRA_DIST = lurker-prune.sgml bin_PROGRAMS = lurker-prune dist_man_MANS = lurker-prune.1 AM_CPPFLAGS = -I$(top_srcdir)/common -I$(top_srcdir)/libesort LDADD = ../common/libcommon.a ../libesort/libesort.a lurker_prune_SOURCES = \ prune.cpp PTable.cpp attach.cpp list.cpp mbox.cpp message.cpp \ mindex.cpp search.cpp splash.cpp thread.cpp PTable.h if MAINTAINER_MODE lurker-prune.1: lurker-prune.sgml docbook-to-man $< > $@ endif lurker-2.3/prune/PTable.cpp0000644000175000017500000002202211267074431012612 00000000000000/* $Id: PTable.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * PTable.cpp - Prune table records state for pruning * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include #include #include #include #include #include #include // If the stuff imported spans more than a week, kill all cache #define MASSACRE_THRESHOLD 7*24*60*60 using namespace std; PTable::PTable(const Config& cfg_, ESort::Reader* reader_, time_t stamp_, bool purge_, bool verbose_, time_t modifiedLimit_, time_t accessedLimit_) : cfg(cfg_), reader(reader_), stamp(stamp_), now(time(0)), purge(purge_), verbose(verbose_), modifiedLimit(modifiedLimit_), accessedLimit(accessedLimit_) { } string PTable::loadDir(const string& dir, bool yank) { if (verbose) cout << "Loading directory " << dir << endl; DIR* d = opendir(dir.c_str()); if (d) { struct dirent* de; while ((de = ::readdir(d)) != 0) { string name = dir + "/" + de->d_name; struct stat sbuf; if (stat(name.c_str(), &sbuf) >= 0) { if (!S_ISREG(sbuf.st_mode)) continue; KillState ks; ks.mtime = sbuf.st_mtime; ks.atime = sbuf.st_atime; ks.kill = false; state[name] = ks; if (yank) { MessageId id(de->d_name); if (id.timestamp() != 0) summaries[id].changed = false; } } } closedir(d); } return ""; } string PTable::loadNewIds() { string pfx = LU_CACHE; MessageId offid(stamp); if (verbose) cout << "Loading new ids since last run ..." << endl; auto_ptr walker( reader->seek(pfx, offid.raw().substr(0, 4), ESort::Forward)); while (walker->advance() != -1) { if (walker->key.length() != 13) return string("corrupt import stamp"); MessageId id(walker->key.c_str()+5, 8); newIds.insert(id); summaries[id].changed = true; if (verbose) cout << "New message: " << id.serialize() << endl; } if (errno != 0) { return string("Walker::advance:") + strerror(errno); } return ""; } string PTable::loadSummaries() { if (verbose) cout << "Loading summary data ..." << endl; int ok; string pfx = LU_SUMMARY; auto_ptr walker( reader->seek(pfx, summaries.begin()->first.raw(), ESort::Forward)); while ((ok = walker->advance()) != -1) { if (walker->key.length() < 1 + 8 + 1) return "invalid mbox entry -- way too short"; MessageId id(walker->key.c_str() + 1, 8); if (id > (--summaries.end())->first) break; // done pulling if (summaries.find(id) == summaries.end()) continue; // don't process this one // We use this for getting an unsigned value below. const unsigned char* k = (const unsigned char*) walker->key.c_str()+1+8; // read all the values switch (*k) { case LU_MESSAGE_DELETED: case LU_MESSAGE_AUTHOR_EMAIL: case LU_MESSAGE_AUTHOR_NAME: // noop break; case LU_MESSAGE_SUBJECT: summaries[id].subject = walker->key.substr(1+8+1, string::npos); break; case LU_MESSAGE_MBOX: if (walker->key.length() < 1+8+1+1+12) return "invalid mbox entry -- too short"; //!!! could be more careful about corrupt dbs here summaries[id].lists.insert((const char*)(k+1)); lists[(const char*)(k+1)]; // poke the list table break; default: return "unknown mbox summary control code"; } } if (ok == -1 && errno != 0) return string("Walker::advance:") + strerror(errno); return ""; } string PTable::loadThreads() { Summaries::const_iterator i; for (i = summaries.begin(); i != summaries.end(); ++i) { if (!i->second.changed) continue; string tid(subject_hash(i->second.subject.c_str())); threads.insert(tid); } return ""; } string PTable::loadLists() { MessageId oldest(*newIds.begin()); MessageId newest(*--newIds.end()); // The goal is to get all the message ids within a list for // the last imported message - 40 to the newest imported message +40. // We load extra messages (over 36) so outliers can be detected. for (Lists::iterator list = lists.begin(); list != lists.end(); ++list) { if (verbose) cout << "Loading list data: " << list->first << endl; string pfx = string(LU_KEYWORD LU_KEYWORD_LIST) + list->first + '\0'; auto_ptr forward( reader->seek(pfx, oldest.raw(), ESort::Forward)); auto_ptr backward( reader->seek(pfx, oldest.raw(), ESort::Backward)); // first walk backwards a few steps for (int backCount = 0; backCount < 40; ++backCount) { if (backward->advance() == -1) break; if (backward->key.length() != pfx.length() + 8) return "corrupt keyword entry"; MessageId id(backward->key.c_str() + pfx.length(), 8); list->second.insert(id); } if (errno != 0) return string("Walker::advance:") + strerror(errno); // walk forward till we pass newest int ok; while ((ok = forward->advance()) != -1) { if (forward->key.length() != pfx.length() + 8) return "corrupt keyword entry"; MessageId id(forward->key.c_str() + pfx.length(), 8); list->second.insert(id); if (id >= newest) break; } if (ok == -1 && errno != 0) return string("Walker::advance:") + strerror(errno); if (ok == -1) continue; for (int forCount = 0; forCount < 40; ++forCount) { if (forward->advance() == -1) break; if (forward->key.length() != pfx.length() + 8) return "corrupt keyword entry"; MessageId id(forward->key.c_str() + pfx.length(), 8); list->second.insert(id); } } return ""; } string PTable::load() { string ok; if ((ok = loadDir("attach", false)) != "") return ok; if ((ok = loadDir("list", false)) != "") return ok; if ((ok = loadDir("mbox", false)) != "") return ok; if ((ok = loadDir("message", true)) != "") return ok; if ((ok = loadDir("mindex", false)) != "") return ok; if ((ok = loadDir("search", false)) != "") return ok; if ((ok = loadDir("splash", false)) != "") return ok; if ((ok = loadDir("thread", true)) != "") return ok; if ((ok = loadNewIds()) != "") return ok; if (newIds.empty()) return ""; time_t threshold = (--newIds.end())->timestamp() - newIds.begin()->timestamp(); if (threshold > MASSACRE_THRESHOLD) return ""; if ((ok = loadSummaries()) != "") return ok; if ((ok = loadThreads()) != "") return ok; if ((ok = loadLists()) != "") return ok; return ""; } string PTable::calc() { time_t threshold = 0; if (!newIds.empty()) { threshold = (--newIds.end())->timestamp() - newIds.begin()->timestamp(); } if (threshold > MASSACRE_THRESHOLD || purge) { if (verbose && threshold > MASSACRE_THRESHOLD) cout << "New messages span too large a window; entering massacre mode." << endl; if (verbose && purge) cout << "Purging all cache." << endl; for (KSI i = state.begin(); i != state.end(); ++i) { if ((i->first.substr(0, 6) == "attach" && test_attach (i)) || (i->first.substr(0, 4) == "mbox" && test_mbox (i)) || (i->first.substr(0, 4) == "list" && test_list (i)) || (i->first.substr(0, 7) == "message"&& test_message(i)) || (i->first.substr(0, 6) == "mindex" && test_mindex (i)) || (i->first.substr(0, 6) == "search" && test_search (i)) || (i->first.substr(0, 6) == "splash" && test_splash (i)) || (i->first.substr(0, 6) == "thread" && test_thread (i))) { i->second.kill = true; } } return ""; } else { for (KSI i = state.begin(); i != state.end(); ++i) { if (i->first.substr(0, 6) == "attach" ) calc_attach (i); if (i->first.substr(0, 4) == "mbox" ) calc_mbox (i); if (i->first.substr(0, 4) == "list" ) calc_list (i); if (i->first.substr(0, 7) == "message") calc_message(i); if (i->first.substr(0, 6) == "mindex" ) calc_mindex (i); if (i->first.substr(0, 6) == "search" ) calc_search (i); if (i->first.substr(0, 6) == "splash" ) calc_splash (i); if (i->first.substr(0, 6) == "thread" ) calc_thread (i); } } return ""; } string PTable::kill() { State::const_iterator i; for (i = state.begin(); i != state.end(); ++i) { if (i->second.kill) { if (verbose) cout << "Deleting: " << i->first << endl; if (unlink(i->first.c_str()) < 0) { cerr << "Cannot unlink: " << i->first << ": " << strerror(errno) << endl; // continue } } } return ""; } lurker-2.3/prune/attach.cpp0000644000175000017500000000411411267074431012711 00000000000000/* $Id: attach.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * attach.cpp - Cleanup after an attach/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include #include using namespace std; bool PTable::test_attach(KSI ks) { /* id@YYYYMMDD.HHMMSS.hashcode.* */ const string::size_type skip = sizeof("attach"); // null is / string::size_type o = ks->first.find('@', skip); return o != string::npos && // there is an @ sign atol(ks->first.c_str()+skip) && // a number precedes it MessageId::is_full(ks->first.c_str()+o+1); // valid message id } void PTable::calc_attach(KSI ks) { /* Attachment contents never change * * Policy: * kill after a bounded lifetime * kill after a period of no accesses */ if (!test_attach(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } if (now - ks->second.mtime >= modifiedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (now - ks->second.atime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to no access." << endl; return; } if (verbose) cout << ks->first << ": not expired" << endl; } lurker-2.3/prune/mindex.cpp0000644000175000017500000000726711267074431012745 00000000000000/* $Id: mindex.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * mindex.cpp - Cleanup after a mindex/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include using namespace std; bool PTable::test_mindex(KSI ks) { /* format: list@msgid.* */ const string::size_type skip = sizeof("mindex"); // null is / string::size_type o = ks->first.find('@', skip); return o != string::npos && cfg.lists.find(string(ks->first, skip, o-skip)) != cfg.lists.end() && MessageId::is_full(ks->first.c_str()+o+1); } void PTable::calc_mindex(KSI ks) { /* Mindex entries use up to 35 records in either direction of the key * * ... but mindex include: * list info (from config file) * * Policy: * kill if obsolete due to above * kill if older than a fixed time * kill if no recent accesses */ if (!test_mindex(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } if (ks->second.mtime <= cfg.modified) { // die - it's older than the config file ks->second.kill = true; if (verbose) cout << ks->first << ": older than config file." << endl; return; } if (now - ks->second.mtime >= modifiedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (now - ks->second.atime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to no access." << endl; return; } string query(ks->first, 7, string::npos); string::size_type at = query.find('@'); string listn(query, 0, at); string ids(query, at+1, string::npos); MessageId id(ids.c_str()); if (lists.find(listn) == lists.end()) { // this list has not changed if not pulled if (verbose) cout << ks->first << ": not a modified list." << endl; return; } MessageIds& list = lists[listn]; if (list.empty()) { if (verbose) cout << ks->first << ": empty list." << endl; return; } MessageIds::const_iterator self = list.lower_bound(id); if (self == list.end()) { // get off the end --self; } int c = 0; for ( MessageIds::const_iterator next = self; c < 36 && next != list.end(); ++c, ++next) { Summaries::const_iterator ns; if ((ns = summaries.find(*next)) != summaries.end() && ns->second.changed) { ks->second.kill = true; if (verbose) cout << ks->first << ": succesor " << next->serialize() << " changed." << endl; return; } } c = 0; for ( MessageIds::const_iterator prev = self; c < 36 && prev != list.end(); ++c, --prev) { Summaries::const_iterator ps; if ((ps = summaries.find(*prev)) != summaries.end() && ps->second.changed) { ks->second.kill = true; if (verbose) cout << ks->first << ": predecessor " << prev->serialize() << " changed." << endl; return; } } if (verbose) cout << ks->first << ": content unmodified." << endl; } lurker-2.3/prune/lurker-prune.sgml0000644000175000017500000001616311267070016014262 00000000000000 lurker-prune.1'. You may view the manual page with: `docbook-to-man lurker-prune.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: lurker-prune.1: lurker-prune.sgml docbook-to-man $< > $@ --> Wesley"> Terpstra"> May 10, 2003"> 1"> terpstra@users.sourceforge.net"> lurker\-users@lists.sourceforge.net"> LURKER\-PRUNE"> Debian"> lurker"> GNU"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2003 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; prunes the web-server cache &dhpackage; \-c <config-file> \-f <frontend> \-m <days> \-a <days> \-p \-v DESCRIPTION &dhpackage; prunes obsolete or stale files from the web-server accessible cache. This command must be run at regular intervals from eg. a cronjob. If it is not run, then the lurker web interface will appear to not be receiving new mail or have contradictory links between pages. A good interval is every 15 minutes and should not exceed one hour. Be aware that it is possible for an attacker to use up a large amount of disk space through lurker. An attacker could request many distinct lurker web pages each of which is cached, thus using disk space. Please setup a quota for the lurker user, read your logs, and follow whatever site-specific policies you have for denial of service. A good script to run in parallel with normal lurker\-prune use is one similar to: if test `du \-s /var/www/lurker | cut \-f1` \-gt 32768; then lurker\-prune \-p; fi This might help guard against a potential denial-of-service attack. OPTIONS Use this config file for lurker settings. The directory of the lurker frontend cache to clean. You can selectively purge cache with this option. By default, lurker-prune will clean all frontends specified in the config file. Keep cached files for at most this many days. Any cached file regardless of last access will be deleted after the specified number of days (defaults to 7). Files which are obsolete due to new mail, config changes, or no accesses will be deleted earlier. Deleted files will be automagically regenerated if needed. Kill cache files not accessed for this many days. Any cached file which has not been read from for the specified number of days (defaults to 1) will be deleted. Files which are obsolete due to new mail or config changes will be deleted earlier. Deleted files will be automagically regenerated if needed. Purge mode. Delete all cache files even if they do not appear to be expired. This will only deletes files that are generated by lurker, and is thus preferable to rm */*. Verbose operation. Indicate which files are being deleted and the reasoning behind lurker's decisions. This can help in tracking down why some files are deleted and not others. SEE ALSO lurker\-index(1), lurker\-params(1), lurker\-list(1) lurker documentation on http://lurker.sourceforge.net/ COPYRIGHT Copyright (C) 2002: &dhusername; <&dhemail;> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. BUGS Before reporting a bug, please confirm that the bug you found is still present in the latest official release. If the problem persists, then send mail with instructions describing how to reproduce the bug to <&support;>.
lurker-2.3/prune/prune.cpp0000644000175000017500000001302111267074431012573 00000000000000/* $Id: prune.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * prune.cpp - Prune obsolete / stale cache files * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include "PTable.h" using namespace std; bool verbose = false; bool purge = false; time_t modifyTime = 60*60*24*7; time_t accessTime = 60*60*24*1; void help(const char* name) { cerr << "Lurker-prune (v" << VERSION << ") prunes the web-server cache.\n"; cerr << "\n"; cerr << "Usage: " << name << " [-c ] [-f ] [-m -a -p -v]\n"; cerr << "\n"; cerr << "\t-c Use this config file for lurker settings\n"; cerr << "\t-f Only clear cache from the named frontend [all]\n"; cerr << "\t-m Keep cached files for at most this many days [7]\n"; cerr << "\t-a Kill cached files not accessed for this many days [1]\n"; cerr << "\t-p Purge everything even if it appears to not be expired\n"; cerr << "\t-v Verbose operation\n"; cerr << "\n"; cerr << "Prune obsolete or stale html/xml from the web-server accessible cache.\n"; cerr << "This command should be run at regular intervals from cron for each site.\n"; cerr << "\n"; } int execute(const Config& cfg, const string& docroot) { if (verbose) cout << "Cleaning document root " << docroot << endl; string docfile = docroot + "/lurker.docroot"; int fd = open(docfile.c_str(), O_RDWR | O_CREAT, 0666); if (fd == -1) { cerr << "open()ing " << docfile << ": " << strerror(errno) << endl; return 1; } struct stat dbuf; if (fstat(fd, &dbuf) < 0) { cerr << "stat()ing " << docfile << ": " << strerror(errno) << endl; return 1; } enum LockState { GOT, FAIL, USED } state = GOT; #ifdef LOCK_EX if (flock(fd, LOCK_EX|LOCK_NB) != 0) { if (errno == EWOULDBLOCK) state = USED; else state = FAIL; } #else #ifdef F_SETLK struct flock lock; memset(&lock, 0, sizeof(lock)); lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; if (fcntl(fd, F_SETLK, &lock) != 0) { if (errno == EACCES || errno == EAGAIN) state = USED; else state = FAIL; } #endif #endif if (state == USED) { if (verbose) cout << "Already pruning docroot " << docroot << endl; return 0; } if (state == FAIL) { cerr << "Locking " << docfile << " failed: " << strerror(errno) << endl; return 1; } std::auto_ptr db(ESort::Reader::opendb(cfg.dbdir + "/db")); if (!db.get()) { cerr << "Opening database: " << strerror(errno) << endl; return 1; } time_t beginfix = time(0); if (chdir(docroot.c_str()) != 0) { cerr << "chdir: " << docroot << ": " << strerror(errno) << endl; return 1; } PTable ptable(cfg, db.get(), dbuf.st_mtime, purge, verbose, modifyTime, accessTime); string ok; if ((ok = ptable.load()) != "") { cerr << "load: " << ok << endl; return 1; } if ((ok = ptable.calc()) != "") { cerr << "calc: " << ok << endl; return 1; } if ((ok = ptable.kill()) != "") { cerr << "kill: " << ok << endl; return 1; } // set the mtime stamp to beginfix struct utimbuf touch; touch.actime = touch.modtime = beginfix; if (utime("lurker.docroot", &touch) < 0) { cerr << "touching " << docfile << ": " << strerror(errno) << endl; return 1; } return 0; } int main(int argc, char** argv) { int c; const char* config = DEFAULT_CONFIG_FILE; const char* docroot = 0; srandom(time(0)); while ((c = getopt(argc, (char*const*)argv, "c:f:m:a:vp?")) != -1) { switch ((char)c) { case 'c': config = optarg; break; case 'f': docroot = optarg; break; case 'm': modifyTime = atol(optarg)*60*60*24; if (!modifyTime) { cerr << "Modification time is not a number!\n"; return 1; } break; case 'a': accessTime = atol(optarg)*60*60*24; if (!accessTime) { cerr << "Access time is not a number!\n"; return 1; } break; case 'p': purge = true; break; case 'v': verbose = true; break; default: help(argv[0]); return 1; } } while (optind < argc) { if (!argv[optind][0]) { // ignore empty arguments optind++; continue; } cerr << "Unexpected argument: '" << argv[optind] << "'\n"; return 1; } Config cfg; if (cfg.load(config) != 0) { cerr << cfg.getError() << flush; return 1; } if (docroot) execute(cfg, docroot); else { Config::Frontends::const_iterator i, s = cfg.frontends.begin(), e = cfg.frontends.end(); for (i = s; i != e; ++i) { execute(cfg, i->first); } } return 0; } lurker-2.3/prune/message.cpp0000644000175000017500000000674711267074431013107 00000000000000/* $Id: message.cpp 1649 2009-10-19 14:35:01Z terpstra $ * * message.cpp - Cleanup after a message/ command * * Copyright (C) 2002 - Wesley W. Terpstra * * License: GPL * * Authors: 'Wesley W. Terpstra' * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define _FILE_OFFSET_BITS 64 #include "PTable.h" #include #include using namespace std; bool PTable::test_message(KSI ks) { const string::size_type skip = sizeof("message"); // null is / return MessageId::is_full(ks->first.c_str() + skip); } void PTable::calc_message(KSI ks) { /* Messages themselves never change * * ... but messages include: * list info (from config file) * thread info * next/prev for each mbox info * * Policy: * kill if obsolete due to above * kill if older than a fixed time * kill if no recent accesses */ if (!test_message(ks)) { if (verbose) cout << ks->first << ": not a lurker file." << endl; return; } MessageId id(ks->first.c_str() + 8); if (ks->second.mtime <= cfg.modified) { // die - it's older than the config file ks->second.kill = true; if (verbose) cout << ks->first << ": older than config file." << endl; return; } if (now - ks->second.mtime >= modifiedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to maximum age." << endl; return; } if (now - ks->second.atime >= accessedLimit) { ks->second.kill = true; if (verbose) cout << ks->first << ": expired due to no access." << endl; return; } Summary& sum = summaries[id]; string tid(subject_hash(sum.subject.c_str())); if (threads.find(tid) != threads.end()) { // die - the thread changed ks->second.kill = true; if (verbose) cout << ks->first << ": thread modified." << endl; return; } set::const_iterator list; for (list = sum.lists.begin(); list != sum.lists.end(); ++list) { const MessageIds& ids = lists[*list]; MessageIds::const_iterator self = ids.find(id); if (self == ids.end()) { // if it can't find us, then we are not in the range // of messages whose mindex is affected by import continue; } MessageIds::const_iterator next = self; ++next; MessageIds::const_iterator prev = self; --prev; Summaries::const_iterator ns, ps; if (prev != ids.end() && (ps = summaries.find(*prev)) != summaries.end() && ps->second.changed) { ks->second.kill = true; if (verbose) cout << ks->first << ": previous message changed in '" << *list << "'." << endl; return; } if (next != ids.end() && (ns = summaries.find(*next)) != summaries.end() && ns->second.changed) { ks->second.kill = true; if (verbose) cout << ks->first << ": next message changed in '" << *list << "'." << endl; return; } } if (verbose) cout << ks->first << ": not expired" << endl; } lurker-2.3/imgs/0000777000175000017500000000000011272633210010623 500000000000000lurker-2.3/imgs/b.png0000644000175000017500000000023411267070016011470 00000000000000‰PNG  IHDRÚ¹¯»PLTEâÇÃtRNS@æØfbKGDˆH pHYs  ÒÝ~ütIMEÕ jÏ»:IDAT×c``` !l`Aà>.IEND®B`‚lurker-2.3/imgs/e.png0000644000175000017500000000024211267070016011472 00000000000000‰PNG  IHDRÚ¹¯»PLTEâÇÃtRNS@æØfbKGDˆH pHYs  ÒÝ~ütIMEÕcy÷IDAT×c` üÿÿŒ$ˆÅ5ÿ„Ù@IEND®B`‚lurker-2.3/imgs/Makefile.in0000644000175000017500000002312011272632671012614 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = imgs DIST_COMMON = $(dist_imgs_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(imgsdir)" dist_imgsDATA_INSTALL = $(INSTALL_DATA) DATA = $(dist_imgs_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ imgsdir = @default_www_dir@/imgs dist_imgs_DATA = \ a.png b.png c.png d.png e.png f.png g.png h.png i.png j.png k.png \ next.png prev.png bar.png paperclip.png root.png reply.png trash.png all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu imgs/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu imgs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-dist_imgsDATA: $(dist_imgs_DATA) @$(NORMAL_INSTALL) test -z "$(imgsdir)" || $(MKDIR_P) "$(DESTDIR)$(imgsdir)" @list='$(dist_imgs_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(dist_imgsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(imgsdir)/$$f'"; \ $(dist_imgsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(imgsdir)/$$f"; \ done uninstall-dist_imgsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_imgs_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(imgsdir)/$$f'"; \ rm -f "$(DESTDIR)$(imgsdir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(imgsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dist_imgsDATA install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_imgsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_imgsDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-dist_imgsDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/imgs/c.png0000644000175000017500000000023711267070016011474 00000000000000‰PNG  IHDRÚ¹¯»PLTEâÇÃtRNS@æØfbKGDˆH pHYs  ÒÝ~ütIMEÕm¢#IDAT×c` üÿÿŒIOûp•xIEND®B`‚lurker-2.3/imgs/bar.png0000644000175000017500000000020311267070016012007 00000000000000‰PNG  IHDRþdóbKGDÿÿÿ ½§“ pHYs  d_‘tIMEÓ  !9Ù‚IDATxœcTþþŸ &Ø1£âIEND®B`‚lurker-2.3/imgs/trash.png0000644000175000017500000000765111267070016012402 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ pHYs ¿CfStIMEÖ-^ÀY6IDAThÞ­š{l^å}Ç?çú^ý¾ök;ŽILKâ4·BKŠ ŽÔRÌzAm™Â@6´*¶ŽK„&­Õت¡­eýg¥ë¨è&…ÑÔšd%Š…¡ ”9àpqã[;ñå½Ëó<çìó¾Ç~;qJôè9ï#Ÿs¾¿ïï÷{~—Çáºê¡ëÃ¥k ¢!¥jó2¿E€Wq¢gæ¦G´ßÃÅ>”r={ûƾvß—PJ¡¤Z˜¥B)yÎÚúg2™<¶‘Æ,ŒÐ'`zp¤ (ÖÆïU€°¾goßÐ×îûA,(—иöï<®›hE Ý0HæS¤Ú2Xy 3mƒÔ  ŒÀ{ý¿ÙŒ¯FóbèÙÛ7tÓ=7à9Þ² Çk‹×•â'÷#¬36¡ vÎÆ²,tKC· 4SÃHh• hŸ¿lhzpdUB˜Ã>€[u–e¸ô‚ O=ú$×Ú×rø·‡1×™èiƒ0 ‘B¡‹S]×Ñ,#a`^bqÆ: °Ø”rµÁRó2/‚ýÝ{®Æ©:«b]Éh`Ó¦MH) »»›„“ ™H‘(%ðø9‰J… 0ÒŸº¥‡ 1þâôàÈê໿±càý}G4c^ûîʬ/^¯ÍÏýë~:>èààôAöìÙCgg'O?ý4$ CÙ·o`f ôvù‰‘ húxžRºðâšt'v6Á¶/^ʱF—jfUN¼¾goßXÏ·.ËðùÖþç©IMqÉ%—ÐÓÓà 7ÜÀ¡C‡8zô(ßþö·Bàº.B&&&Ø¿?êó6™ Þ¤c7™dZÒ{a”÷÷ùp ªiá‚X`ßqVÅzݬì{…ö÷ÚÙtå&ŠÅ"o¿ý67ÝtÍÍÍhšÆñãÇ Ã|>=«MMM|ùË_æøñã¼÷Þ{¬½|-‰í)ÒzQy¿nÿó㹞½}›{×áÔÍgû½R‘íg³YR©7ndnnŽñññÈ¥dzzÏó¨V«hšF:Ʋ,ZZZؽ{7×]wcccÌþv–}O?ÏôàÈ·j¬¯V€Æg¬×ïÝÿ»“»ëE Liš¼ôÒKÜ|óÍ!ð}ŸR©D:ÆqLÓDÓ4Â0Ä0 :::xä‘Ghÿìe˲a ÜÊÀ%[³K8ߺ°ó¤Ói’É$tvv"„`vv–ÖÖÖ¸®ëض®ë„aˆ®ë˜f)4M«GçeÙ¿°?£÷Yö\׳û¼û}}íøëǹcóø¾O2™¤©©‰B¡À©S§8qâ–eáº.š¦‘Ëå0 ]×I&“±êZð<¯~¿,û ?=ôiöìÙï?ÀŽîÏ,Ïú¢´NJI2™¤³³“ŽŽÒé4_ùÊW˜™™¡Z­bš&–eaYš¦aš&¦i¢ë:ét!ûöíÃqÂ0\¼Š‰ß|óMî¼óN¾ó‰ïP*•øÞûß »ÐM4&£ý€Û6Þ†”’l6‹eY†ëºH)I§Ó¤R)LÓ$ Cš››I§Ó(¥‚€jµÊàà £££ø¾O Idm,kB¹%áº~u´¶¶’Ë嘟ŸçÑ52;;ËwG¿ ÀÆæ ´··“N§Ù°a—]v­­­!Î¥R‰'N088HµZÅ÷ýر}ßoxç÷^÷D!‘ãàcÏž“i={ûÂÕftWæ·ðé|Ô&''yròIæg橜­pK×-(¥ÈçótttÐÖÖ†a Àê@=Ï R©4¬×ï'&&Û2Aj]†L[ÖI†Ÿ|sI*q+á7m-ÙLº®G2PxÒÑB \×ãÔè)þå¯È]_½“ë·ŽD"Á}Í÷qòäIÊåxK, ´´´J¥Îa³¡øY0‘ø`jjŠÌ§²èÙZ¶j$>™`ó­Û††v,ÂüØè•<úg?⮽ĶÏnÁJYH$2ˆPF÷†‚º[¹ó±;yê~ÁÔ[c$ ”RLOOsùå—ÓÕÕ…eYäóyR©ÔŠÀÃ0ÄqÊå2”Ë娾P*ÊL5 ]×IÑNeXm FæÞnȇê¹Ðúlï%ceï,÷ýã}\ºùRD(„$2P¨P"Àçð+>6—g禫H¥Rœ:uŠ‘‘FGGY»v-º®cFìœËÍ™L¥aâû>º®S.GZ¬¿ÓØiSm¯ÒTÈÓ´&Oóú6V’£?x‰¹N/p,Þ…Ê“_èÙÛ÷b{w;EYŠAËP"‰¬ ¢k:Ÿ¹y+ÿõ÷¿äë×þ!]]]ìÚµ‹ááa<ÏCÁôôtƒM/žmÛŽí<•JÅþàº.ããã$ ²ÙlJ¼Ô°# ØÙÍÖv´0‡“rÆ¢œçHߟ~Wù¸ÊÃQnàâH'ŠŠº†®EêM6%ضë|ÿû?å¶Ý_ààÁƒlذöövZ[[) 477“Ïçã9—ËaÛ6¶mS*•˜šš"›Í’Íf1 ƒééiR©333è—¨¬"•ËlJS¸´;• iÓZªÁO¼sæÇ‹·QNÏOc'm„Aˆm[˜Æò¡"‘±ùÔŽOò·ßÿ.ÛÖn ŸÏãû>…BÎÎN\×åĉ¼ñÆd³Y:::hiiÁq\×ehhˆ0 ãÄoÙË+ac˜fÂB7#¾SkóL”NÇJ⪇®ÚúÕ8ŽC¥\E I„_ |‰Š@… Ñ–P#µÍ‡ÉT*•˜¹ùùùx‡yõÕWã$®¾m6t´ —#¦e¢×°l+^ßö矣ùók‡ôú‚Su TP½dˆ…{éK„'(+´¼wõr(|É©IªÕ*ù|>b¦æÈ‰D‚L&³|Kdè¦QÓ€¡×,>„LG-›Œ4 ”¢8[Äó|„/ð—€^*„[qÙÿ㘙š£yM3kÓŒMŽ333k£°ž]þ®˜vd:º¥„µ¸!!(* Œ(•PR¢|…çyX¦9¬®/8ný·Âüü±çØT½”þg^Šöc\¥qæÌÖ¬Y³j«Ó€iÀŽò'½€À ð*^M%QžÂÓ=H’àÑŒ“¿£=¹Ž« —s÷¶!xþƒç± kyºþ‘Ð4-òË" À tC¼Y¦dSdBClŸ8‰ô%žã-k>žãá9?>ÀÕ*Jàr¹ëÖ­cÓÆMtwwÓÖÖF:¾ ÈýÅôWúW%@ÝŒ¬´iYP ¢8ð˜üå;Ûëô•”¸s.¥3eœŠƒ¿HÏõ(•Êœýí4VKš¦‘ÉdX¿~=[·n«®B¡pŽÃ.ùŸS/ðЃ÷àºnœ‰®¨Cô-lÚî”ËšlûÂ6 ßâ­ÞÓ¯Ÿ" ¼²3ïû)$¾ë3ðÄ+\›¾".Âóù<ëÖ­£¹¹™B¡pû+™ª9c¹\¦Z­"„ˆs¤sBAÂÆN% Ú„NÈðËÃL>÷î7×E`\)‰ç¸Øé¾çc:š¦ã{s£g!I­»œ¡­­õëדËåÎkë‹5ðo'~ÎCÞ‹£¼X˲âò3 Ãs4f%lÉ$ބˋϾBÊO¡UŒe+²âØSÇ{Å-h½²[·1M4òL‘÷¾ Z R©™L&_¦ËÙôRÁD ðOö\Áÿ½þÉ I?‰±ÃBO™œID]cã(—™_¿Ãû¯}®Æ¥W¬çäÿNS:0ú­z6j.©Ç•”¡Bú‚éø”NÏÁiøæ¾ÉÐЙL†t:M.—Ãqœ8¯?Ÿž«üЇ¼—ŠtäOî¿G9T•ƒ#]\å2'JTD¿ê#*>¢*U¨ æ'ç‘®fZ,K¿Xœ~f¼÷ÔÀ(ÊR]éKÆ~H—Ûå@‰étºÁÞWÒ@}½.˜D ¢9Œf(‚0Dq¡ QžŠ‡¬ +añᯆ(¾Tlh±˜Ët"Æ•RˆŠ‡fi”NÎÁÙ…?°m;ÖÀÒÊj©u§üEé lø+˲Èd2 ÛåJ&´¸dôkÌûß‹š02ôQJ"]‰\ľp%ÕÙ*óã³OÁaÎipé+ôƒÆ•”ˆª®è½¼”mÛ iðJ‚€W´#ÜÿÀ_,€Eƒ0QÁ—>BÔšdž\`¿"| @©Rº¨ænÑ{Åé=!Þ`PAlÓõôxjjªÁÖ5M‹ËÈ¥‚-6›Fö%®ðŽ_öPžD8>^ÉÙw(NÎ2õîØ²ì¯¤EZPЕt×»víâðáÃìØ±£h½‰µ8 ‚€ëµ«øÁ?=±¸ AD>á |WàW|”§ð«wÖÅ›sU?"&J£—m/êçm-°àäèÉx±©©‰»ï¾›îîn<ÏÃó<|?úØììlìÀRJ ÃXä‘ý{AT¶zÂÅw]”™tWqñ«>ÎÙÕÑYÔ!µbsW¿@otœ¶Ÿ:;½3Íã?Î7ÞÈæÍ›JËD‚Ûo¿ááaÞzë-¶lÙ÷Gƒ À4MîÝr+?zì'±d¨(Ë ®ïãy¯âQ«R<]ÂqQUI N§Ô_ªƒ[®7ºšt0:'ØÉ‡áå—_æšk®!•Já8N\çV«U<Ï‹ñì³ÏÒÔÔÄ¡Ô!núË=¸Êã¬?ƒã¹ÌÍÌQ9[¦2UÆ+yȪ_r™8ò!º¦/f~h¥#×Õt×;ºØÉ‹}™>†‡‡yæ™gضm[ x¹¹R©àº.žçqÇKwpÏßÜÏxé$G~z˜ñ##ç|ÈÐ:ðâ"æWÀ¨Ôÿÿ`Êþ˜âÿ€$÷ÿ?Xòjhh8„ZŽB…%¯þÿ ¦ J€<„¨vìÖ⤜z(tÌWºIEND®B`‚lurker-2.3/imgs/Makefile.am0000644000175000017500000000030011267070016012567 00000000000000imgsdir = @default_www_dir@/imgs dist_imgs_DATA = \ a.png b.png c.png d.png e.png f.png g.png h.png i.png j.png k.png \ next.png prev.png bar.png paperclip.png root.png reply.png trash.png lurker-2.3/imgs/prev.png0000644000175000017500000000052711267070016012230 00000000000000‰PNG  IHDRY Ë'PLTE>>ÝÿÿÿööýîîûûûþÐÐöMMßFFÞ>>Ýææúøøýââùïïûq/äÐp°ŽŽRCÁR@‰)Ï…C%ÀÞšVÑž©ˆ-@àý§O`Ú貿IEND®B`‚lurker-2.3/imgs/f.png0000644000175000017500000000031011267070016011467 00000000000000‰PNG  IHDRÕk PLTEw ÿÿÿ&÷—DftRNS@æØfbKGDˆH pHYs  ÒÝ~ütIMEÕ6µØSÉ5IDAT×c```>À¨Ôÿÿ`Êþ˜âÿ€$÷ÿ?Xòjhh8„ZŽBÿ ÇŃj'z!!Éd²@${ @Ȧ„@ €%ĪUo© ª"^¤©€V«€Ëµ¨m/´ôº\¥Vzk+¨ˆ‚ ˆÉIÈBÂ’u²MHfÉ$aΜsî)TÀ¤ÀûùäóÉgÎó>ïó{Þç}VaË–-ܨePcÃ-|øñŒÍȳ×VQ¦D¥Ü|Õ}⌚f‘9)\—7ÐÜ܈9À̘¤1üõƒMœ©oeXd4sGéT†=~:Bt:öÀÑT&“óÈkŒFnžÃĹË0J¾ÚòÏåíúÂï½Ý(^’’Ç\ŸGl·Û…بF%ÄÑÕ©ÐÛ-ÑÛ-átµáõI´µ·P×ÐN—£¨£«ÓÉo~»îwüx>éwN#¨£…¿ÿiÝeAÄ=ünµˆà<ÎÄIß+×€DEEª:/ÁÁ¡8]m´´ÖÐÒb£¹¹‹.G/², utvœæwfóÔSËñJ^š›ü|f?þ*Q·¤â=uŠ¿ÿiÝwΑv‚ö ååeÜ;ýÚÄÅP§$†ªçJØw¸”={¿¡¡á--6~Áõ:-=îF†åË{xîù±wtðõ×ûðùÎùù©¨ÌZ±ŽQñ¡Pwš?øä’[&qlWš!IWõ>ß "*Z3|˜zfûZÞ^¾š³"[¶|J[{ ­m.º½èuZúúìDF†ðÆÛÙô×MDGǰ{Ï.gÏ’9añÃ.áÀŒë…@= ß|BÞÞ½*@FH½Únsñmþ ²³' ,^\ÎT”¾ê¶­§²8ï9™ø„ J«ims!+Q‡É¤§×Ó zùÕ¯~ɃÎUƧÈäæÜ‰¬Hø| ªêC+ŠˆÙ'ÒÛÛCtôpuæ ïðççR²õψZšù3(ËórÌ!±òæ[@¼Xð1Ç© ;×±ïµTçÓ{·ޠ!ø¦¼}nL&=.g;/~„âc%Ì›7ÿ{D¨A¯×h @«Ãý‚ ƒ–Ê|Ì0‰ª=' M˜0 óñßÀŒœÕóõ{¼÷Æ›H²ŒN£éÖ %9#‹´{èðQ|ô8­¶SÌ7U«Va ´ ¨Ê™7ÙšðùT¢£¢úí_UPUQÐ c§Ý€±u?í6;Ït2ùž»žrt9ÜDeÝÏЯ¶a?ÓL¯ì%vT䋬/À²ö¦^NöX¸z=AÁÁtVU±q郊UUB.Œ[®$ø+N—›Ø¸‚­VÊ++ˆˆ‰!&fN§‹Ý»vQPP@MUA–`"#£ˆŠŒÁd¡¦¦APQU•Ñ_ÐÞ á‹SnfäÞ@xd,ãç=9([þç|¾}§:`‡S¨IÁ'û0›]ÛU‡l !<|:½€[ÆO"9÷At‚JÙŽM©N%N¬:zf®|“FÅ$°aõ2ÊJËú‹$«…Ûo›†F@øê‹ÄÅÇ‘’|3 õõ456âq»‘U‡ËA³­‰Ï>ßFw·k°•ÄÑIÜvûtZZm„Zi·¹¨.?Åm9?@¹È5ßzÛdNÍÀ¬ÕðÉ[¿£¢¢Bp.TXTHh\þ| ƒ[¬>=ò¿;ŠŠ‰CVQƒ­ÁX-Aˆ"4ÚšˆŠ‰!sâdöîÞ‰¬X,DEF2mZéãÆpôhn—‡ð°Ã´7hÈkì%kr²,#ûú£ ¨ˆ‚Ȥ–1bÂDÂZ>Úð*ív»: ’ä ŠŠ›ö0ÉS2Ð ©µóê¯_ñÓüðî{©o¬c÷®]ˆB?²´´THNNæDE9Ý.'QQY--.btbA‹ß|B&>4­¨Ád4"êDDQDgСÑê¹õÞù˜n Ç,*¼óús—€¸j:m³5 õ­d?°«Ù„Ù eß_þÀŽí;ü4sæÎGQeå"ûÖlÊ—s¢â8ÎînZÛZ7n<Ó²ï oï\n'GSR\Èè™ ™çÔÉûµ.öçLÚó©Ì…¥7™¹ø9Æ`îíå­ ¿x=PUU9fž÷Dã†êycÕRlýñÁjµ5e*11ñ|sè n—‡I“§’•5™_<ù4gÏžåèÑ"¬V+y{wóàœyX,„‡¦üpæ™™5åÒüFÔ`6šQ霃ÁÀí?Y‚,hд7²ö¥ÕªÇãQ¿€$ù„¢B†ä,bÎOïC£Ó06XaÙOúãsjJ*õuTWV’=Q#Âñ²*+Ë©¬ª$11‘¤”›9Y}‚ŒŒq˜Í.ªöœ$2ù,«ß/,ÕŸÂ\Xá7ÛŸ*§Ù¾mçÀJJ‡Ã)œ®­'}ö3„‡ ío^9Èÿ¾ýÆ?KÅ9s˜ùÀ,,AVnIKã‹;D…ˆÈH’“’©ª¬F•eÆeŒ':ÐæÏÌÌæß®âÈ·‡ý411ñlÝú1ûöæõg¤ùùX,Vª«O *– ~[× ü°—v‰ÉS²Ј =žîºœN¼çúèéñðÇ ¿ç\] zšUϯYC||¼0¨ÖbqQ!QY3kÎ=¸}é&~¹|nw·ÿâM&· £ÉHN,güø ŒILBëëÂlvq ¨‰ìÛg\öF<ÿ§å¬½•?¬ÿo´õèU¨U ¬ZóáC‡ ƒîöxŸfÕôá´Aµ½/Déi·McÖœ{xoãVn²xcíÓ$§¥22aÉÉ©K__Ïwöÿeg1OýaŠª¢( Šçz»9yª†S§jؿ¡À£Â9]Àe…twúb×ZRZªfÍ]Czù Ž}[ÉÌ‹ðÑg_a4‰Ï×wéa‚ÄÁâÃdüè!bâ†ãptQ^^ʙӧ8RXŠz®‹¶ö6Fiñ* uÝÊ…¿¦ù€ÝnN·8¹oÉ‹X†„¨'¾ÏÆK/½rÅ=r_Û‹íZ‚xåׯ±tÙJ>ø`3 Määd£j-tÚÛHëï|t¨&^{ý7\­¬™5kÖ¿=Ȱwt¼4&}Ê‹Ãò~‹E'p¬¤˜€a1$&&¡ªÊy_®ðïm¤¹ÝIÞ·Çév¹IMMäGÿqÌšÅä)Ùúñ§ÔCJˆŽŸL£ÏÈ¢ÅKHII¹ª‰ ×:b ¶ªÙã’øèõ•ܽ—^I¡´[å÷ïÆð#ü-ɧàèrb2‘eÉ+!É>Ün¯þúuª‹ö32HKO¦N2²ê*fs]GL‡S¨lìdöSk± Gò)ŒÐÉ,_þžîKp` å_ZéÝ<ùĪ‹ö“b WV©“Œ,_ùÔ€„¿n3²S'k»×È‚W_ÅjÁ¨ é¬âÍ·þçŠ{jjjXøð|”öZRC tžóRëÕ³jÍ ßk67dÈWXTHÂè©,œw:­È0“†Ã½KeÅñË_Ͳ¥cê±3Òjì~š¿î$É'­¨&}ö3dŽO Þ¢cñ¢Ç¨«=í§ÛþÙ§,]²˜x]/#­Fš<>ê$#«©ù2fµÙš…Ú.¥?JŸ7¥D}7O?ýÀ¨Ôÿÿ`Êþ˜âÿ€$÷ÿ?Xòjhh8„ZŽBÿ ÇŃjÇn-N ú&v‡öù÷IEND®B`‚lurker-2.3/imgs/next.png0000644000175000017500000000052611267070016012231 00000000000000‰PNG  IHDRY Ë'PLTEÿÿÿÿÿÿööýîîûûûþÐÐöMMßFFÞ>>Ýææúøøýââùïïû2AÖ^tRNS@æØfbKGDˆH pHYs  ­#½utIMEÓ 2'Ëòr ¨IDATxœcD BÈØXÆq «hOUpD¦wA¥#˜ãZâ´G8`‰°ƒ (H¢££=ÈQ)j`èè(rv€8 ­‚ RCG›"ƒLEp´2w@9 H§¦¨L(fÐÁ˜=­pK9 –JV@ÜÖ>äÐp°¦ŽRC=!^˜ñ\8Tìm¡i홊Ø(yOœø ÙIEND®B`‚lurker-2.3/imgs/d.png0000644000175000017500000000024011267070016011467 00000000000000‰PNG  IHDRÚ¹¯»PLTEâÇÃtRNS@æØfbKGDˆH pHYs  ÒÝ~ütIMEÕd3IDAT×c` üÿÁ DcÕ®÷×ÐMIEND®B`‚lurker-2.3/imgs/k.png0000644000175000017500000000030111267070016011474 00000000000000‰PNG  IHDRÕk PLTEw ÿÿÿ&÷—DftRNS@æØfbKGDˆH pHYs  d_‘tIMEÕ;9<™'¯.IDAT×c` ü u544B-G¡Â’WÿSP%@BT;ó(’y!0œÄIEND®B`‚lurker-2.3/imgs/paperclip.png0000644000175000017500000000026011267070016013225 00000000000000‰PNG  IHDR Þí¯¦PLTEÿÿÿUÂÓ~tRNS@æØfbKGDˆH pHYs  ÒÝ~ütIMEÓ 9£è‚N#IDATxœc```a`Pb`pj€¢ lȧÁ¡A‘AŽïJ #¨%ŠIEND®B`‚lurker-2.3/imgs/root.png0000644000175000017500000001306711267070016012242 00000000000000‰PNG  IHDR00Wù‡bKGD»»ÿz]| pHYs  šœtIMEÕ4g×6¯ÄIDAThÞµš{p\×}ß?÷µww}añ~|$@R|¢,U2M=bÉ”%y¢¨j¢ÄŽûp_±3ý#Ó™vši¦Æ3ù£i›Ô™´¶£‰6‘műåH®õ (S4%‚ €A¼ö½÷Þ½¯súÇiKu”ÆgæÎ¹wgïÙß÷|ï³Ê—¿üe¶‡ªªT*|ßçâÅ‹ø¾O†èºþ+¾ï?¦iÚLkkëÍD"qÓô­7^îz4¸8x%ä£Z•ß*Ö÷PÕ¯!«„ncQ)¹5ªÏ?Wÿ’¿‹¡¿ß‡Š¢àû¾ œúWûöí;«ªª’ÏçÉf³ø¾?õþÝ¿9¾˜˜ø­GÑ#Z_gœ#Kõø ÿ’Àý"ø dpä?Ç¡*ŠÂí€"588øµ§Ÿ~úGyäñ¾¾>ÅqÙ××ç?õÔS„ah®mæU–®€¬¡EèÌB§ZÂô«1EUŸ ÿzó»(ÆF@þ\èR¾·°”)å`.—{MÑ{ãÆ Êå2›››á}÷ÝÇØØ˜1==ÍÄÄÄ?”0xŒ¦=w÷óùVo ¢î" UO‹&+Zâóu5ö+ÞD_EQþ )ý¿3ÓÓÓÜ" Ãå &£Ñho.—cqq±þÌ3Ïh'Ož4¦¦¦XZZbzzzéêøÈnýkŸfßWÞM -°IàcÈ€^l­¹¹ªÆʻ⡺ç}†®C_béÇoQ]+þÿÐwa•‹TÊ%ÊÕµZ-tçO\×îïï?”L&ÕÞÞ^mqqQ"‹‘[ZˆžÛˆ¬žøí?þ¯ð`ÓØw¯Á«S‚&Q¥^« „ª QhC¬t }öUŠ«³ËAëuøáÏËÑGÿ±ŒÁü[W‘²þ·Pu<´ŽD£·†‚D7t$ÊkA<ÐÒÒÒ»²²"ï¿ÿ~:;;•ºã°^(·§Ï>öÈ=w?Aá›ã`„^µ„ô]4TáƒoÖ6¨V˜«ú"ý”ûÐéÃígÄÕ›åDÒé<|F}ü)Œx†åË@@©Pdác¿ÍõÓ_á£ù6Z袺–-!Þ?üøÚÚZ888(;;;Õ0(äsÚbó¯æÚx}!FÝóðë6.ºôѤÖ‘õ ~y ËÇJîc§?ÖôOïÑ´̬(ºI½¹»ÅïûÙÁÃlÞ¸‰]XþP@¹û— öîc­ý7Î0=øñê2±Â\µ·»ç×Q5³\­…ÇŽÑ’Òæ߸PàâF"&È€•]4„WëUÂÊV2 úÿÞSê¡Ii á^¶¹¼”#1Ô–Dª:¥Ìð0CgžÅ·V¯\Ä߀‚ò‘g‘{!©ª#ÂRÿG™Í;3ârêÈ{†GȶdJøŸ¢( RJ‚ Àó<,Ë"—Ë1?¿ðò.\ø]ÇqŠxµBÈ6 µ­5œÂµ¬;·+ªØ‡ÊJ†]½¤"†b­Ï)²¼Š¨‰¦»é¾Ÿ#‡ŽrÿÁ#í·æªüàò7æÞá“-S|æ#Yî:z‚þÁ=477ïJÿ¯±½ûÕj•r¹L¡P`ee…Z­öŸªÕê¥ÅÅņœànÍÛq¨!×FúRO'Ý…ÈâF‘Hª‡¾–4å¹‹È Vûöß=ÚŸb&@Ö,–o¸|}…‹7nÐí_á³#u>¾—}£GèèèÄ4Í•Yn îû>år™ÅÅÅJ¹\þÍD"Q™˜˜ Ã÷ dï%žï/ttvÜ¿»çP³=Ïòê¾Ù¾Ö<¿Þܽ?,ÜÜ27Ö¹º°Lµ0ÇXj•ç9xÝÃ#d[ZvŒõÃŒH$B,CÁææ& Ó–eý^: Ã`vvögõ®ë~ÏŒ'žÙ¿?Kjywf¾NEÖE*‘–v‘•Ü µ*"¬r{•‡`Wo»öî§££ƒæ¦¦T™mßvŸš¦ýÔwƒ Àu]ªÕ*õzý&àù¾ÏÈȯ¿þ:ŽãÜÉ€®70¤Ói†††hkk Ïvw÷èíídŒ€&wEqÔ¸’w\¯C,(ÇëÊSûB<ÐÆÞ¡aúwí¡µµ•¦¦¦÷ ŸÏ311ÁÌÌ ËËË”ËeTUÅ4Ͷ„Ôëu*• óóó¬­­}WJùÒ6;™L†ééé;8}ú4ID £ãúÞt­V›p]÷xWWM͇ik_'2}‹Ù«oXŸóO?ÚÞÞÝKk[;‰dЍiâ8ëëëxžÇÈÈÈ*4??Ï… (•J!¶koÚÚÚ£§§g‡ß÷©ÕjÔj5Â0œÞöPº®£ 4t& T·ÌÍÍAJÐu›ü¯÷«µjí8] f’É$õºKai¶Ù Âü®}ˆÇã Ã+•X®Õð}ŸL&ÃàààÂOMMñæ›oÁŽQA€mÛŒS«Õ8{ö,ÙlEQ¨×ëäóylÛö„o麎išLLLð­¾…ŒJÈÜàúõë 7Ö Õ‚Âë…¿j϶ÿŽ¢YÓ4"‘=½¤³­F±PJ!ÂZ­¦ÕëuR©d2‰Äþ~}}óçÏ#„ ‹íøzMÓ0 Ã0§¯¯3gÎF1M×usÀMEQxñÅGliâ} 9 zÁÑ••U»T*Ýô¨6*S$"O j!þBˆ7呯ä°,‹ºZ'Ì¢Iê ¦#_(P\G$dL:²;6à¿Éÿ6ÆxF;È£Ú(ŸkÒš°ª6¯Î½B\i&©'ÐGu®,ãOû<’ÁÁAVWW©Y5¢ftGxß÷ñ¯ÙE=#‰ ›àK„'B‚E‘(º‚’TÑIܽ!NÌÆÎÛÔò5Ó§#ÕI6h%F);eªJç5q^ñ¹Á? "©Ÿò "=@W˜È¦µÍò&U#¢˜ÄÕ&4©º!F‹Îuuš¿žý>Ç;O0»Rí-üõäK$b)´P#ôC‚0 BðÁÓ=ÞJž§CvЧ(” d2™´`;IEØ!¦Ô1ÕH‰zø·eð  MJÌ0ÂÅúÛ8i'SG"^˜ª ”ÆÁØ*'s€ +Ã|¢¯spW­äðíëAv¥ƒ¤‘"›jA•B„øa€D¢j*~Ýc=·Á+Ö+œRO1·0ÇîÝø¾¿Ã4Ü£§•&£ ˵¨ûn# %Mj3†nà>uY§&,\ÕEBЄ†®ixª&4·:m õ‘4z/Þ|Çrh‹ô—qRZ!$QÓD×5é#(ªŠšJÐÒÞB©Vbva–ŽJ–eQ-U)K8–MÍ®¡uè$IáWV‹«,Úó AS¤™ÖX¦ˆR³jäøkûŒý¼ðã|ï\øçrŽSŸ‹ÿCµ¬™SÓSl®æëᆘ–Â)J\§Ä5êÌlµs[žçŽƒÀ÷ªï»Õ#|‘&FE 3|‡«Ê‡Ô!Ѻ1Ó‘îHÂŒQC×QÑ@*?ij<œ¼UsÖÜUQN2ÃK8\V€ "Ø©ç¢ÿ-XeÌúQýE6xEcT;”Å>Y—‚«xä€Í-U)•ÛšY?uܯüÄ} èÚŠrµ­E aÒO+ûh¦4*‚Ÿ*U–Ù`‘€ÜÕë[;ælÕìî-^¹mG£@óÖ½·5‹Û½ÍvôÞçYßJ³ÃÛèR·@é[s0·feëGü­r¶îýŸ¤{ë»Ûï¸[ï)·É!ùªPøÛ u««§Ýq<ø4ÿ<ÇÿU+°–៳IEND®B`‚lurker-2.3/imgs/a.png0000644000175000017500000000022611267070016011470 00000000000000‰PNG  IHDRÚ¹¯»PLTE§z=ÚtRNS@æØfbKGDˆH pHYs  ÒÝ~ütIMEÕ¡7ç IDAT×c` -`7xIEND®B`‚lurker-2.3/Makefile.am0000644000175000017500000000162611267070017011645 00000000000000SUBDIRS = mymime libesort common index prune render ui imgs . EXTRA_DIST = FAQ install-data-local: $(mkinstalldirs) $(DESTDIR)$(default_config_dir) @echo @echo "*** PLEASE READ ***" @echo @echo "Lurker config files have not been installed (for your protection)" @echo "If you would like the default config files installed, run:" @echo " make install-config" @echo @echo "*** PLEASE READ ***" @echo install-config: $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/$(PACKAGE) if ! test -f $(DESTDIR)$(localstatedir)/lib/$(PACKAGE)/db; then \ echo 1 8192 255 > $(DESTDIR)$(localstatedir)/lib/$(PACKAGE)/db; \ fi $(mkinstalldirs) $(DESTDIR)$(default_config_dir) $(INSTALL_DATA) lurker.conf apache.conf $(DESTDIR)$(default_config_dir) @echo @echo "Now put 'include $(default_config_dir)/apache.conf' in your apache config" @echo "And don't forget to setup a cron job as described in the INSTALL file" lurker-2.3/mymime/0000777000175000017500000000000011272633206011166 500000000000000lurker-2.3/mymime/Makefile.in0000644000175000017500000021001311272632672013152 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = mymime DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libmimelib_a_AR = $(AR) $(ARFLAGS) libmimelib_a_LIBADD = @LOCAL_MIMELIB_TRUE@nodist_libmimelib_a_OBJECTS = address.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ addrlist.$(OBJEXT) attach.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ basicmsg.$(OBJEXT) binhex.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ body.$(OBJEXT) bodypart.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ boyermor.$(OBJEXT) datetime.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ disptype.$(OBJEXT) dw_cte.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ dw_date.$(OBJEXT) dw_mime.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ dwstring.$(OBJEXT) entity.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ field.$(OBJEXT) fieldbdy.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ group.$(OBJEXT) headers.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ mailbox.$(OBJEXT) mboxlist.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ mechansm.$(OBJEXT) mediatyp.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ message.$(OBJEXT) msgcmp.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ msgid.$(OBJEXT) multipar.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ param.$(OBJEXT) text.$(OBJEXT) \ @LOCAL_MIMELIB_TRUE@ token.$(OBJEXT) uuencode.$(OBJEXT) libmimelib_a_OBJECTS = $(nodist_libmimelib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/tools/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(nodist_libmimelib_a_SOURCES) DIST_SOURCES = ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Work around mimelib bug on MacOS X AM_CPPFLAGS = -DDW_UNIX # Support building mimelib ourselves @LOCAL_MIMELIB_TRUE@noinst_LIBRARIES = libmimelib.a @LOCAL_MIMELIB_TRUE@nodist_libmimelib_a_SOURCES = \ @LOCAL_MIMELIB_TRUE@ ../mimelib/address.cpp ../mimelib/addrlist.cpp ../mimelib/attach.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/basicmsg.cpp ../mimelib/binhex.cpp ../mimelib/body.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/bodypart.cpp ../mimelib/boyermor.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/datetime.cpp ../mimelib/disptype.cpp ../mimelib/dw_cte.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/dw_date.cpp ../mimelib/dw_mime.cpp ../mimelib/dwstring.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/entity.cpp ../mimelib/field.cpp ../mimelib/fieldbdy.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/group.cpp ../mimelib/headers.cpp ../mimelib/mailbox.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/mboxlist.cpp ../mimelib/mechansm.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/mediatyp.cpp ../mimelib/message.cpp ../mimelib/msgcmp.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/msgid.cpp ../mimelib/multipar.cpp ../mimelib/param.cpp \ @LOCAL_MIMELIB_TRUE@ ../mimelib/text.cpp ../mimelib/token.cpp ../mimelib/uuencode.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mymime/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu mymime/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmimelib.a: $(libmimelib_a_OBJECTS) $(libmimelib_a_DEPENDENCIES) -rm -f libmimelib.a $(libmimelib_a_AR) libmimelib.a $(libmimelib_a_OBJECTS) $(libmimelib_a_LIBADD) $(RANLIB) libmimelib.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/address.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addrlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attach.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basicmsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binhex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/body.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bodypart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boyermor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datetime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disptype.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_cte.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_date.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dw_mime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwstring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/entity.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fieldbdy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/group.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/headers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mailbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mboxlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mechansm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mediatyp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msgcmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msgid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multipar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/param.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/token.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uuencode.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` address.o: ../mimelib/address.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT address.o -MD -MP -MF $(DEPDIR)/address.Tpo -c -o address.o `test -f '../mimelib/address.cpp' || echo '$(srcdir)/'`../mimelib/address.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/address.Tpo $(DEPDIR)/address.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/address.cpp' object='address.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o address.o `test -f '../mimelib/address.cpp' || echo '$(srcdir)/'`../mimelib/address.cpp address.obj: ../mimelib/address.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT address.obj -MD -MP -MF $(DEPDIR)/address.Tpo -c -o address.obj `if test -f '../mimelib/address.cpp'; then $(CYGPATH_W) '../mimelib/address.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/address.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/address.Tpo $(DEPDIR)/address.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/address.cpp' object='address.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o address.obj `if test -f '../mimelib/address.cpp'; then $(CYGPATH_W) '../mimelib/address.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/address.cpp'; fi` addrlist.o: ../mimelib/addrlist.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT addrlist.o -MD -MP -MF $(DEPDIR)/addrlist.Tpo -c -o addrlist.o `test -f '../mimelib/addrlist.cpp' || echo '$(srcdir)/'`../mimelib/addrlist.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/addrlist.Tpo $(DEPDIR)/addrlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/addrlist.cpp' object='addrlist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o addrlist.o `test -f '../mimelib/addrlist.cpp' || echo '$(srcdir)/'`../mimelib/addrlist.cpp addrlist.obj: ../mimelib/addrlist.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT addrlist.obj -MD -MP -MF $(DEPDIR)/addrlist.Tpo -c -o addrlist.obj `if test -f '../mimelib/addrlist.cpp'; then $(CYGPATH_W) '../mimelib/addrlist.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/addrlist.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/addrlist.Tpo $(DEPDIR)/addrlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/addrlist.cpp' object='addrlist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o addrlist.obj `if test -f '../mimelib/addrlist.cpp'; then $(CYGPATH_W) '../mimelib/addrlist.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/addrlist.cpp'; fi` attach.o: ../mimelib/attach.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT attach.o -MD -MP -MF $(DEPDIR)/attach.Tpo -c -o attach.o `test -f '../mimelib/attach.cpp' || echo '$(srcdir)/'`../mimelib/attach.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/attach.Tpo $(DEPDIR)/attach.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/attach.cpp' object='attach.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o attach.o `test -f '../mimelib/attach.cpp' || echo '$(srcdir)/'`../mimelib/attach.cpp attach.obj: ../mimelib/attach.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT attach.obj -MD -MP -MF $(DEPDIR)/attach.Tpo -c -o attach.obj `if test -f '../mimelib/attach.cpp'; then $(CYGPATH_W) '../mimelib/attach.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/attach.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/attach.Tpo $(DEPDIR)/attach.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/attach.cpp' object='attach.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o attach.obj `if test -f '../mimelib/attach.cpp'; then $(CYGPATH_W) '../mimelib/attach.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/attach.cpp'; fi` basicmsg.o: ../mimelib/basicmsg.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT basicmsg.o -MD -MP -MF $(DEPDIR)/basicmsg.Tpo -c -o basicmsg.o `test -f '../mimelib/basicmsg.cpp' || echo '$(srcdir)/'`../mimelib/basicmsg.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/basicmsg.Tpo $(DEPDIR)/basicmsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/basicmsg.cpp' object='basicmsg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o basicmsg.o `test -f '../mimelib/basicmsg.cpp' || echo '$(srcdir)/'`../mimelib/basicmsg.cpp basicmsg.obj: ../mimelib/basicmsg.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT basicmsg.obj -MD -MP -MF $(DEPDIR)/basicmsg.Tpo -c -o basicmsg.obj `if test -f '../mimelib/basicmsg.cpp'; then $(CYGPATH_W) '../mimelib/basicmsg.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/basicmsg.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/basicmsg.Tpo $(DEPDIR)/basicmsg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/basicmsg.cpp' object='basicmsg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o basicmsg.obj `if test -f '../mimelib/basicmsg.cpp'; then $(CYGPATH_W) '../mimelib/basicmsg.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/basicmsg.cpp'; fi` binhex.o: ../mimelib/binhex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT binhex.o -MD -MP -MF $(DEPDIR)/binhex.Tpo -c -o binhex.o `test -f '../mimelib/binhex.cpp' || echo '$(srcdir)/'`../mimelib/binhex.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/binhex.Tpo $(DEPDIR)/binhex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/binhex.cpp' object='binhex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o binhex.o `test -f '../mimelib/binhex.cpp' || echo '$(srcdir)/'`../mimelib/binhex.cpp binhex.obj: ../mimelib/binhex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT binhex.obj -MD -MP -MF $(DEPDIR)/binhex.Tpo -c -o binhex.obj `if test -f '../mimelib/binhex.cpp'; then $(CYGPATH_W) '../mimelib/binhex.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/binhex.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/binhex.Tpo $(DEPDIR)/binhex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/binhex.cpp' object='binhex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o binhex.obj `if test -f '../mimelib/binhex.cpp'; then $(CYGPATH_W) '../mimelib/binhex.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/binhex.cpp'; fi` body.o: ../mimelib/body.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT body.o -MD -MP -MF $(DEPDIR)/body.Tpo -c -o body.o `test -f '../mimelib/body.cpp' || echo '$(srcdir)/'`../mimelib/body.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/body.Tpo $(DEPDIR)/body.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/body.cpp' object='body.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o body.o `test -f '../mimelib/body.cpp' || echo '$(srcdir)/'`../mimelib/body.cpp body.obj: ../mimelib/body.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT body.obj -MD -MP -MF $(DEPDIR)/body.Tpo -c -o body.obj `if test -f '../mimelib/body.cpp'; then $(CYGPATH_W) '../mimelib/body.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/body.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/body.Tpo $(DEPDIR)/body.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/body.cpp' object='body.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o body.obj `if test -f '../mimelib/body.cpp'; then $(CYGPATH_W) '../mimelib/body.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/body.cpp'; fi` bodypart.o: ../mimelib/bodypart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bodypart.o -MD -MP -MF $(DEPDIR)/bodypart.Tpo -c -o bodypart.o `test -f '../mimelib/bodypart.cpp' || echo '$(srcdir)/'`../mimelib/bodypart.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/bodypart.Tpo $(DEPDIR)/bodypart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/bodypart.cpp' object='bodypart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bodypart.o `test -f '../mimelib/bodypart.cpp' || echo '$(srcdir)/'`../mimelib/bodypart.cpp bodypart.obj: ../mimelib/bodypart.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bodypart.obj -MD -MP -MF $(DEPDIR)/bodypart.Tpo -c -o bodypart.obj `if test -f '../mimelib/bodypart.cpp'; then $(CYGPATH_W) '../mimelib/bodypart.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/bodypart.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/bodypart.Tpo $(DEPDIR)/bodypart.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/bodypart.cpp' object='bodypart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bodypart.obj `if test -f '../mimelib/bodypart.cpp'; then $(CYGPATH_W) '../mimelib/bodypart.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/bodypart.cpp'; fi` boyermor.o: ../mimelib/boyermor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT boyermor.o -MD -MP -MF $(DEPDIR)/boyermor.Tpo -c -o boyermor.o `test -f '../mimelib/boyermor.cpp' || echo '$(srcdir)/'`../mimelib/boyermor.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/boyermor.Tpo $(DEPDIR)/boyermor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/boyermor.cpp' object='boyermor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o boyermor.o `test -f '../mimelib/boyermor.cpp' || echo '$(srcdir)/'`../mimelib/boyermor.cpp boyermor.obj: ../mimelib/boyermor.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT boyermor.obj -MD -MP -MF $(DEPDIR)/boyermor.Tpo -c -o boyermor.obj `if test -f '../mimelib/boyermor.cpp'; then $(CYGPATH_W) '../mimelib/boyermor.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/boyermor.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/boyermor.Tpo $(DEPDIR)/boyermor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/boyermor.cpp' object='boyermor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o boyermor.obj `if test -f '../mimelib/boyermor.cpp'; then $(CYGPATH_W) '../mimelib/boyermor.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/boyermor.cpp'; fi` datetime.o: ../mimelib/datetime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT datetime.o -MD -MP -MF $(DEPDIR)/datetime.Tpo -c -o datetime.o `test -f '../mimelib/datetime.cpp' || echo '$(srcdir)/'`../mimelib/datetime.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/datetime.Tpo $(DEPDIR)/datetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/datetime.cpp' object='datetime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o datetime.o `test -f '../mimelib/datetime.cpp' || echo '$(srcdir)/'`../mimelib/datetime.cpp datetime.obj: ../mimelib/datetime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT datetime.obj -MD -MP -MF $(DEPDIR)/datetime.Tpo -c -o datetime.obj `if test -f '../mimelib/datetime.cpp'; then $(CYGPATH_W) '../mimelib/datetime.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/datetime.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/datetime.Tpo $(DEPDIR)/datetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/datetime.cpp' object='datetime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o datetime.obj `if test -f '../mimelib/datetime.cpp'; then $(CYGPATH_W) '../mimelib/datetime.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/datetime.cpp'; fi` disptype.o: ../mimelib/disptype.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT disptype.o -MD -MP -MF $(DEPDIR)/disptype.Tpo -c -o disptype.o `test -f '../mimelib/disptype.cpp' || echo '$(srcdir)/'`../mimelib/disptype.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/disptype.Tpo $(DEPDIR)/disptype.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/disptype.cpp' object='disptype.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o disptype.o `test -f '../mimelib/disptype.cpp' || echo '$(srcdir)/'`../mimelib/disptype.cpp disptype.obj: ../mimelib/disptype.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT disptype.obj -MD -MP -MF $(DEPDIR)/disptype.Tpo -c -o disptype.obj `if test -f '../mimelib/disptype.cpp'; then $(CYGPATH_W) '../mimelib/disptype.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/disptype.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/disptype.Tpo $(DEPDIR)/disptype.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/disptype.cpp' object='disptype.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o disptype.obj `if test -f '../mimelib/disptype.cpp'; then $(CYGPATH_W) '../mimelib/disptype.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/disptype.cpp'; fi` dw_cte.o: ../mimelib/dw_cte.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dw_cte.o -MD -MP -MF $(DEPDIR)/dw_cte.Tpo -c -o dw_cte.o `test -f '../mimelib/dw_cte.cpp' || echo '$(srcdir)/'`../mimelib/dw_cte.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dw_cte.Tpo $(DEPDIR)/dw_cte.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dw_cte.cpp' object='dw_cte.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dw_cte.o `test -f '../mimelib/dw_cte.cpp' || echo '$(srcdir)/'`../mimelib/dw_cte.cpp dw_cte.obj: ../mimelib/dw_cte.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dw_cte.obj -MD -MP -MF $(DEPDIR)/dw_cte.Tpo -c -o dw_cte.obj `if test -f '../mimelib/dw_cte.cpp'; then $(CYGPATH_W) '../mimelib/dw_cte.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dw_cte.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dw_cte.Tpo $(DEPDIR)/dw_cte.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dw_cte.cpp' object='dw_cte.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dw_cte.obj `if test -f '../mimelib/dw_cte.cpp'; then $(CYGPATH_W) '../mimelib/dw_cte.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dw_cte.cpp'; fi` dw_date.o: ../mimelib/dw_date.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dw_date.o -MD -MP -MF $(DEPDIR)/dw_date.Tpo -c -o dw_date.o `test -f '../mimelib/dw_date.cpp' || echo '$(srcdir)/'`../mimelib/dw_date.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dw_date.Tpo $(DEPDIR)/dw_date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dw_date.cpp' object='dw_date.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dw_date.o `test -f '../mimelib/dw_date.cpp' || echo '$(srcdir)/'`../mimelib/dw_date.cpp dw_date.obj: ../mimelib/dw_date.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dw_date.obj -MD -MP -MF $(DEPDIR)/dw_date.Tpo -c -o dw_date.obj `if test -f '../mimelib/dw_date.cpp'; then $(CYGPATH_W) '../mimelib/dw_date.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dw_date.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dw_date.Tpo $(DEPDIR)/dw_date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dw_date.cpp' object='dw_date.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dw_date.obj `if test -f '../mimelib/dw_date.cpp'; then $(CYGPATH_W) '../mimelib/dw_date.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dw_date.cpp'; fi` dw_mime.o: ../mimelib/dw_mime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dw_mime.o -MD -MP -MF $(DEPDIR)/dw_mime.Tpo -c -o dw_mime.o `test -f '../mimelib/dw_mime.cpp' || echo '$(srcdir)/'`../mimelib/dw_mime.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dw_mime.Tpo $(DEPDIR)/dw_mime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dw_mime.cpp' object='dw_mime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dw_mime.o `test -f '../mimelib/dw_mime.cpp' || echo '$(srcdir)/'`../mimelib/dw_mime.cpp dw_mime.obj: ../mimelib/dw_mime.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dw_mime.obj -MD -MP -MF $(DEPDIR)/dw_mime.Tpo -c -o dw_mime.obj `if test -f '../mimelib/dw_mime.cpp'; then $(CYGPATH_W) '../mimelib/dw_mime.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dw_mime.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dw_mime.Tpo $(DEPDIR)/dw_mime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dw_mime.cpp' object='dw_mime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dw_mime.obj `if test -f '../mimelib/dw_mime.cpp'; then $(CYGPATH_W) '../mimelib/dw_mime.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dw_mime.cpp'; fi` dwstring.o: ../mimelib/dwstring.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dwstring.o -MD -MP -MF $(DEPDIR)/dwstring.Tpo -c -o dwstring.o `test -f '../mimelib/dwstring.cpp' || echo '$(srcdir)/'`../mimelib/dwstring.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dwstring.Tpo $(DEPDIR)/dwstring.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dwstring.cpp' object='dwstring.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dwstring.o `test -f '../mimelib/dwstring.cpp' || echo '$(srcdir)/'`../mimelib/dwstring.cpp dwstring.obj: ../mimelib/dwstring.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dwstring.obj -MD -MP -MF $(DEPDIR)/dwstring.Tpo -c -o dwstring.obj `if test -f '../mimelib/dwstring.cpp'; then $(CYGPATH_W) '../mimelib/dwstring.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dwstring.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dwstring.Tpo $(DEPDIR)/dwstring.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/dwstring.cpp' object='dwstring.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dwstring.obj `if test -f '../mimelib/dwstring.cpp'; then $(CYGPATH_W) '../mimelib/dwstring.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/dwstring.cpp'; fi` entity.o: ../mimelib/entity.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT entity.o -MD -MP -MF $(DEPDIR)/entity.Tpo -c -o entity.o `test -f '../mimelib/entity.cpp' || echo '$(srcdir)/'`../mimelib/entity.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/entity.Tpo $(DEPDIR)/entity.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/entity.cpp' object='entity.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o entity.o `test -f '../mimelib/entity.cpp' || echo '$(srcdir)/'`../mimelib/entity.cpp entity.obj: ../mimelib/entity.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT entity.obj -MD -MP -MF $(DEPDIR)/entity.Tpo -c -o entity.obj `if test -f '../mimelib/entity.cpp'; then $(CYGPATH_W) '../mimelib/entity.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/entity.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/entity.Tpo $(DEPDIR)/entity.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/entity.cpp' object='entity.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o entity.obj `if test -f '../mimelib/entity.cpp'; then $(CYGPATH_W) '../mimelib/entity.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/entity.cpp'; fi` field.o: ../mimelib/field.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT field.o -MD -MP -MF $(DEPDIR)/field.Tpo -c -o field.o `test -f '../mimelib/field.cpp' || echo '$(srcdir)/'`../mimelib/field.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/field.Tpo $(DEPDIR)/field.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/field.cpp' object='field.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o field.o `test -f '../mimelib/field.cpp' || echo '$(srcdir)/'`../mimelib/field.cpp field.obj: ../mimelib/field.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT field.obj -MD -MP -MF $(DEPDIR)/field.Tpo -c -o field.obj `if test -f '../mimelib/field.cpp'; then $(CYGPATH_W) '../mimelib/field.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/field.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/field.Tpo $(DEPDIR)/field.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/field.cpp' object='field.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o field.obj `if test -f '../mimelib/field.cpp'; then $(CYGPATH_W) '../mimelib/field.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/field.cpp'; fi` fieldbdy.o: ../mimelib/fieldbdy.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fieldbdy.o -MD -MP -MF $(DEPDIR)/fieldbdy.Tpo -c -o fieldbdy.o `test -f '../mimelib/fieldbdy.cpp' || echo '$(srcdir)/'`../mimelib/fieldbdy.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/fieldbdy.Tpo $(DEPDIR)/fieldbdy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/fieldbdy.cpp' object='fieldbdy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fieldbdy.o `test -f '../mimelib/fieldbdy.cpp' || echo '$(srcdir)/'`../mimelib/fieldbdy.cpp fieldbdy.obj: ../mimelib/fieldbdy.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fieldbdy.obj -MD -MP -MF $(DEPDIR)/fieldbdy.Tpo -c -o fieldbdy.obj `if test -f '../mimelib/fieldbdy.cpp'; then $(CYGPATH_W) '../mimelib/fieldbdy.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/fieldbdy.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/fieldbdy.Tpo $(DEPDIR)/fieldbdy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/fieldbdy.cpp' object='fieldbdy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fieldbdy.obj `if test -f '../mimelib/fieldbdy.cpp'; then $(CYGPATH_W) '../mimelib/fieldbdy.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/fieldbdy.cpp'; fi` group.o: ../mimelib/group.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT group.o -MD -MP -MF $(DEPDIR)/group.Tpo -c -o group.o `test -f '../mimelib/group.cpp' || echo '$(srcdir)/'`../mimelib/group.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/group.Tpo $(DEPDIR)/group.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/group.cpp' object='group.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o group.o `test -f '../mimelib/group.cpp' || echo '$(srcdir)/'`../mimelib/group.cpp group.obj: ../mimelib/group.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT group.obj -MD -MP -MF $(DEPDIR)/group.Tpo -c -o group.obj `if test -f '../mimelib/group.cpp'; then $(CYGPATH_W) '../mimelib/group.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/group.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/group.Tpo $(DEPDIR)/group.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/group.cpp' object='group.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o group.obj `if test -f '../mimelib/group.cpp'; then $(CYGPATH_W) '../mimelib/group.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/group.cpp'; fi` headers.o: ../mimelib/headers.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT headers.o -MD -MP -MF $(DEPDIR)/headers.Tpo -c -o headers.o `test -f '../mimelib/headers.cpp' || echo '$(srcdir)/'`../mimelib/headers.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/headers.Tpo $(DEPDIR)/headers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/headers.cpp' object='headers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o headers.o `test -f '../mimelib/headers.cpp' || echo '$(srcdir)/'`../mimelib/headers.cpp headers.obj: ../mimelib/headers.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT headers.obj -MD -MP -MF $(DEPDIR)/headers.Tpo -c -o headers.obj `if test -f '../mimelib/headers.cpp'; then $(CYGPATH_W) '../mimelib/headers.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/headers.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/headers.Tpo $(DEPDIR)/headers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/headers.cpp' object='headers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o headers.obj `if test -f '../mimelib/headers.cpp'; then $(CYGPATH_W) '../mimelib/headers.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/headers.cpp'; fi` mailbox.o: ../mimelib/mailbox.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mailbox.o -MD -MP -MF $(DEPDIR)/mailbox.Tpo -c -o mailbox.o `test -f '../mimelib/mailbox.cpp' || echo '$(srcdir)/'`../mimelib/mailbox.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mailbox.Tpo $(DEPDIR)/mailbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mailbox.cpp' object='mailbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mailbox.o `test -f '../mimelib/mailbox.cpp' || echo '$(srcdir)/'`../mimelib/mailbox.cpp mailbox.obj: ../mimelib/mailbox.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mailbox.obj -MD -MP -MF $(DEPDIR)/mailbox.Tpo -c -o mailbox.obj `if test -f '../mimelib/mailbox.cpp'; then $(CYGPATH_W) '../mimelib/mailbox.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mailbox.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mailbox.Tpo $(DEPDIR)/mailbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mailbox.cpp' object='mailbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mailbox.obj `if test -f '../mimelib/mailbox.cpp'; then $(CYGPATH_W) '../mimelib/mailbox.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mailbox.cpp'; fi` mboxlist.o: ../mimelib/mboxlist.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mboxlist.o -MD -MP -MF $(DEPDIR)/mboxlist.Tpo -c -o mboxlist.o `test -f '../mimelib/mboxlist.cpp' || echo '$(srcdir)/'`../mimelib/mboxlist.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mboxlist.Tpo $(DEPDIR)/mboxlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mboxlist.cpp' object='mboxlist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mboxlist.o `test -f '../mimelib/mboxlist.cpp' || echo '$(srcdir)/'`../mimelib/mboxlist.cpp mboxlist.obj: ../mimelib/mboxlist.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mboxlist.obj -MD -MP -MF $(DEPDIR)/mboxlist.Tpo -c -o mboxlist.obj `if test -f '../mimelib/mboxlist.cpp'; then $(CYGPATH_W) '../mimelib/mboxlist.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mboxlist.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mboxlist.Tpo $(DEPDIR)/mboxlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mboxlist.cpp' object='mboxlist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mboxlist.obj `if test -f '../mimelib/mboxlist.cpp'; then $(CYGPATH_W) '../mimelib/mboxlist.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mboxlist.cpp'; fi` mechansm.o: ../mimelib/mechansm.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mechansm.o -MD -MP -MF $(DEPDIR)/mechansm.Tpo -c -o mechansm.o `test -f '../mimelib/mechansm.cpp' || echo '$(srcdir)/'`../mimelib/mechansm.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mechansm.Tpo $(DEPDIR)/mechansm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mechansm.cpp' object='mechansm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mechansm.o `test -f '../mimelib/mechansm.cpp' || echo '$(srcdir)/'`../mimelib/mechansm.cpp mechansm.obj: ../mimelib/mechansm.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mechansm.obj -MD -MP -MF $(DEPDIR)/mechansm.Tpo -c -o mechansm.obj `if test -f '../mimelib/mechansm.cpp'; then $(CYGPATH_W) '../mimelib/mechansm.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mechansm.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mechansm.Tpo $(DEPDIR)/mechansm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mechansm.cpp' object='mechansm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mechansm.obj `if test -f '../mimelib/mechansm.cpp'; then $(CYGPATH_W) '../mimelib/mechansm.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mechansm.cpp'; fi` mediatyp.o: ../mimelib/mediatyp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mediatyp.o -MD -MP -MF $(DEPDIR)/mediatyp.Tpo -c -o mediatyp.o `test -f '../mimelib/mediatyp.cpp' || echo '$(srcdir)/'`../mimelib/mediatyp.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mediatyp.Tpo $(DEPDIR)/mediatyp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mediatyp.cpp' object='mediatyp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mediatyp.o `test -f '../mimelib/mediatyp.cpp' || echo '$(srcdir)/'`../mimelib/mediatyp.cpp mediatyp.obj: ../mimelib/mediatyp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mediatyp.obj -MD -MP -MF $(DEPDIR)/mediatyp.Tpo -c -o mediatyp.obj `if test -f '../mimelib/mediatyp.cpp'; then $(CYGPATH_W) '../mimelib/mediatyp.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mediatyp.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/mediatyp.Tpo $(DEPDIR)/mediatyp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/mediatyp.cpp' object='mediatyp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mediatyp.obj `if test -f '../mimelib/mediatyp.cpp'; then $(CYGPATH_W) '../mimelib/mediatyp.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/mediatyp.cpp'; fi` message.o: ../mimelib/message.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT message.o -MD -MP -MF $(DEPDIR)/message.Tpo -c -o message.o `test -f '../mimelib/message.cpp' || echo '$(srcdir)/'`../mimelib/message.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/message.Tpo $(DEPDIR)/message.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/message.cpp' object='message.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o message.o `test -f '../mimelib/message.cpp' || echo '$(srcdir)/'`../mimelib/message.cpp message.obj: ../mimelib/message.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT message.obj -MD -MP -MF $(DEPDIR)/message.Tpo -c -o message.obj `if test -f '../mimelib/message.cpp'; then $(CYGPATH_W) '../mimelib/message.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/message.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/message.Tpo $(DEPDIR)/message.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/message.cpp' object='message.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o message.obj `if test -f '../mimelib/message.cpp'; then $(CYGPATH_W) '../mimelib/message.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/message.cpp'; fi` msgcmp.o: ../mimelib/msgcmp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT msgcmp.o -MD -MP -MF $(DEPDIR)/msgcmp.Tpo -c -o msgcmp.o `test -f '../mimelib/msgcmp.cpp' || echo '$(srcdir)/'`../mimelib/msgcmp.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/msgcmp.Tpo $(DEPDIR)/msgcmp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/msgcmp.cpp' object='msgcmp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o msgcmp.o `test -f '../mimelib/msgcmp.cpp' || echo '$(srcdir)/'`../mimelib/msgcmp.cpp msgcmp.obj: ../mimelib/msgcmp.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT msgcmp.obj -MD -MP -MF $(DEPDIR)/msgcmp.Tpo -c -o msgcmp.obj `if test -f '../mimelib/msgcmp.cpp'; then $(CYGPATH_W) '../mimelib/msgcmp.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/msgcmp.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/msgcmp.Tpo $(DEPDIR)/msgcmp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/msgcmp.cpp' object='msgcmp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o msgcmp.obj `if test -f '../mimelib/msgcmp.cpp'; then $(CYGPATH_W) '../mimelib/msgcmp.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/msgcmp.cpp'; fi` msgid.o: ../mimelib/msgid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT msgid.o -MD -MP -MF $(DEPDIR)/msgid.Tpo -c -o msgid.o `test -f '../mimelib/msgid.cpp' || echo '$(srcdir)/'`../mimelib/msgid.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/msgid.Tpo $(DEPDIR)/msgid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/msgid.cpp' object='msgid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o msgid.o `test -f '../mimelib/msgid.cpp' || echo '$(srcdir)/'`../mimelib/msgid.cpp msgid.obj: ../mimelib/msgid.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT msgid.obj -MD -MP -MF $(DEPDIR)/msgid.Tpo -c -o msgid.obj `if test -f '../mimelib/msgid.cpp'; then $(CYGPATH_W) '../mimelib/msgid.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/msgid.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/msgid.Tpo $(DEPDIR)/msgid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/msgid.cpp' object='msgid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o msgid.obj `if test -f '../mimelib/msgid.cpp'; then $(CYGPATH_W) '../mimelib/msgid.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/msgid.cpp'; fi` multipar.o: ../mimelib/multipar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multipar.o -MD -MP -MF $(DEPDIR)/multipar.Tpo -c -o multipar.o `test -f '../mimelib/multipar.cpp' || echo '$(srcdir)/'`../mimelib/multipar.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/multipar.Tpo $(DEPDIR)/multipar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/multipar.cpp' object='multipar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multipar.o `test -f '../mimelib/multipar.cpp' || echo '$(srcdir)/'`../mimelib/multipar.cpp multipar.obj: ../mimelib/multipar.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multipar.obj -MD -MP -MF $(DEPDIR)/multipar.Tpo -c -o multipar.obj `if test -f '../mimelib/multipar.cpp'; then $(CYGPATH_W) '../mimelib/multipar.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/multipar.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/multipar.Tpo $(DEPDIR)/multipar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/multipar.cpp' object='multipar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multipar.obj `if test -f '../mimelib/multipar.cpp'; then $(CYGPATH_W) '../mimelib/multipar.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/multipar.cpp'; fi` param.o: ../mimelib/param.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT param.o -MD -MP -MF $(DEPDIR)/param.Tpo -c -o param.o `test -f '../mimelib/param.cpp' || echo '$(srcdir)/'`../mimelib/param.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/param.Tpo $(DEPDIR)/param.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/param.cpp' object='param.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o param.o `test -f '../mimelib/param.cpp' || echo '$(srcdir)/'`../mimelib/param.cpp param.obj: ../mimelib/param.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT param.obj -MD -MP -MF $(DEPDIR)/param.Tpo -c -o param.obj `if test -f '../mimelib/param.cpp'; then $(CYGPATH_W) '../mimelib/param.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/param.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/param.Tpo $(DEPDIR)/param.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/param.cpp' object='param.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o param.obj `if test -f '../mimelib/param.cpp'; then $(CYGPATH_W) '../mimelib/param.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/param.cpp'; fi` text.o: ../mimelib/text.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT text.o -MD -MP -MF $(DEPDIR)/text.Tpo -c -o text.o `test -f '../mimelib/text.cpp' || echo '$(srcdir)/'`../mimelib/text.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/text.Tpo $(DEPDIR)/text.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/text.cpp' object='text.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o text.o `test -f '../mimelib/text.cpp' || echo '$(srcdir)/'`../mimelib/text.cpp text.obj: ../mimelib/text.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT text.obj -MD -MP -MF $(DEPDIR)/text.Tpo -c -o text.obj `if test -f '../mimelib/text.cpp'; then $(CYGPATH_W) '../mimelib/text.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/text.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/text.Tpo $(DEPDIR)/text.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/text.cpp' object='text.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o text.obj `if test -f '../mimelib/text.cpp'; then $(CYGPATH_W) '../mimelib/text.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/text.cpp'; fi` token.o: ../mimelib/token.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT token.o -MD -MP -MF $(DEPDIR)/token.Tpo -c -o token.o `test -f '../mimelib/token.cpp' || echo '$(srcdir)/'`../mimelib/token.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/token.Tpo $(DEPDIR)/token.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/token.cpp' object='token.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o token.o `test -f '../mimelib/token.cpp' || echo '$(srcdir)/'`../mimelib/token.cpp token.obj: ../mimelib/token.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT token.obj -MD -MP -MF $(DEPDIR)/token.Tpo -c -o token.obj `if test -f '../mimelib/token.cpp'; then $(CYGPATH_W) '../mimelib/token.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/token.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/token.Tpo $(DEPDIR)/token.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/token.cpp' object='token.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o token.obj `if test -f '../mimelib/token.cpp'; then $(CYGPATH_W) '../mimelib/token.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/token.cpp'; fi` uuencode.o: ../mimelib/uuencode.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT uuencode.o -MD -MP -MF $(DEPDIR)/uuencode.Tpo -c -o uuencode.o `test -f '../mimelib/uuencode.cpp' || echo '$(srcdir)/'`../mimelib/uuencode.cpp @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/uuencode.Tpo $(DEPDIR)/uuencode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/uuencode.cpp' object='uuencode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o uuencode.o `test -f '../mimelib/uuencode.cpp' || echo '$(srcdir)/'`../mimelib/uuencode.cpp uuencode.obj: ../mimelib/uuencode.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT uuencode.obj -MD -MP -MF $(DEPDIR)/uuencode.Tpo -c -o uuencode.obj `if test -f '../mimelib/uuencode.cpp'; then $(CYGPATH_W) '../mimelib/uuencode.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/uuencode.cpp'; fi` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/uuencode.Tpo $(DEPDIR)/uuencode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../mimelib/uuencode.cpp' object='uuencode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o uuencode.obj `if test -f '../mimelib/uuencode.cpp'; then $(CYGPATH_W) '../mimelib/uuencode.cpp'; else $(CYGPATH_W) '$(srcdir)/../mimelib/uuencode.cpp'; fi` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/mymime/Makefile.am0000644000175000017500000000163211267070016013136 00000000000000# Work around mimelib bug on MacOS X AM_CPPFLAGS = -DDW_UNIX # Support building mimelib ourselves if LOCAL_MIMELIB noinst_LIBRARIES = libmimelib.a nodist_libmimelib_a_SOURCES = \ ../mimelib/address.cpp ../mimelib/addrlist.cpp ../mimelib/attach.cpp \ ../mimelib/basicmsg.cpp ../mimelib/binhex.cpp ../mimelib/body.cpp \ ../mimelib/bodypart.cpp ../mimelib/boyermor.cpp \ ../mimelib/datetime.cpp ../mimelib/disptype.cpp ../mimelib/dw_cte.cpp \ ../mimelib/dw_date.cpp ../mimelib/dw_mime.cpp ../mimelib/dwstring.cpp \ ../mimelib/entity.cpp ../mimelib/field.cpp ../mimelib/fieldbdy.cpp \ ../mimelib/group.cpp ../mimelib/headers.cpp ../mimelib/mailbox.cpp \ ../mimelib/mboxlist.cpp ../mimelib/mechansm.cpp \ ../mimelib/mediatyp.cpp ../mimelib/message.cpp ../mimelib/msgcmp.cpp \ ../mimelib/msgid.cpp ../mimelib/multipar.cpp ../mimelib/param.cpp \ ../mimelib/text.cpp ../mimelib/token.cpp ../mimelib/uuencode.cpp endif lurker-2.3/FAQ0000644000175000017500000001643611270670712010152 00000000000000Why are the dates broken on messages imported from a maildir? Why is lurker warning about From lines during my import? Why are new mails not appearing in my archive? How do I add support for my language to lurker? Why are all my dates off by a fixed hour / don't use "From " header? Why shouldn't I open the lurker mboxs with a mail reader? Why do I get "opening database: Operation not supported" on MacOS? I run postfix and lurker doesn't import any new email; why? Why not store all the messages as XML instead of rendering them as it? How can I delete a mailing list? How is the "Activity" chart calculated for threads? --- Q: Why are the dates broken on messages imported from a maildir? A: You probably imported from a maildir which was improperly copied/created. Normal 'cp' will reset the modification time of messages. With the maildir format, the modification time in new/ is the delivery time. When copying a maildir use 'tar' or 'cp -a' to properly preserve this information. Another problem are mailbox to maildir conversion scripts. Most seem to have been written by people with an incomplete understanding of the maildir and/or mailbox formats. You should never use lurker in combination with a conversion scripts. Lurker has very good mailbox support and should import directly from the original copy. Q: Why is lurker warning about From lines during my import? A: Lurker tries to detect corrupt mailboxes. If the quoted text included in the warning was not the start of a new message, then lurker just fixed your mailbox for you. On the other hand, if the quoted text was a message boundary, you have a badly corrupted mailbox. You will have to repair this mailbox somehow. What lurker choose to do in this case was combine those two messages into a single message which was not correct. You should fix the mailbox, purge your database, and reimport. Do not import corrupted mailboxes! Be aware that when importing with '-m' lurker will always treat lines starting with 'From ' as part of the message body without a warning. Q: Why are new mails not appearing in my archive? A: You probably forgot to setup a cronjob to run lurker-prune. Please read the INSTALL file, section 6. Q: How do I add support for my language to lurker? A: First, find out your ISO 639 language code. All the valid ISO 639 language codes are contained in lang.xml. If your language does not have a standardized country code, contact lurker-users and express your intent to translate and ask what to do. Check the entry in lang.xml and confirm that your language's name is spelt correctly in the language you are translating to. Change localized="no" to localized="yes". Copy en.xml to xx.xml were xx is the country code of the new language. Edit xx.xml replacing the quoted ("") english fields with a UTF-8 encoding of the same string, but in the new language. Check that the translation works by loading the lurker front-page and exploring all the possible types of lurker web-pages. Send your freshly created file to lurker-users@lists.sourceforge.net so that you will be included in the lurker credits and other people can benefit from your work! Q: Why are all my dates off by a fixed hour / don't use "From " header? A: The computer which imports mail should be in the same timezone as the computer which archived the mail. This is because mailbox timestamp envelopes are generated in local time. You can set your local timezone for the purposes of indexing with the TZ environment variable. Q: Why shouldn't I open the lurker mboxs with a mail reader? A: Mail readers like to modify the X-Status header by adding or removing flags which denote that the message is new, or opened, or read, etc. These changes result in displacement changes in the file even if you do nothing but read the file. Also, your mail reader may re-order messages by some criterea. Finally, you might accidentally delete a message. Solutions: 1. Use a procmail rule to copy mail to a lurker mbox and your own mbox which you delete messages from: :0 c lurkers-copy.mbox 2. Make the mailbox read only for you, but appendable by the mail user (or whatever user appends to the mbox): chown mail.youruser lurkers.mbox chmod 0640 lurkers.mbox Q: Why do I get "opening database: Operation not supported" on MacOS? A: You are running the lurker database on a filesystem which does not support file locking. Lurker cannot run safely on such a filesystem and thus refuses to possibly corrupt the database. Q: I run postfix and lurker doesn't import any new email; why? A: Postfix sets a file size resource limit. The intention of this option is to limit the size of mailboxes delivered to. Unfortunately, this option also applies to ALL files opened by child processes. This means lurker will die with SIGXFSZ when accessing the database! You must tell postfix not to set a file limit or use another MTA. mailbox_size_limit = 0 If you have a postfix with a soft limit (does not exist yet), then compile the stand-alone file lurker-drop-rlimit.cpp and run it infront of lurker-index like: lurker-drop-rlimit lurker-index -c /etc/lurker.conf -l devel -m Q: Why not store all the messages as XML instead of rendering them? A: Lurker is designed to hold lots of email. Many other programs need mailing list archives in mbox format. It doesn't cost much for me to re-parse a specific email, so there is not much speed lost. On the other hand, I save a lot of disk space. Example of archivers that use mbox->html + indexer: 1Gb mbox 2Gb html (larger on average) 500Mb index --- 250% space wasted Example of lurker: 1Gb mbox 300Mb index --- 30% space wasted As you can see, since lurker builds the index from the *mbox* the index should be smaller. Furthermore, why store the larger html/xml when most of it probably won't be accessed? Finally, even though I like XML, I think it is important to be able to retreive to original email without any concerns that translation back and forth may have slightly altered the contents of the email. Therefore, I consider keeping the mbox essential, and it seems natural to leave the data in this native format. Q: How can I delete a mailing list? A: Bad answer: 'lurker-search -c lurker.conf -d ml:listid -v' Good answer: delete the mailbox and reimport. You can certainly perform the delete command shown above, but cross-posted emails will then also be deleted. Furthermore, if you are deleting that many messages, you probably want your disk space back. A better solution is to remove the mailing list entry in the lurker.conf, delete it's mailbox in the database directory, and run lurker-regenerate. Cross-posted messages will remain in the database, and you will recover your disk space. Q: How is the "Activity" chart calculated for threads? A: The bar chart shows how the messages in a thread are distributed through time. The first bar corresponds to within one day. The second bar, between 1 and 2 days. They are all scaled so the largest bar fits the available space. Hence why the sum is also displayed as a scale indication. lurker-2.3/README0000644000175000017500000000505511267070017010471 00000000000000For installation instructions, please read INSTALL. For contact information, please read AUTHORS. For common questions, please read FAQ. --------------- What is lurker? --------------- An archiver which can handle extremely large amounts of email. It is fast, intuitive, and customizable. Noteworthy features; - Full field *fast* searching This allows searches like "find me all messages with foo and bar in the body, and beer in the subject in this date range" and much more. - Chronological threading Every other package with threaded-view breaks the arrival order of messages in order to display linkage. Often, they also indent quite deeply and eventually break when people reply back and forth enough times. Lurker uses a different approach which not only preserves arrival order, but also does not nest so deeply that it fails when the replies are too deep. Plus, it's prettier. :-) - Message threading navigation Lurker has a handy navigation graphic available in each message which allows a user to easily see and move between messages that are related. - File attachment support Not only does lurker fully understand MIME, it makes file attachments available for download and directly embeds those a browser can display in the message view. - Multi-lingual support Lurker uses utf-8 and can therefore support chinese characters in the same page as german. Further, it is easily localized with translations already available for English, German, and Japanese. - Cache files available directly to the web server Instead of generating each page dynamically, lurker operates as an error document and creates missing pages on the fly. These pages are then available direct to the server for later requests. This scheme allows lurker to survive a slashdotting more easily since the pages do not need to be rerendered each time. - Completely customizable output Lurker outputs XML which is formatted via XSLT. If a site wishes to simply change the formatting, colours, or graphics, it need merely change the stylesheet (or choose an existing alternative). If the site needs to make actual structural changes, this is as easy as editing the xsl used to render the html. Further, if browsers support it, lurker will transmit the gzipped xml directly thus reducing bandwidth usage for the heftier html. lurker-2.3/ui/0000777000175000017500000000000011272633210010301 500000000000000lurker-2.3/ui/common.js0000644000175000017500000000414011267070017012046 00000000000000var oldClass = ""; function rollOut(thisItem) { thisItem.className = oldClass; } function rollIn(thisItem) { oldClass = thisItem.className; thisItem.className = "rowover"; } function twostr(num) { var out = ''; if (num < 10) out += '0'; out += num.toString(); return out; } function textdate(utc) { var d = new Date(utc*1000); var s = d.getFullYear().toString() + '-' + twostr(d.getMonth()+1) + '-' + twostr(d.getDate()) + ' ' + twostr(d.getHours()) // don't wrap text + ':' + twostr(d.getMinutes()); document.write(s); } function titledate(thisItem, utc) { var d = new Date(utc*1000); var s = thisItem.getAttribute('title'); s = s.substring(0, s.length-16) + d.getFullYear().toString() + '-' + twostr(d.getMonth()+1) + '-' + twostr(d.getDate()) + ' ' + twostr(d.getHours()) // nbsp in titles is bad + ':' + twostr(d.getMinutes()); thisItem.setAttribute('title', s); } function timezone(utc) { var d = new Date(utc*1000); // sadly the offset depends on the date var o = d.getTimezoneOffset(); // minutes, + = west var s = ''; if (o < 0) { s += '+'; o = 0 - o; } else s += '-'; var h = o / 60; var m = o % 60; s += h.toString() + twostr(m); document.write(s); } function form_timezone(form) { var d = new Date(0); d.setSeconds(form.sec.value); d.setMinutes(form.min.value); d.setHours(form.hour.value); d.setDate(form.mday.value); d.setMonth(form.mon.value-1); d.setFullYear(form.year.value); form.utc.value = d.valueOf() / 1000; } function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } function trash(kill) { if (readCookie('lurker-pass') == null) { var pass = prompt('Enter the admin password to confirm deletion'); if (pass != null) { document.cookie = "lurker-pass="+escape(pass)+"; path=/"; self.location = kill; } } else { if (confirm('Really delete this message?')) { self.location = kill; } } } lurker-2.3/ui/fr.xml0000644000175000017500000000562411267070017011361 00000000000000 lurker-2.3/ui/ca.xml0000644000175000017500000000546311267070017011336 00000000000000 lurker-2.3/ui/pl.xml0000644000175000017500000000525311267070017011363 00000000000000 lurker-2.3/ui/lang.xsl0000644000175000017500000001450011267070017011672 00000000000000 en.xml lurker-2.3/ui/pt-BR.xml0000644000175000017500000000516211267070017011673 00000000000000 lurker-2.3/ui/pt.xml0000644000175000017500000000544511267070017011376 00000000000000 lurker-2.3/ui/default.css0000644000175000017500000001356311272626257012400 00000000000000body { padding: 0px; margin: 0px; background-color: #BBF; color: black; font-family: serif; } form { margin: 0em; } div.header { background-color: #BBF; padding: 4px 0.25em 0.25em 0.25em; border-bottom: 1px solid #434399; } div.footer { background-color: #BBF; padding: 0.25em 0.25em 1px 0.25em; border-top: 1px solid #434399; } h1 { font-family: sans-serif; font-size: 120%; font-weight: bold; margin-bottom: 0.25em; margin-top: 0.25em; } h2 { font-size: 120%; font-weight: normal; margin-bottom: 0.25em; margin-top: 0em; } table.external { width: 100%; } table.external td { padding-left: 0.25em; padding-right: 0.25em; vertical-align:middle; } table.external td.mini { padding-top: 0.5em; padding-bottom: 0.5em; font-size: 100%; } div.mini { font-size: 100%; } a:link { color:#11F } a:visited { color:#00B } a:hover { color:#F00 } a:active { color:#A00 } h1 a:visited { color:#11F } dt a { font-weight: normal } .mime-label a { background-color:#DDF; padding:3px; font-weight:bold } img.inline { max-width: 640px; max-height: 480px; width: expression(this.width > 640 ? 640 : true); } img { border: 0; margin: 0; padding: 0; } h2 img { vertical-align:middle; padding-top:1px } table.navigation td img { vertical-align:middle } .selected { background-color:#AAF } /* Mark the thread segment as selected */ .normal { } /* Mark the thread segment as normal */ /* The following are used to induce highlighting effects on thread message icons */ a img.selected { background-color:#77F } a:visited img { background-color:#BBB } a:visited img.selected { background-color:#77F } a img:hover { background-color:#55F } /* the link to the archive top */ a.root img { background-color: transparent } table { border-collapse: collapse; border: hidden; border-width: 0; border-spacing: 0; } table.index tr { font-family: Arial, sans-serif; } table.navigation tr { font-family: Arial, sans-serif; } tr { vertical-align: top; text-align: left; padding: 0; } .thRow { background-color:#DDF } /* header row for mindex/thread/search tables */ tr.lit { background-color:#77F } /* even rows in mindex/thread/search tables */ tr.row1 { background-color:#DDD } /* even rows in mindex/thread/search tables */ tr.row2 { background-color:#EEE } /* odd rows in mindex/thread/search tables */ tr.rowover { background-color:#CAC } /* active (= mouseOver) rows in mindex/thread/search tables */ div.body { padding: 1em; background-color: white; } div.messageBody { padding: 4px; margin-top: 1em; } div.messageBody i.quote { font-size: 95%; } div.messageBody pre { font-family: monospace; font-size: 125%; } /* opsbar = row of them */ table.opsbar { width: 100%; border: none; } table.opsbar td { padding: 0 0 0 0; margin: 0 0 0 0; } div.opsfloat { float: right; margin: 0 0 0 0; padding: 0 0 0 0; } /* opsbox = table on right with attachments */ table.opsbox td { padding: 0px 0px 0px 10px; } table.attachments { border: 2px solid #e8e8e8; background-color: white; } table.attachments tr { text-align: left; } table.attachments th { background-color: #e8e8e8; } table.navigation { width: 100%; font-size: 80%; background-color: #e8e8e8; /* disabled until mozilla fixes the progressive render bug with images border-top: 1px solid #969696; border-left: 1px solid #969696; border-right: 1px solid #555; border-bottom: 1px solid #555; */ } table.navigation th { font-size: 100%; background-color: #969696; padding: 3px; } table.navigation td { background-color: white; vertical-align: middle; } td.padded { padding-top: 0.25em; padding-bottom: 0.25em; vertical-align: middle; } table.appears { border: 1px solid #969696; background-color: white; font-size: 75%; } table.appears td { border: 1px solid #969696; } td { padding: 0 2px 0px 2px; vertical-align: top; } ul { margin-bottom: 0em; margin-top: 0em; } h1.group { margin: 0px; } /* wrap this around the table to fix progressive rendering in mozilla */ div[class~="mozbug"] { /* confuse NS4 */ margin: 0px; padding: 0px; border: 1px solid #000; } table.index { /* broken in mozilla; makes gaps in thread rows */ /* border: 1px solid #000; */ background-color: white; width: 100%; } table.index tr { height: 24px; } table.index td { vertical-align: middle; padding: 0px 5px 0px 5px; height: 24px; } table.index th { background-color: #a8a8a8; padding: 0px 5px 0px 5px; } td[class~="chart"] img { /* We use this selector to confuse NS4 */ vertical-align: bottom; margin: 0px 1px 0px 0px; } table.index td.chart { padding: 1px; vertical-align: bottom; } table.squash { table-layout: fixed; } div.squash { overflow: hidden; white-space: nowrap; } div.goodsig { margin: 0px; padding: 0px; border: 1px solid #0F0; background-color: #0F0; } div.badsig { margin: 0px; padding: 0px; border: 1px solid #F00; background-color: #F00; } div.unknownsig { margin: 0px; padding: 0px; background-color: #888; } div.data { padding: 5px; background-color: white; } img.photo { float: right; border: 0; margin: 0; padding: 0; } .padded td { padding-bottom:1px } /* Adds padding to output tables containing Discussion Tree icon */ .na { color:#BBB } /* used to fade text when link not available, but still has placeholder text */ .mime-label { text-align:right; padding:4px } /* Mime labels in message contents */ .longtext { width:500px } /* sets width of text entry fields */ .mime { } /* block containing one part of message's mime contents */ .mailto { } /* "mailto" elements used inside of message's mime contents */ .url { } /* "url" elements used inside of message's mime contents */ .quote { } /* "quote" elements used inside of message's mime contents */ .art { margin: 0em; } /* "art" elements used inside of message's mime contents */ lurker-2.3/ui/Makefile.in0000644000175000017500000002552111272632673012303 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = ui DIST_COMMON = $(dist_html_DATA) $(dist_ui_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/tools/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(uidir)" dist_htmlDATA_INSTALL = $(INSTALL_DATA) dist_uiDATA_INSTALL = $(INSTALL_DATA) DATA = $(dist_html_DATA) $(dist_ui_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDIR = @BINDIR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CGI_BIN_DIR = @CGI_BIN_DIR@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CONFIG_DIR = @DEFAULT_CONFIG_DIR@ DEFAULT_WWW_DIR = @DEFAULT_WWW_DIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ cgi_bin_dir = @cgi_bin_dir@ datadir = @datadir@ datarootdir = @datarootdir@ default_config_dir = @default_config_dir@ default_www_dir = @default_www_dir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @default_www_dir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ uidir = $(htmldir)/ui dist_html_DATA = index.html dist_ui_DATA = \ default.css common.js lang.xsl common.xsl list.xsl message.xsl \ mindex.xsl search.xsl splash.xsl thread.xsl lang.xml \ ca.xml da.xml de.xml el.xml en.xml es.xml fi.xml fr.xml gl.xml \ hu.xml it.xml ja.xml nl.xml pl.xml pt-BR.xml pt.xml all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ui/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu ui/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-dist_htmlDATA: $(dist_html_DATA) @$(NORMAL_INSTALL) test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" @list='$(dist_html_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(dist_htmlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ $(dist_htmlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-dist_htmlDATA: @$(NORMAL_UNINSTALL) @list='$(dist_html_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(htmldir)/$$f'"; \ rm -f "$(DESTDIR)$(htmldir)/$$f"; \ done install-dist_uiDATA: $(dist_ui_DATA) @$(NORMAL_INSTALL) test -z "$(uidir)" || $(MKDIR_P) "$(DESTDIR)$(uidir)" @list='$(dist_ui_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(dist_uiDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(uidir)/$$f'"; \ $(dist_uiDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(uidir)/$$f"; \ done uninstall-dist_uiDATA: @$(NORMAL_UNINSTALL) @list='$(dist_ui_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(uidir)/$$f'"; \ rm -f "$(DESTDIR)$(uidir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(uidir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-dist_htmlDATA \ install-dist_uiDATA install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_htmlDATA uninstall-dist_uiDATA \ uninstall-local .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-local install-dist_htmlDATA install-dist_uiDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-dist_htmlDATA uninstall-dist_uiDATA \ uninstall-local # Create the directories for dynamic content install-data-local: for i in attach list mbox message mindex search splash thread zap; do \ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$i; \ done touch $(DESTDIR)$(htmldir)/lurker.docroot uninstall-local: rm -f $(DESTDIR)$(htmldir)/lurker.docroot # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lurker-2.3/ui/message.xsl0000644000175000017500000003141611267070017012402 00000000000000
,
 





, " " < > , > mailto: ?Subject= your mail &References= &In-Reply-To= , &CC= &Body= > {$reply-to-message} +    ( )
:






     goodsig unknownsig badsig

| <-    ->   
{$delete-message}
<xsl:value-of select="summary/subject"/> , titledate(this, ); M ../imgs/ .png selected M . | - \ + SELECTED SELECTED :00
Lurker ( )
{$front-page}
lurker-2.3/ui/lang.xml0000644000175000017500000002165411267070470011677 00000000000000 Afar Abkhazian Afrikaans አማርኛ ﺔﻴïºïº®ï»Œï» ïº অসমীয়া Aymar AzÉ™rbaycan Башҡорт БеларуÑÐºÐ°Ñ Ð‘ÑŠÐ»Ð³Ð°Ñ€Ñки Bihari Bislama বাংলা Bodskad Breton Català Corsican ÄŒeÅ¡tina Cymraeg Dansk Deutsch Dzongkha Ελληνικά English Esperanto Español Eesti Euskara ÙØ§Ø±Ø³ÛŒ suomi Fiji Føroyskt Français Frysk Gaeilge Gàidhlig Galego Avañe'ẽ ગà«àªœàª°àª¾àª¤à«€ Ù‡ÙŽÙˆÙØ³ÙŽ à¤¹à¤¿à¤¨à¥à¤¦à¥€ Hrvatski magyar Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶ Interlingua Interlingue Iñupiak Indonesian Ãslenska Italiano עברית 日本語 Yiddish Javanese ქáƒáƒ áƒ—ული қазақша Kalaallísut ភាសាážáŸ’មែរ ಕನà³à²¨à²¡ 한국어 कशà¥à¤®à¥€à¤°à¥€ - (كشميري) Kurmancî (Kurdî) Kirghiz Latina Lingala Laothian Lietuvių LatvieÅ¡u Malagasy MÄori МакедонÑки മലയാളം Монгол Moldovenească मराठी Bahasa Melayu Maltese Myanmasa Nauru नेपाली Nederlands Norsk Occitan Provençal Oromoo Galla Afan Oriya पंजाबी / ਪਜਾਬੀ / پنجابي Polski پښتو Português Português Brasileiro Quechua Rumantsch Kirundi RomâneÅŸte РуÑÑкий Kinwarwanda संसà¥à¤•ृत सिनधि Sangro Srpsko-hrvatska Simhala SlovenÄina SlovenÅ¡Äina Gagana Samoa chiShona af Soomaali Shqip СрпÑки SiSwati seSotho Sudanese Svenska Swahili தமிழ௠తెలà±à°—ౠТоҷикӣ ไทย Tigrinya تركمن / Туркмен Tagalog Setswana Tonga Türkçe Xitsonga Tatar Twi УкраïнÑька اردو Ўзбек Tiếng Việt Volapük Wollof Xhosa Yorùbá 中文 Zulu lurker-2.3/ui/splash.xsl0000644000175000017500000001371711267070017012254 00000000000000