diff options
author | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2005-03-12 11:23:27 +0800 |
---|---|---|
committer | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2005-03-12 11:23:27 +0800 |
commit | 7a21e08eca7c72e08fb2a5294b192ebf59a0565a (patch) | |
tree | 8e95a68d5495b14e2695916bc8e2e2afc07632f4 /mbbsd/mail.c | |
parent | a06ea9d2a57526434090ac255aa46cddd1c3ed52 (diff) | |
download | pttbbs-7a21e08eca7c72e08fb2a5294b192ebf59a0565a.tar pttbbs-7a21e08eca7c72e08fb2a5294b192ebf59a0565a.tar.gz pttbbs-7a21e08eca7c72e08fb2a5294b192ebf59a0565a.tar.bz2 pttbbs-7a21e08eca7c72e08fb2a5294b192ebf59a0565a.tar.lz pttbbs-7a21e08eca7c72e08fb2a5294b192ebf59a0565a.tar.xz pttbbs-7a21e08eca7c72e08fb2a5294b192ebf59a0565a.tar.zst pttbbs-7a21e08eca7c72e08fb2a5294b192ebf59a0565a.zip |
move global variable to local, save another 536 bytes
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2591 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/mail.c')
-rw-r--r-- | mbbsd/mail.c | 64 |
1 files changed, 38 insertions, 26 deletions
diff --git a/mbbsd/mail.c b/mbbsd/mail.c index 7d953388..1a195b75 100644 --- a/mbbsd/mail.c +++ b/mbbsd/mail.c @@ -667,24 +667,23 @@ m_forward(int ent, fileheader_t * fhdr, char *direct) return FULLUPDATE; } -static int delmsgs[128]; -static int delcnt; -static int mrd; +struct ReadNewMailArg { + int idc; + int *delmsgs; + int delcnt; + int mrd; +}; static int -read_new_mail(fileheader_t * fptr) +read_new_mail(void * voidfptr, void *optarg) { - static int idc; + fileheader_t *fptr=(fileheader_t*)voidfptr; + struct ReadNewMailArg *arg=(struct ReadNewMailArg*)optarg; char done = NA, delete_it; char fname[256]; char genbuf[4]; - if (fptr == NULL) { - delcnt = 0; - idc = 0; - return 0; - } - idc++; + arg->idc++; if (fptr->filemode) return 0; clear(); @@ -698,17 +697,17 @@ read_new_mail(fileheader_t * fptr) setuserfile(fname, fptr->filename); fptr->filemode |= FILE_READ; - if (substitute_record(currmaildir, fptr, sizeof(*fptr), idc)) + if (substitute_record(currmaildir, fptr, sizeof(*fptr), arg->idc)) return -1; - mrd = 1; + arg->mrd = 1; delete_it = NA; while (!done) { int more_result = more(fname, YEA); switch (more_result) { case 999: - mail_reply(idc, fptr, currmaildir); + mail_reply(arg->idc, fptr, currmaildir); return FULLUPDATE; case -1: return READ_SKIP; @@ -723,13 +722,13 @@ read_new_mail(fileheader_t * fptr) switch (igetch()) { case 'r': case 'R': - mail_reply(idc, fptr, currmaildir); + mail_reply(arg->idc, fptr, currmaildir); break; case 'x': - m_forward(idc, fptr, currmaildir); + m_forward(arg->idc, fptr, currmaildir); break; case 'y': - multi_reply(idc, fptr, currmaildir); + multi_reply(arg->idc, fptr, currmaildir); break; case 'd': case 'D': @@ -739,12 +738,23 @@ read_new_mail(fileheader_t * fptr) } } if (delete_it) { + if(arg->delcnt==1000) { + vmsg("一次最多刪 1000 封信"); + return 0; + } clear(); prints("刪除信件《%s》", fptr->title); getdata(1, 0, msg_sure_ny, genbuf, 2, LCECHO); if (genbuf[0] == 'y') { + if(arg->delmsgs==NULL) { + arg->delmsgs=(int*)malloc(sizeof(int)*1000); + if(arg->delmsgs==NULL) { + vmsg("失敗, 請洽站長"); + return 0; + } + } unlink(fname); - delmsgs[delcnt++] = idc; // FIXME 一次刪太多信 out of array boundary + arg->delmsgs[arg->delcnt++] = arg->idc; mailsum = mailkeep = 0; } } @@ -755,24 +765,26 @@ read_new_mail(fileheader_t * fptr) int m_new() { + struct ReadNewMailArg arg; clear(); - mrd = 0; setutmpmode(RMAIL); - read_new_mail(NULL); + memset(&arg, 0, sizeof(arg)); clear(); curredit |= EDIT_MAIL; curredit &= ~EDIT_ITEM; - if (apply_record(currmaildir, read_new_mail, sizeof(fileheader_t)) == -1) { + if (apply_record(currmaildir, read_new_mail, sizeof(fileheader_t), &arg) == -1) { + if(arg.delmsgs) + free(arg.delmsgs); vmsg("沒有新信件了"); return -1; } curredit = 0; currutmp->mailalert = load_mailalert(cuser.userid); - if (delcnt) { - while (delcnt--) - delete_record(currmaildir, sizeof(fileheader_t), delmsgs[delcnt]); - } - vmsg(mrd ? "信已閱\畢" : "沒有新信件了"); + while (arg.delcnt--) + delete_record(currmaildir, sizeof(fileheader_t), arg.delmsgs[arg.delcnt]); + if(arg.delmsgs) + free(arg.delmsgs); + vmsg(arg.mrd ? "信已閱\畢" : "沒有新信件了"); return -1; } |