diff options
Diffstat (limited to 'mbbsd/aids.c')
-rw-r--r-- | mbbsd/aids.c | 290 |
1 files changed, 0 insertions, 290 deletions
diff --git a/mbbsd/aids.c b/mbbsd/aids.c deleted file mode 100644 index 56d19378..00000000 --- a/mbbsd/aids.c +++ /dev/null @@ -1,290 +0,0 @@ -/* $Id$ */ -#include "bbs.h" - -#error "Not complete yet" - -aidu_t fn2aidu(char *fn) -{ - aidu_t aidu = 0; - aidu_t type = 0; - aidu_t v1 = 0; - aidu_t v2 = 0; - char *sp = fn; - - if(fn == NULL) - return 0; - - switch(*(sp ++)) - { - case 'M': - type = 0; - break; - case 'G': - type = 1; - break; - default: - return 0; - break; - } - - if(*(sp ++) != '.') - return 0; - v1 = strtoul(sp, &sp, 10); - if(sp == NULL) - return 0; - if(*sp != '.' || *(sp + 1) != 'A') - return 0; - sp += 2; - if(*(sp ++) == '.') - { - v2 = strtoul(sp, &sp, 16); - if(sp == NULL) - return 0; - } - aidu = ((type & 0xf) << 44) | ((v1 & 0xffffffff) << 12) | (v2 & 0xfff); - - return aidu; -} - -/* IMPORTANT: - * size of buf must be at least 8+1 bytes - */ -char *aidu2aidc(char *buf, aidu_t aidu) -{ - const char aidu2aidc_table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_"; - const int aidu2aidc_tablesize = sizeof(aidu2aidc_table) - 1; - char *sp = buf + 8; - aidu_t v; - - *(sp --) = '\0'; - while(sp >= buf) - { - /* FIXME: 能保證 aidu2aidc_tablesize 是 2 的冪次的話, - 這裡可以改用 bitwise operation 做 */ - v = aidu % aidu2aidc_tablesize; - aidu = aidu / aidu2aidc_tablesize; - *(sp --) = aidu2aidc_table[v]; - } - return buf; -} - -/* IMPORTANT: - * size of fn must be at least FNLEN bytes - */ -char *aidu2fn(char *fn, aidu_t aidu) -{ - aidu_t type = ((aidu >> 44) & 0xf); - aidu_t v1 = ((aidu >> 12) & 0xffffffff); - aidu_t v2 = (aidu & 0xfff); - - if(fn == NULL) - return NULL; - snprintf(fn, FNLEN, "%c.%d.A.%03X", ((type == 0) ? 'M' : 'G'), (unsigned int)v1, (unsigned int)v2); - return fn; -} - -aidu_t aidc2aidu(char *aidc) -{ - char *sp = aidc; - aidu_t aidu = 0; - - if(aidc == NULL) - return 0; - - while(*sp != '\0' && /* ignore trailing spaces */ *sp != ' ') - { - aidu_t v = 0; - /* FIXME: 查表法會不會比較快? */ - if(*sp >= '0' && *sp <= '9') - v = *sp - '0'; - else if(*sp >= 'A' && *sp <= 'Z') - v = *sp - 'A' + 10; - else if(*sp >= 'a' && *sp <= 'z') - v = *sp - 'a' + 36; - else if(*sp == '-') - v = 62; - else if(*sp == '_') - v = 63; - else if(*sp == '@') - break; - else - return 0; - aidu <<= 6; - aidu |= (v & 0x3f); - sp ++; - } - - return aidu; -} - -int search_aidu_in_bfile(char *bfile, aidu_t aidu) -{ - char fn[FNLEN]; - int fd; - fileheader_t fhs[64]; - int len, i; - int pos = 0; - int found = 0; - int lastpos = 0; - - if(aidu2fn(fn, aidu) == NULL) - return -1; - if((fd = open(bfile, O_RDONLY, 0)) < 0) - return -1; - - while(!found && (len = read(fd, fhs, sizeof(fhs))) > 0) - { - len /= sizeof(fileheader_t); - for(i = 0; i < len; i ++) - { - int l; - if(strcmp(fhs[i].filename, fn) == 0 || - ((aidu & 0xfff) == 0 && (l = strlen(fhs[i].filename)) > 6 && - strncmp(fhs[i].filename, fn, l) == 0)) - { - if(fhs[i].filemode & FILE_BOTTOM) - { - lastpos = pos; - } - else - { - found = 1; - break; - } - } - pos ++; - } - } - close(fd); - - return (found ? pos : (lastpos ? lastpos : -1)); -} - -SearchAIDResult_t search_aidu_in_board(char *bname, aidu_t aidu) -{ - SearchAIDResult_t r = {AIDR_BOARD, -1}: - int n = -1; - char dirfile[PATHLEN]; - - { - char bf[FNLEN]; - - snprintf(bf, FNLEN, "%s.bottom", FN_DIR); - setbfile(dirfile, bname, bf); - if((n = search_aidu_in_bfile(dirfile, aidu)) >= 0) - { - r.where = AIDR_BOTTOM; - r.n = n; - } - } - if(r.n < 0) - { - setbfile(dirfile, bname, FN_DIR); - if((n = search_aidu_in_bfile(dirfile, aidu)) >= 0) - { - r.where = AIDR_BOARD; - r.n = n; - } - } - if(r.n < 0) - { - setbfile(dirfile, bname, fn_mandex); - if((n = search_aidu_in_bfile(dirfile, aidu)) >= 0) - { - r.where = AIDR_DIGEST; - r.n = n; - } - } - return r; -} - -SearchAIDResult_t do_search_aid(void) -{ - SearchAIDResult_t r = {AIDR_BOARD, -1}; - char aidc[100]; - char bname[IDLEN + 1] = ""; - aidu_t aidu = 0; - char *sp; - char *sp2; - char *emsg = NULL; - - if(!getdata(b_lines, 0, "搜尋" AID_DISPLAYNAME ": #", aidc, 15 + IDLEN, LCECHO)) - { - move(b_lines, 0); - clrtorol(); - r.n = -1; - return r; - } - - if(currstat == RMAIL) - { - move(21, 0); - clrtobot(); - move(22, 0); - prints("此狀態下無法搜尋" AID_DISPLAYNAME); - pressanykey(); - r.n = -1; - return r; - } - - sp = aidc; - while(*sp == ' ') - sp ++; - while(*sp == '#') - sp ++; - aidu = aidc2aidu(sp); - if((sp2 = strchr(sp, '@')) != NULL) - { - // assert(sizeof(bname) > IDLEN); - strlcpy(bname, sp2 + 1, IDLEN+1); - *sp2 = '\0'; - } - else - bname[0] = '\0'; - - if(aidu > 0) - { - if(bname[0] != '\0') - { - if(!HasBoardPerm_bn(bname)) - return FULLUPDATE; - r = search_aidu_in_board(bname, aidu); - if(r.n >= 0) - { - if(enter_board(bname) < 0) - { - r.n = -1; - emsg = "錯誤:無法進入指定的看板 %s"; - } - } - } - else - { - r = search_aidu_in_board(currboard, aidu); - } - } - - if(r.n < 0) - { - if(aidu == 0) - emsg = "不合法的" AID_DISPLAYNAME ",請確定輸入是正確的"; - else if(emsg == NULL) - { - if(bname[0] != '\0') - emsg = "看板 %s 內找不到這個" AID_DISPLAYNAME ",可能是文章已經消失,或是找錯看板了"; - else - emsg = "找不到這個" AID_DISPLAYNAME ",可能是文章已經消失,或是找錯看板了"; - } - move(21, 0); - clrtoeol(); - move(22, 0); - prints(emsg, bname); - pressanykey(); - r.n = -1; - return r; - } - else - { - return r; - } -} |