精華區beta SetupBBS 關於我們 聯絡資訊
/*-------------------------------------------------------*/ /* stuff.c ( NTHU CS MapleBBS Ver 2.36 ) */ /*-------------------------------------------------------*/ /* target : utility routines */ /* create : 95/03/29 */ /* update : 95/12/15 */ /*-------------------------------------------------------*/ #include <sys/param.h> #include "bbs.h" /* ----------------------------------------------------- */ /* set file path for boards/user home */ /* ----------------------------------------------------- */ char *str_home_file = "home/%s/%s"; char *str_board_file = "boards/%s/%s"; char *str_dotdir = ".DIR"; void sethomepath(buf, userid) char *buf, *userid; { sprintf(buf, "home/%s", userid); } void sethomedir(buf, userid) char *buf, *userid; { sprintf(buf, str_home_file, userid, str_dotdir); } void sethomeman(buf, userid) char *buf, *userid; { sprintf(buf, str_home_file, userid, "man"); } void sethomefile(buf, userid, fname) char *buf, *userid, *fname; { sprintf(buf, str_home_file, userid, fname); } void setuserfile(buf, fname) char *buf, *fname; { sprintf(buf, str_home_file, cuser.userid, fname); } void setapath(buf, boardname) char *buf, *boardname; { sprintf(buf, "man/boards/%s", boardname); } /* ===== Added by mgtsai, Sep 10th, '96 ===== */ void setadir(buf, path) char *buf, *path; { sprintf(buf, "%s/%s", path, str_dotdir); } /* ===== end ===== */ void setbpath(buf, boardname) char *buf, *boardname; { sprintf(buf, "boards/%s", boardname); } void setbdir(buf, boardname) char *buf, *boardname; { sprintf(buf, str_board_file, boardname, currmode & MODE_ETC ? ".ETC" : currmode & MODE_DIGEST ? fn_mandex : str_dotdir); } void setbfile(buf, boardname, fname) char *buf, *boardname, *fname; { sprintf(buf, str_board_file, boardname, fname); } void setdirpath(buf, direct, fname) char *buf, *direct, *fname; { strcpy(buf, direct); direct = strrchr(buf, '/'); strcpy(direct + 1, fname); } char * subject(title) char *title; { if (!strncasecmp(title, str_reply, 3)) { title += 3; if (*title == ' ') title++; } return title; } /* ----------------------------------------------------- */ /* 字串轉換檢查函數 */ /* ----------------------------------------------------- */ /* Case Independent strncmp */ int ci_strncmp(s1, s2, n) register char *s1, *s2; register int n; { register char c1, c2; register int diff; do { c1 = *s1++; if (c1 >= 'A' && c1 <= 'Z') c1 |= 32; c2 = *s2++; if (c2 >= 'A' && c2 <= 'Z') c2 |= 32; if (diff = c1 - c2) return (diff); } while (--n && c1); return 0; } void str_lower(t, s) char *t, *s; { register uschar ch; do { ch = *s++; *t++ = char_lower(ch); } while (ch); } int strstr_lower(str, tag) char *str, *tag; /* tag : lower-case string */ { char buf[STRLEN]; str_lower(buf, str); return (int) strstr(buf, tag); } void trim(buf) /* remove trailing space */ char *buf; { char *p = buf; while (*p) p++; while (--p >= buf) { if (*p == ' ') *p = '\0'; else break; } } /* ----------------------------------------------------- */ /* 字串檢查函數:英文、數字、檔名、E-mail address */ /* ----------------------------------------------------- */ #ifdef BIT8 int isprint2(ch) char ch; { return ((ch & 0x80) ? 1 : isprint(ch)); } #endif int not_alpha(ch) register char ch; { return (ch < 'A' || (ch > 'Z' && ch < 'a') || ch > 'z'); } int not_alnum(ch) register char ch; { return (ch < '0' || (ch > '9' && ch < 'A') || (ch > 'Z' && ch < 'a') || ch > 'z'); } int invalid_fname(str) char *str; { char ch; if (strspn(str, ".") == strlen(str)) return 1; while (ch = *str++) { if (not_alnum(ch) && !strchr("@[]-._", ch)) return 1; } return 0; } int invalid_pname(str) char *str; { char *p1, *p2, *p3; p1 = str; while (*p1) { if (!(p2 = strchr(p1, '/'))) p2 = str + strlen(str); if (p1 + 1 > p2 || p1 + strspn(p1, ".") == p2) return 1; for (p3 = p1; p3 < p2; p3++) if (not_alnum(*p3) && !strchr("@[]-._", *p3)) return 1; p1 = p2 + (*p2 ? 1 : 0); } return 0; } int valid_ident(ident) char *ident; { static char *invalid[] = {"unknown@", "root@", "gopher@", "bbs@", "@bbs", "guest@", "@ppp", "@slip", NULL}; char buf[128]; int i; str_lower(buf, ident); for (i = 0; invalid[i]; i++) if (strstr(buf, invalid[i])) return 0; return 1; } int is_BM(list) char *list; /* 板主:BM list */ { register int ch, len; ch = list[0]; if ((ch > ' ') && (ch < 128)) { len = strlen(cuser.userid); do { if (!ci_strncmp(list, cuser.userid, len)) { ch = list[len]; if ((ch == 0) || (ch == '/') || (ch == ']')) return 1; } while (ch = *list++) { if (ch == '/') break; } } while (ch); } return 0; } /* woju */ int userid_is_BM(userid, list) char *userid, *list; /* 板主:BM list */ { register int ch, len; ch = list[0]; if ((ch > ' ') && (ch < 128)) { len = strlen(userid); do { if (!ci_strncmp(list, userid, len)) { ch = list[len]; if ((ch == 0) || (ch == '/') || (ch == ']')) return 1; } while (ch = *list++) { if (ch == '/') break; } } while (ch); } return 0; } int is_watched(name) char *name; { char buf[40]; FILE *list; if (list = fopen("watching", "r")) { while (fgets(buf, 40, list)) { buf[strlen(buf) - 1] = '\0'; if (!strcmp(buf, name)) return 1; } fclose(list); } /* woju else pressanykey(); */ return 0; } /* ----------------------------------------------------- */ /* 檔案檢查函數:檔案、目錄、屬於 */ /* ----------------------------------------------------- */ off_t dashs(fname) char *fname; { struct stat st; if (!stat(fname, &st)) return (st.st_size); else return -1; } long dasht(fname) char *fname; { struct stat st; if (!stat(fname, &st)) return (st.st_mtime); else return -1; } int dashl(fname) char *fname; { struct stat st; return (lstat(fname, &st) == 0 && S_ISLNK(st.st_mode)); } dashf(fname) char *fname; { struct stat st; return (stat(fname, &st) == 0 && S_ISREG(st.st_mode)); } int dashd(fname) char *fname; { struct stat st; return (stat(fname, &st) == 0 && S_ISDIR(st.st_mode)); } int belong(filelist, key) char *filelist; char *key; { FILE *fp; int rc = 0; if (fp = fopen(filelist, "r")) { char buf[STRLEN], *ptr; while (fgets(buf, STRLEN, fp)) { if ((ptr = strtok(buf, str_space)) && !strcasecmp(ptr, key)) { rc = 1; break; } } fclose(fp); } return rc; } char * Cdate(clock) time_t *clock; { static char foo[22]; struct tm *mytm = localtime(clock); strftime(foo, 22, "%D %T %a", mytm); return (foo); } char * Cdatelite(clock) time_t *clock; { static char foo[18]; struct tm *mytm = localtime(clock); strftime(foo, 18, "%D %T", mytm); return (foo); } #ifdef HAVE_CTIME char * Ctime(clock) time_t *clock; { char *foo; char *ptr = ctime(clock); if (foo = strrchr(ptr, '\n')) *foo = '\0'; return (ptr); } #endif void pressanykey() { int ch; outmsg(" ● 請按 (Space/Return) 繼續 ● "); do { ch = igetkey(); if (ch == KEY_ESC && KEY_ESC_arg == 'c') capture_screen(); } while ((ch != ' ') && (ch != KEY_LEFT) && (ch != '\r') && (ch != '\n')); move(b_lines, 0); clrtoeol(); refresh(); } void bell() { char sound[3], *ptr; ptr = sound; memset(ptr, Ctrl('G'), sizeof(sound)); write(1, ptr, sizeof(sound)); } int search_num(ch, max) { int clen = 1; int x, y; extern unsigned char scr_cols; char genbuf[10]; outmsg(" 跳至第幾項:"); outc(ch); genbuf[0] = ch; getyx(&y, &x); x--; while ((ch = igetch()) != '\r') { if (ch == 'q' || ch == 'e') return -1; if (ch == '\n') break; if (ch == '\177' || ch == Ctrl('H')) { if (clen == 0) { bell(); continue; } clen--; move(y, x + clen); outc(' '); move(y, x + clen); continue; } if (!isdigit(ch)) { bell(); continue; } if (x + clen >= scr_cols || clen >= 6) { bell(); continue; } genbuf[clen++] = ch; outc(ch); } genbuf[clen] = '\0'; move(b_lines, 0); clrtoeol(); if (genbuf[0] == '\0') return -1; clen = atoi(genbuf); if (clen == 0) return 0; if (clen > max) return max; return clen - 1; } void stand_title(title) char *title; { clear(); prints("【 %s 】\n", title); } /* opus : cursor position */ void cursor_show(row, column) int row, column; { move(row, column); outs(STR_CURSOR); move(row, column + 1); } void cursor_clear(row, column) int row, column; { move(row, column); outs(STR_UNCUR); } int cursor_key(row, column) int row, column; { int ch; cursor_show(row, column); ch = egetch(); move(row, column); outs(STR_UNCUR); return ch; } void printdash(mesg) char *mesg; { int head = 0, tail; if (mesg) head = (strlen(mesg) + 1) >> 1; tail = head; while (head++ < 38) outch('-'); if (tail) { outch(' '); outs(mesg); outch(' '); } while (tail++ < 38) outch('-'); outch('\n'); } void show_help(helptext) char *helptext[]; { char *str; int i; clear(); for (i = 0; (str = helptext[i]); i++) { if (*str == '\0') prints("【 %s 】\n", str + 1); else if (*str == '\01') prints("\n【 %s 】\n", str + 1); else prints(" %s\n", str); } pressanykey(); }