|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 5598 (0x15de) Types: TextFile Names: »pattern.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/elm/src/pattern.c«
/** pattern.c **/ /** General pattern matching for the ELM mailer. (C) Copyright 1986 Dave Taylor **/ #include <errno.h> #include "headers.h" static char pattern[SLEN] = { "" }; static char alt_pattern[SLEN] = { "" }; extern int errno; char *error_name(), *shift_lower(), *strcpy(); meta_match(function) int function; { /** Perform specific function based on whether an entered string matches either the From or Subject lines.. **/ register int i, tagged=0, count=0; static char meta_pattern[SLEN]; PutLine1(LINES-3, strlen("Command: "), "%s messages that match pattern...", function==TAGGED?"Tag": function==DELETED?"Delete":"Undelete"); if (function == TAGGED) { /* are messages already tagged??? */ for (i=0; i < message_count; i++) if (ison(header_table[i].status,TAGGED)) tagged++; if (tagged) { if (tagged > 2) PutLine0(LINES-2,0, "Some messages are already tagged"); else PutLine0(LINES-2,0, "A message is already tagged"); Write_to_screen("- Remove tag%s? y%c", 2, plural(tagged),BACKSPACE); if (tolower(ReadCh()) != 'n') { /* remove tags... */ for (i=0; i < message_count; i++) { clearit(header_table[i].status,TAGGED); show_new_status(i); } } } } PutLine0(LINES-2,0, "Enter pattern: "); CleartoEOLN(); optionally_enter(meta_pattern, LINES-2,strlen("Enter pattern: "),FALSE); if (strlen(meta_pattern) == 0) { ClearLine(LINES-2); return(0); } strcpy(meta_pattern, shift_lower(meta_pattern)); /* lowercase it */ for (i = 0; i < message_count; i++) { if (from_matches(i, meta_pattern)) { if ((selected && header_table[i].status & VISIBLE) || ! selected) { if (function == UNDELETE) clearit(header_table[i].status, DELETED); else setit(header_table[i].status, function); show_new_status(i); count++; } } else if (subject_matches(i, meta_pattern)) { if ((selected && header_table[i].status & VISIBLE) || ! selected) { if (function == UNDELETE) clearit(header_table[i].status, DELETED); else setit(header_table[i].status, function); show_new_status(i); count++; } } } ClearLine(LINES-2); /* remove "pattern: " prompt */ if (count > 0) error3("%s %d messsage%s", function==TAGGED? "tagged" : function==DELETED? "marked for deletion" : "undeleted", count, plural(count)); else error1("no matches - no messages %s", function==TAGGED? "tagged" : function==DELETED? "marked for deletion": "undeleted"); return(0); } int pattern_match() { /** Get a pattern from the user and try to match it with the from/subject lines being displayed. If matched (ignoring case), move current message pointer to that message, if not, error and return ZERO **/ register int i; PutLine0(LINES-3,40,"/ = match anywhere in messages"); PutLine0(LINES-1,0, "Match Pattern:"); if (pattern_enter(pattern, alt_pattern, LINES-1, 16, "Match Pattern (in entire mailbox):")) if (strlen(alt_pattern) > 0) { strcpy(alt_pattern, shift_lower(alt_pattern)); return(match_in_message(alt_pattern)); } else return(1); if (strlen(pattern) == 0) return(0); else strcpy(pattern, shift_lower(pattern)); for (i = current; i < message_count; i++) { if (from_matches(i, pattern)) { if (!selected || (selected && header_table[i].status & VISIBLE)) { current = ++i; return(1); } } else if (subject_matches(i, pattern)) { if (!selected || (selected && header_table[i].status & VISIBLE)) { current = ++i; return(1); } } } return(0); } int from_matches(message_number, pat) int message_number; char *pat; { /** Returns true iff the pattern occurs in it's entirety in the from line of the indicated message **/ return( in_string(shift_lower(header_table[message_number].from), pat) ); } int subject_matches(message_number, pat) int message_number; char *pat; { /** Returns true iff the pattern occurs in it's entirety in the subject line of the indicated message **/ return( in_string(shift_lower(header_table[message_number].subject), pat) ); } match_in_message(pat) char *pat; { /** Match a string INSIDE a message...starting at the current message read each line and try to find the pattern. As soon as we do, set current and leave! Returns 1 if found, 0 if not **/ char buffer[LONG_STRING]; int message_number, lines, line; message_number = current-1; error("searching mailbox for pattern..."); while (message_number < message_count) { if (fseek(mailfile, header_table[message_number].offset, 0L) != 0) { dprint3(1,"Error: seek %ld bytes into file failed. errno %d (%s)\n", header_table[message_number].offset, errno, "match_in_message"); error2("ELM [match] failed looking %ld bytes into file (%s)", header_table[message_number].offset, error_name(errno)); return(1); /* fake it out to avoid replacing error message */ } line = 0; lines = header_table[message_number].lines; while (fgets(buffer, LONG_STRING, mailfile) != NULL && line < lines) { line++; if (in_string(shift_lower(buffer), pat)) { current = message_number+1; clear_error(); return(1); } } /** now we've passed the end of THIS message...increment and continue the search with the next message! **/ message_number++; } return(0); }