📄 list.c
字号:
break; if (argn >= argc - 1) { printf( "Too many elements in the list; excess discarded.\n"); break; } cp2 = linebuf; quotec = '\0'; while ((c = *cp) != '\0') { cp++; if (quotec != '\0') { if (c == quotec) quotec = '\0'; else if (c == '\\') switch (c = *cp++) { case '\0': *cp2++ = '\\'; cp--; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': c -= '0'; if (*cp >= '0' && *cp <= '7') c = c * 8 + *cp++ - '0'; if (*cp >= '0' && *cp <= '7') c = c * 8 + *cp++ - '0'; *cp2++ = c; break; case 'b': *cp2++ = '\b'; break; case 'f': *cp2++ = '\f'; break; case 'n': *cp2++ = '\n'; break; case 'r': *cp2++ = '\r'; break; case 't': *cp2++ = '\t'; break; case 'v': *cp2++ = '\v'; break; default: *cp2++ = c; } else if (c == '^') { c = *cp++; if (c == '?') *cp2++ = '\177'; /* null doesn't show up anyway */ else if (c >= 'A' && c <= '_' || c >= 'a' && c <= 'z') *cp2++ = c & 037; else { *cp2++ = '^'; cp--; } } else *cp2++ = c; } else if (c == '"' || c == '\'') quotec = c; else if (c == ' ' || c == '\t') break; else *cp2++ = c; } *cp2 = '\0'; argv[argn++] = savestr(linebuf); } argv[argn] = NOSTR; return argn;}/* * scan out a single lexical item and return its token number, * updating the string pointer passed **p. Also, store the value * of the number or string scanned in lexnumber or lexstring as * appropriate. In any event, store the scanned `thing' in lexstring. */struct lex { char l_char; char l_token;} singles[] = { '$', TDOLLAR, '.', TDOT, '^', TUP, '*', TSTAR, '-', TDASH, '+', TPLUS, '(', TOPEN, ')', TCLOSE, 0, 0};intscan(sp) char **sp;{ register char *cp, *cp2; register int c; register struct lex *lp; int quotec; if (regretp >= 0) { strcpy(lexstring, string_stack[regretp]); lexnumber = numberstack[regretp]; return(regretstack[regretp--]); } cp = *sp; cp2 = lexstring; c = *cp++; /* * strip away leading white space. */ while (c == ' ' || c == '\t') c = *cp++; /* * If no characters remain, we are at end of line, * so report that. */ if (c == '\0') { *sp = --cp; return(TEOL); } /* * If the leading character is a digit, scan * the number and convert it on the fly. * Return TNUMBER when done. */ if (isdigit(c)) { lexnumber = 0; while (isdigit(c)) { lexnumber = lexnumber*10 + c - '0'; *cp2++ = c; c = *cp++; } *cp2 = '\0'; *sp = --cp; return(TNUMBER); } /* * Check for single character tokens; return such * if found. */ for (lp = &singles[0]; lp->l_char != 0; lp++) if (c == lp->l_char) { lexstring[0] = c; lexstring[1] = '\0'; *sp = cp; return(lp->l_token); } /* * We've got a string! Copy all the characters * of the string into lexstring, until we see * a null, space, or tab. * If the lead character is a " or ', save it * and scan until you get another. */ quotec = 0; if (c == '\'' || c == '"') { quotec = c; c = *cp++; } while (c != '\0') { if (c == quotec) { cp++; break; } if (quotec == 0 && (c == ' ' || c == '\t')) break; if (cp2 - lexstring < STRINGLEN-1) *cp2++ = c; c = *cp++; } if (quotec && c == 0) { fprintf(stderr, "Missing %c\n", quotec); return TERROR; } *sp = --cp; *cp2 = '\0'; return(TSTRING);}/* * Unscan the named token by pushing it onto the regret stack. */voidregret(token) int token;{ if (++regretp >= REGDEP) panic("Too many regrets"); regretstack[regretp] = token; lexstring[STRINGLEN-1] = '\0'; string_stack[regretp] = savestr(lexstring); numberstack[regretp] = lexnumber;}/* * Reset all the scanner global variables. */voidscaninit(){ regretp = -1;}/* * Find the first message whose flags & m == f and return * its message number. */intfirst(f, m) int f, m;{ register struct message *mp; if (msgCount == 0) return 0; f &= MDELETED; m &= MDELETED; for (mp = dot; mp < &message[msgCount]; mp++) if ((mp->m_flag & m) == f) return mp - message + 1; for (mp = dot-1; mp >= &message[0]; mp--) if ((mp->m_flag & m) == f) return mp - message + 1; return 0;}/* * See if the passed name sent the passed message number. Return true * if so. */intmatchsender(str, mesg) char *str; int mesg;{ register char *cp, *cp2, *backup; if (!*str) /* null string matches nothing instead of everything */ return 0; backup = cp2 = nameof(&message[mesg - 1], 0); cp = str; while (*cp2) { if (*cp == 0) return(1); if (raise(*cp++) != raise(*cp2++)) { cp2 = ++backup; cp = str; } } return(*cp == 0);}/* * See if the given string matches inside the subject field of the * given message. For the purpose of the scan, we ignore case differences. * If it does, return true. The string search argument is assumed to * have the form "/search-string." If it is of the form "/," we use the * previous search string. */char lastscan[128];intmatchsubj(str, mesg) char *str; int mesg;{ register struct message *mp; register char *cp, *cp2, *backup; str++; if (strlen(str) == 0) str = lastscan; else strcpy(lastscan, str); mp = &message[mesg-1]; /* * Now look, ignoring case, for the word in the string. */ if (value("searchheaders") && (cp = index(str, ':'))) { *cp++ = '\0'; cp2 = hfield(str, mp); cp[-1] = ':'; str = cp; } else { cp = str; cp2 = hfield("subject", mp); } if (cp2 == NOSTR) return(0); backup = cp2; while (*cp2) { if (*cp == 0) return(1); if (raise(*cp++) != raise(*cp2++)) { cp2 = ++backup; cp = str; } } return(*cp == 0);}/* * Mark the named message by setting its mark bit. */voidmark(mesg) int mesg;{ register int i; i = mesg; if (i < 1 || i > msgCount) panic("Bad message number to mark"); message[i-1].m_flag |= MMARK;}/* * Unmark the named message. */voidunmark(mesg) int mesg;{ register int i; i = mesg; if (i < 1 || i > msgCount) panic("Bad message number to unmark"); message[i-1].m_flag &= ~MMARK;}/* * Return the message number corresponding to the passed meta character. */intmetamess(meta, f) int meta, f;{ register int c, m; register struct message *mp; c = meta; switch (c) { case '^': /* * First 'good' message left. */ for (mp = &message[0]; mp < &message[msgCount]; mp++) if ((mp->m_flag & MDELETED) == f) return(mp - &message[0] + 1); printf("No applicable messages\n"); return(-1); case '$': /* * Last 'good message left. */ for (mp = &message[msgCount-1]; mp >= &message[0]; mp--) if ((mp->m_flag & MDELETED) == f) return(mp - &message[0] + 1); printf("No applicable messages\n"); return(-1); case '.': /* * Current message. */ m = dot - &message[0] + 1; if ((dot->m_flag & MDELETED) != f) { printf("%d: Inappropriate message\n", m); return(-1); } return(m); default: printf("Unknown metachar (%c)\n", c); return(-1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -