📄 personal_corp.c
字号:
free(pc_s); return 0;}/**************************************************** * * * * * 个人文集分区选择的select * * * * *****************************************************//******* * 检查权限的函数 * 返回 1: 普通用户 * 2: 好友 * 5: 所有权限 */char pc_select_user[IDLEN + 2];static int pc_is_owner(char *userid){ if (!strcasecmp(userid, getCurrentUser()->userid) && pc_u->createtime >= getCurrentUser()->firstlogin) return 1; return 0;}static int pc_is_admin(char *userid){ if (HAS_PERM(getCurrentUser(), PERM_ADMIN) || pc_is_owner(userid)) return 1; return 0;}static int pc_is_friend(char *userid){ char fpath[STRLEN]; sethomefile(fpath, userid, "pc_friend"); if (seek_in_file(fpath, getCurrentUser()->userid)) return 1; return 0;}static int pc_perm(char *userid){ if (pc_is_owner(userid)) return 5; if (pc_is_admin(userid)) return 2; if (pc_is_friend(userid)) return 2; return 1;}static int pc_seldir_show(struct _select_def *conf, int i){ switch (i) { case 1: prints(" 公开区"); break; case 2: prints(" 好友区"); break; case 3: prints(" 私人区"); break; case 4: prints(" 收藏区"); break; case 5: prints(" 删除区"); break; default: prints(" NULL "); break; } return SHOW_CONTINUE;}static int pc_seldir_title(struct _select_def *conf){ clear(); move(2, 0); prints(" \033[1;31m%s的个人文集 -- %s\033[m", pc_u->username, pc_u->description); return SHOW_CONTINUE;}static int pc_seldir_select(struct _select_def *conf){ pc_dirmode = conf->pos; pc_read_dir(1); if (pc_select_user[0]) return SHOW_QUIT; return SHOW_REFRESH;}int pc_read(char *userid){ struct userec *lookupuser; struct _select_def group_conf; POINT *pts = NULL; int i; pc_u = (struct pc_users *) malloc(sizeof(struct pc_users)); if (pc_u == NULL) return 0; strncpy(pc_select_user, userid, IDLEN + 2); pc_select_user[IDLEN] = 0; startuser: clear(); if (getuser(pc_select_user, &lookupuser) == 0) { clear(); move(7, 0); prints("此用户不存在"); pressanykey(); free(pc_u); free(pts); return 0; } pc_select_user[0] = 0; bzero(pc_u, sizeof(struct pc_users)); if (!get_pc_users(pc_u, lookupuser->userid)) { clear(); move(7, 0); prints("没有此用户个人文集存在"); free(pc_u); free(pts); pc_u = NULL; pressanykey(); return 0; } pc_fav_dir = 0; pc_dirmode = 1; bzero(&group_conf, sizeof(struct _select_def)); if (pts == NULL) { pts = (POINT *) malloc(sizeof(POINT) * BBS_PAGESIZE); for (i = 0; i < BBS_PAGESIZE; i++) { pts[i].x = 30; pts[i].y = i + 10; } } group_conf.item_per_page = BBS_PAGESIZE; group_conf.flag = LF_VSCROLL | LF_BELL | LF_LOOP; group_conf.prompt = "◆"; group_conf.item_pos = pts; group_conf.title_pos.x = 0; group_conf.title_pos.y = 0; group_conf.pos = 1; group_conf.page_pos = 1; group_conf.item_count = pc_perm(lookupuser->userid); group_conf.show_data = pc_seldir_show; group_conf.show_title = pc_seldir_title; group_conf.pre_key_command = pc_seldir_prekey; group_conf.on_select = pc_seldir_select; list_select_loop(&group_conf); if (pc_select_user[0]) goto startuser; free(pts); free(pc_u); pc_u = NULL; return 0;}/************************************************** * * * 以下是文章列表select * * * ***************************************************/struct pc_nodes *pc_n = NULL;//int pc_dir_start = 0;/* 用于评论select,表示当前是哪个node,对应 pc_n[i] */int pc_now_node_ent = 0;/* 复制粘贴的东西,保存临时node nid */unsigned long pc_pasteboard = 0;int pc_get_fav_root(unsigned long *nid){ struct pc_nodes pn; int ret; ret = get_pc_nodes(&pn, pc_u->uid, 0, 1, 3, 0, 1, 0); if (ret <= 0) return ret; *nid = pn.nid; return 1;}int pc_add_fav_root(){ struct pc_nodes pn; bzero(&pn, sizeof(pn)); pn.pid = 0; pn.type = 1; strncpy(pn.hostname, uinfo.from, 20); pn.hostname[20] = 0; pn.created = time(0); pn.changed = pn.created; pn.uid = pc_u->uid; pn.access = 3; return add_pc_nodes(&pn);}int pc_conv_body_to_file(char *body, char *fname){ int fd; unsigned long size; unsigned long hadwrite = 0; int nd; int ret; if (!body) return 0; size = strlen(body); if ((fd = open(fname, O_WRONLY | O_CREAT, 0600)) < 0) return 0; do { if (size > 10240) nd = 10240; else nd = size; ret = write(fd, body + hadwrite, nd); if (ret <= 0) { close(fd); return 0; } size -= ret; hadwrite += ret; } while (size > 0); close(fd); return 1;}int pc_conv_com_to_file(unsigned long nid, char *fname){ int fd; struct pc_comments pn; unsigned long size; unsigned long hadwrite = 0; int nd; int ret; char buf[256]; struct userec *lookupuser; ret = get_pc_a_com(&pn, nid); if (ret <= 0) { return 0; } if (getuser(pn.username, &lookupuser) == 0) { if (pn.body) free(pn.body); return 0; } if ((fd = open(fname, O_WRONLY | O_CREAT, 0600)) < 0) { if (pn.body) free(pn.body); return 0; } snprintf(buf, 255, "发信人: %s (%s), 个人文集\n", lookupuser->userid, lookupuser->username); write(fd, buf, strlen(buf)); snprintf(buf, 255, "标 题: %s\n", pn.subject); write(fd, buf, strlen(buf)); snprintf(buf, 255, "发信站: %s (%24.24s), 评论\n\n", BBS_FULL_NAME, ctime(&pn.created)); write(fd, buf, strlen(buf)); if (pn.body) { size = strlen(pn.body); do { if (size > 10240) nd = 10240; else nd = size; ret = write(fd, pn.body + hadwrite, nd); if (ret <= 0) { close(fd); free(pn.body); return 0; } size -= ret; hadwrite += ret; } while (size > 0); free(pn.body); } close(fd); return 1;}static const char TAG_NEWLN[11][8] = { "br", "/p", "/tr", "/div", "/h1", "/h2", "/h3", "/h4", "/h5", "/h6", "/li"};static const char TAG_SPACE[3][8] = { "/td", "/th", "/span"};static const char TAG_SPECL[5][2][8] = { {"nbsp", " "}, {"amp", "&"}, {"quot", "\""}, {"gt", ">"}, {"lt", "<"}};static const char TAG_LINK[6][2][8] = { {"a", "href="}, {"img", "src="}, {"applet", "src="}, {"embed", "src="}, {"bgsound", "src="}, {"iframe", "src="}};#define PUTC(chr) buf[hadwrite]=chr; hadwrite++; if (hadwrite==256) { ret = write(fd, buf, 256); hadwrite=0; }#define PUTS(str) temp=str; while(*temp) { PUTC(*temp); temp++; }#define GET_TAG(condi) tagp=0; tag[0]=0; while ((condi)&&(*ptr)&&(tagp<255)) { tag[tagp] = *ptr; tagp++; ptr++; } tag[tagp]=0;int pc_conv_node_to_file(unsigned long nid, char *fname){ char *ptr, *temp; char tag[256]; int tagp; int fd; struct pc_nodes pn; unsigned long size; unsigned long hadwrite = 0; int nd; int ret; char buf[256]; struct userec *lookupuser; if (getuser(pc_u->username, &lookupuser) == 0) return 0; if ((fd = open(fname, O_WRONLY | O_CREAT, 0600)) < 0) return 0; ret = get_pc_a_node(&pn, nid); if (ret <= 0) { close(fd); return 0; } snprintf(buf, 255, "发信人: %s (%s), 个人文集\n", lookupuser->userid, lookupuser->username); write(fd, buf, strlen(buf)); snprintf(buf, 255, "标 题: %s\n", pn.subject); write(fd, buf, strlen(buf)); snprintf(buf, 255, "发信站: %s (%24.24s), 文集\n\n", BBS_FULL_NAME, ctime(&pn.created)); write(fd, buf, strlen(buf)); if (pn.body) { if (pn.htmltag) {//need to parse html ptr = pn.body; PUTS("(本文包含HTML标记,终端模式下可能无法正确浏览)\n"); do { switch (*ptr) { case '<': ptr++; GET_TAG((*ptr != '>') && (*ptr != ' ')); for (nd = 0; nd < 11; nd++) if (!strcasecmp(tag, TAG_NEWLN[nd])) { PUTS("\n"); break; } for (nd = 0; nd < 3; nd++) if (!strcasecmp(tag, TAG_SPACE[nd])) { PUTC(' '); break; } for (nd = 0; nd < 6; nd++) { if (!strcasecmp(tag, TAG_LINK[nd][0]) && (*ptr == ' ')) { do { while (*ptr == ' ') ptr++; GET_TAG((*ptr != '\"') && (*ptr != '/') && (*ptr != '>')); if (*ptr != '\"') { if (*ptr) ptr++; continue; } ptr++; if (!strcasecmp(tag, TAG_LINK[nd][1])) { GET_TAG(*ptr != '\"'); PUTS(" [ "); PUTS(tag); PUTS(" ] "); if (*ptr) ptr++; } else { GET_TAG(*ptr != '\"'); if (*ptr) ptr++; } } while (*ptr == ' '); break; } } while ((*ptr) && (*ptr != '>')) ptr++; if (*ptr == '>') ptr++; break; case '&': ptr++; GET_TAG((*ptr >= 'a') && (*ptr <= 'z')); for (tagp = 0; tagp < 5; tagp++) if (!strcasecmp(tag, TAG_SPECL[tagp][0])) { PUTC(TAG_SPECL[tagp][1][0]); break; } ptr++; break; default: PUTC(*ptr); ptr++; } if (ret <= 0) { close(fd); free(pn.body); return 0; } } while (*ptr); if (hadwrite) ret = write(fd, buf, hadwrite); } else {//normal article size = strlen(pn.body); do { if (size > 10240) nd = 10240; else nd = size; ret = write(fd, pn.body + hadwrite, nd); if (ret <= 0) { close(fd); free(pn.body); return 0; } size -= ret; hadwrite += ret; } while (size > 0); } free(pn.body); } close(fd); return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -