Index: apps/plugins/calendar.c =================================================================== --- apps/plugins/calendar.c (revision 18797) +++ apps/plugins/calendar.c (working copy) @@ -30,9 +30,10 @@ static const struct plugin_api* rb; static bool leap_year; +/* days_in_month[][0] is for December */ static const int days_in_month[2][13] = { - {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, - {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, + {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, + {31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, }; struct today { @@ -176,8 +177,8 @@ rb->lcd_update(); } -#define MAX_CHAR_MEMO_LEN 63 -#define MAX_MEMOS_IN_A_MONTH 127 +#define MAX_CHAR_MEMO_LEN 64 +#define MAX_MEMOS_IN_A_MONTH 128 struct memo { char message[MAX_CHAR_MEMO_LEN]; int day; @@ -199,6 +200,9 @@ char temp_memo1[2]; char temp_memo2[3]; char temp_memo4[5]; + temp_memo1[1] = 0; + temp_memo2[2] = 0; + temp_memo4[4] = 0; for (k = 0; k < memos_in_memory; k++) { memos[k].day = 0; @@ -208,8 +212,8 @@ memos[k].year = 0; memos[k].type = 0; memos[k].wday = 0; - for (i = 0; i <= MAX_CHAR_MEMO_LEN; i++) - rb->strcpy(&memos[k].message[i],""); + for (i = 0; i < MAX_CHAR_MEMO_LEN; i++) + memos[k].message[i] = 0; } for (k = 1; k < 32; k++) day_has_memo[k] = false; @@ -262,7 +266,7 @@ (memos[memos_in_memory].type == 2) && (memos[memos_in_memory].month == shown->mon) - ) + ) || ( (memos[memos_in_memory].type > 2) @@ -270,8 +274,8 @@ (memos[memos_in_memory].month == shown->mon) && (memos[memos_in_memory].year == shown->year) - ) ) + ) { if (temp_memo1[0] == '\n') { @@ -285,7 +289,8 @@ rb->lseek(fp, 0, SEEK_CUR); } else if ( (temp_memo1[0] != '\r') && - (temp_memo1[0] != '\t') ) + (temp_memo1[0] != '\t') && + k < MAX_CHAR_MEMO_LEN-1 ) memos[memos_in_memory].message[k] = temp_memo1[0]; } if (temp_memo1[0] == '\n') @@ -300,7 +305,7 @@ memos[memos_in_memory].year = 0; memos[memos_in_memory].type = 0; memos[memos_in_memory].wday = 0; - rb->strcpy(&memos[memos_in_memory].message[0], ""); + memos[memos_in_memory].message[0] = 0; exit = true; break; } @@ -318,7 +323,7 @@ if ( (fq != -1) && (fp != -1) ) { int i; - char temp[MAX_CHAR_MEMO_LEN + 1]; + char temp[MAX_CHAR_MEMO_LEN]; rb->lseek(fp, 0, SEEK_SET); for (i = 0; i < memos[changed].file_pointer_start; i++) { @@ -336,24 +341,14 @@ memos[changed].message); } rb->lseek(fp, memos[changed].file_pointer_end, SEEK_SET); - for (i = memos[changed].file_pointer_end; - i < rb->filesize(fp); i++) + while(rb->read(fp, temp, 1) == 1) { - rb->read(fp, temp, 1); rb->write(fq,temp,1); } rb->close(fp); - fp = rb->creat(ROCKBOX_DIR "/.memo"); - rb->lseek(fp, 0, SEEK_SET); - rb->lseek(fq, 0, SEEK_SET); - for (i = 0; i < rb->filesize(fq); i++) - { - rb->read(fq, temp, 1); - rb->write(fp,temp,1); - } - rb->close(fp); rb->close(fq); - rb->remove(ROCKBOX_DIR "/~temp"); + rb->remove(ROCKBOX_DIR "/.memo"); + rb->rename(ROCKBOX_DIR "/~temp", ROCKBOX_DIR "/.memo"); load_memo(shown); return true; } @@ -371,7 +366,7 @@ sizeof memos[memos_in_memory].message) != -1) { if (rb->strlen(memos[memos_in_memory].message)) - { + { memos[memos_in_memory].file_pointer_start = 0; memos[memos_in_memory].file_pointer_end = 0; memos[memos_in_memory].day = shown->mday; @@ -382,7 +377,6 @@ if (save_memo(memos_in_memory,true,shown)) { saved = true; - memos_in_memory++; } else { @@ -534,7 +528,11 @@ start = 0; for (i = 0; i < memos_in_memory; i++) if ( - (memos[i].day == shown->mday) + ( + (memos[i].type >= 1) + && + (memos[i].day == shown->mday) + ) || ( (memos[i].type < 1) @@ -612,7 +610,7 @@ shown->year++; leap_year = is_leap_year(shown->year); } - else if (step > 0) + if (step > 0) shown->mday = shown->mday - days_in_month[leap_year][shown->mon-1]; else if (shown->mday > days_in_month[leap_year][shown->mon]) shown->mday = days_in_month[leap_year][shown->mon];