• Patch: Elm ME+ 2.5 PLalpha49 -> Elm ME+ 2.5 PLalpha50 [3/7] (3/4)

    From Kari Hurtta@21:1/5 to All on Mon Jun 10 20:53:28 2019
    [continued from previous message]

    ! entry_in_reply_to));
    !
    ! free_string(& entry_in_reply_to);
    ! }
    !
    ! ok = 0;
    ! }
    !
    ! if (prev_entry->in_reply_to) {
    ! struct string * prev_entry_in_reply_to =
    ! references_to_string(prev_entry->in_reply_to);
    !
    ! if (prev_entry_in_reply_to) {
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: only prev_entry in_reply_to %S exists\n",
    ! prev_entry_in_reply_to));
    !
    ! free_string(& prev_entry_in_reply_to);
    ! }
    !
    ! ok = 0;
    ! }
    ! }
    !
    ! if (entry->references && prev_entry->references) {
    ! struct string * entry_references =
    ! references_to_string(entry->references);
    !
    ! if (same_references(entry->references,prev_entry->references)) {
    !
    ! if (entry_references) {
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: references %S matches\n", ! entry_references));
    ! }
    !
    ! } else {
    ! struct string * prev_entry_references =
    ! references_to_string(prev_entry->references);
    !
    ! if (prev_entry_references) {
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: entry references %S != prev_entry references %S\n",
    ! entry_references,prev_entry_references));
    !
    ! free_string(& prev_entry_references);
    ! }
    !
    ! ok = 0;
    ! }
    !
    ! if (entry_references)
    ! free_string(& entry_references);
    !
    ! } else {
    !
    ! if (entry->references) {
    ! struct string * entry_references =
    ! references_to_string(entry->references);
    !
    ! if (entry_references) {
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: only entry references %S exists\n",
    ! entry_references));
    !
    ! free_string(& entry_references);
    ! }
    !
    ! ok = 0;
    ! }
    !
    ! if (prev_entry->references) {
    ! struct string * prev_entry_references =
    ! references_to_string(prev_entry->references);
    !
    ! if (prev_entry_references) {
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: only prev_entry references %S exists\n",
    ! prev_entry_references));
    !
    ! free_string(& prev_entry_references);
    ! }
    !
    ! ok = 0;
    ! }
    ! }
    !
    ! if (0 == strcmp(entry->time_zone, prev_entry->time_zone)) {
    ! if (entry->time_zone[0]) {
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: time_zone %s matches\n",
    ! entry->time_zone));
    ! }
    !
    ! } else {
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: entry time_zone %s != prev_entry time_zone %s\n",
    ! entry->time_zone,prev_entry->time_zone));
    ! ok = 0;
    ! }
    !
    ! if (entry->time_sent == prev_entry->time_sent) {
    !
    ! if (entry->time_sent > 0 && entry->time_sent < time_MAX) {
    ! char * s = ctime(&(entry->time_sent));
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: time_sent %ld matches: %s",
    ! (long)(entry->time_sent),
    ! s ? s : "(no time)\n"));
    !
    ! }
    ! } else {
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: entry time_sent %ld != prev_entry time_sent %ld\n",
    ! (long)(entry->time_sent),
    ! (long)(prev_entry->time_sent)));
    ! ok = 0;
    !
    ! }
    !
    ! if (entry->tz_offset == prev_entry->tz_offset) {
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: tz_offset %ld matches\n",
    ! (long)(entry->tz_offset)));
    !
    ! } else {
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: entry tz_offset %ld != prev_entry tz_offset %ld\n",
    ! (long)(entry->tz_offset),
    ! (long)(prev_entry->tz_offset)));
    ! ok = 0;
    ! }
    !
    ! if (entry->subject && prev_entry->subject) {
    ! #define FAIL_COMPARE -1000
    ! int r = string_cmp(entry->subject,prev_entry->subject,
    ! FAIL_COMPARE);
    !
    ! if (0 == r) {
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: subject %S matches\n",
    ! entry->subject));
    ! } else if (FAIL_COMPARE != r) {
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: entry subject %S != prev_entry subject %S\n",
    ! entry->subject,
    ! prev_entry->subject));
    !
    ! ok = 0;
    ! }
    ! #undef FAIL_COMPARE
    ! } else {
    ! if (entry->subject) {
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: only entry subject %S exists\n",
    ! entry->subject));
    !
    ! ok = 0;
    ! }
    !
    ! if (prev_entry->subject) {
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec: only prev_entry subject %S exists\n",
    ! prev_entry->subject));
    !
    ! ok = 0;
    ! }
    ! }
    !
    ! ret = ok && match;
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "match_header_rec=%d (%s), %s%s\n",
    ! ret,
    ! ret ? "matched" : "not found",
    ! ok ? "ok" : "no match",
    ! match ? ", message-id" : ""));
    !
    ! return ret;
    ! }
    !
    ! struct previous_data * search_previous_header(folder,entry,
    ! reconnect_mode_ptr,
    ! previous_headers,
    ! previous_count,
    ! result_index)
    ! struct folder_info *folder;
    ! struct header_rec *entry;
    ! RECONNECT_MODE reconnect_mode_ptr;
    ! struct previous_data * previous_headers;
    ! size_t previous_count;
    ! size_t *result_index;
    ! {
    ! struct previous_data * ret = NULL;
    ! size_t i;
    !
    ! if (FOLDER_INFO_magic != folder->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"search_previous_header",
    ! "Bad magic number (folder_info)",0);
    !
    ! if (FOLDER_TYPE_magic != folder->folder_type->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"search_previous_header",
    ! "Bad magic number (folder type)",0);
    !
    ! if (RECONNECT_MODE_magic != reconnect_mode_ptr->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"search_previous_header",
    ! "Bad magic number (reconnect_mode)",0);
    !
    ! DPRINT(Debug,10,(&Debug,
    ! "search_previous_header: folder=%p (%s), type=%p (%s)\n", ! folder,folder->cur_folder_sys,folder -> folder_type,
    ! folder->folder_type->type_name));
    ! DPRINT(Debug,10,(&Debug,
    ! " : entry=%p",entry));
    ! if (!entry->mbx_info) {
    ! DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=NULL }"));
    ! } else {
    ! DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=%p, type=%p }",
    ! entry->mbx_info,entry->mbx_info->type_code));
    ! }
    ! DPRINT(Debug,10,(&Debug,
    ! ", hdr index #%d\n",
    ! entry->index_number_X));
    ! DPRINT(Debug,10,(&Debug,
    ! " : previous_headers=%p, previous_count=%lu, result_index=%p\n",
    ! previous_headers,(unsigned long)previous_count,result_index));
    !
    !
    ! *result_index = 0L;
    !
    ! for (i = 0; i < previous_count && !ret; i++) {
    ! if ( -1 == previous_headers[i].found_index &&
    ! previous_headers[i].rec) {
    ! enum comp_prev_hdr_result r =
    ! folder->folder_type->
    ! comp_prev_hdr_it(folder,entry,
    ! previous_headers[i].rec,
    ! reconnect_mode_ptr);
    !
    ! switch (r) {
    ! case comp_prev_hdr_miss: break;
    ! case comp_prev_hdr_pass:
    ! if (! match_header_rec(entry,
    ! previous_headers[i].rec))
    ! break;
    ! /* FALL THROUGH */
    ! case comp_prev_hdr_found:
    ! *result_index = i;
    ! ret = &( previous_headers[i]);
    ! break;
    ! }
    ! }
    ! }
    !
    !
    ! if (ret) {
    ! DPRINT(Debug,10,(&Debug,
    ! "search_previous_header=%p: #%d, *result_index=%lu\n",
    ! ret,
    ! entry->index_number_X,
    ! (unsigned long)*result_index
    ! ));
    ! } else {
    ! DPRINT(Debug,10,(&Debug,
    ! "search_previous_header=NULL: #%d\n",
    ! entry->index_number_X));
    ! }
    !
    ! return ret;
    ! }
    !
    !
    ! static int cpprev_read_buffered_line P_((RECONNECT_MODE reconnect_mode_ptr,
    ! struct FILE_rs *rs,
    ! char **buffer, int *len));
    ! static int cpprev_read_buffered_line(reconnect_mode_ptr,rs,
    ! buffer,len)
    ! RECONNECT_MODE reconnect_mode_ptr;
    ! struct FILE_rs * rs;
    ! char ** buffer;
    ! int * len;
    ! {
    ! long f = -1L;
    !
    ! if (RECONNECT_MODE_magic != reconnect_mode_ptr->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"cpprev_read_buffered_line",
    ! "Bad magic number (reconnect_mode)",0);
    !
    ! if(rs->next_line) {
    ! *buffer = rs->next_line;
    ! *len = rs->next_line_len;
    !
    ! } else {
    ! f = ftell(reconnect_mode_ptr->tempfolder_fh);
    !
    ! if (!mbx_read_line(reconnect_mode_ptr->tempfolder_fh,
    ! buffer,len,
    ! mbx_max_line_read(reconnect_mode_ptr -> tempfolder_size,f)))
    ! return 0;
    !
    !
    ! rs->next_line = *buffer;
    ! rs->next_line_len = *len;
    !
    ! }
    !
    ! DPRINT(Debug,60,(&Debug,
    ! "cpprev_read_buffered_line: "));
    ! if (f >= 0L) {
    ! DPRINT(Debug,60,(&Debug, "offset=%ld, ",
    ! f));
    ! }
    !
    ! DPRINT(Debug,60,(&Debug, "len=%d, buffer=",
    ! *len));
    ! DEBUG_PRINT_BUFFER(Debug,60,*len,s2us(*buffer));
    ! if (*len < 1 || !(*buffer) || (*buffer)[*len -1] != '\n') {
    ! DPRINT(Debug,60,(&Debug,
    ! "\ncpprev_read_buffered_line: NO NEWLINE\n"));
    ! }
    !
    ! return 1;
    ! }
    !
    ! static void cpprev_accept_buffered_line P_((RECONNECT_MODE reconnect_mode_ptr,
    ! struct FILE_rs *rs,
    ! READ_STATE read_state_ptr,
    ! char **buffer, int *len));
    ! static void cpprev_accept_buffered_line(reconnect_mode_ptr,rs,
    ! read_state_ptr,buffer,len)
    ! RECONNECT_MODE reconnect_mode_ptr;
    ! struct FILE_rs *rs;
    ! READ_STATE read_state_ptr;
    ! char **buffer;
    ! int *len;
    ! {
    ! if (RECONNECT_MODE_magic != reconnect_mode_ptr->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"cpprev_accept_buffered_line",
    ! "Bad magic number (reconnect_mode)",0);
    !
    ! if (RF_magic != read_state_ptr -> magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"cpprev_accept_buffered_line",
    ! "Bad magic number (read state)",0);
    !
    ! if (*buffer != rs->next_line)
    ! panic("MBX PANIC",__FILE__,__LINE__,"cpprev_accept_buffered_line",
    ! "Bad buffer!",0);
    !
    ! if (!*buffer)
    ! return;
    !
    ! if (*len < 1 || (*buffer)[*len -1] != '\n') {
    ! } else {
    ! read_state_ptr -> linecounter++;
    ! }
    !
    ! rs->next_line = NULL;
    ! read_state_ptr -> fbytes += rs->next_line_len;
    ! rs->next_line_len = 0;
    !
    ! free(*buffer);
    ! *buffer = NULL;
    ! *len = 0;
    ! }
    !
    ! #define CPPREV_RS_magic 0xFA07
    !
    ! /* Hook for copy_previous_mail() */
    ! struct copy_previous_rs {
    ! unsigned short magic; /* CPPREV_RS_magic */
    !
    ! RECONNECT_MODE reconnect_mode_ptr;
    ! struct FILE_rs RS;
    !
    ! long fbytes_body;
    ! };
    !
    !
    ! enum copy_env_status copy_previous_mail(folder,read_state_ptr,
    ! entry,parse_header,parse_body,
    ! counter,reconnect_mode_ptr,
    ! previous_header)
    ! struct folder_info *folder;
    ! READ_STATE read_state_ptr;
    ! struct header_rec * entry; /* May be replaced entry */
    ! parse_header_callback * parse_header;
    ! parse_body_callback * parse_body;
    ! struct counter_data * counter;
    ! RECONNECT_MODE reconnect_mode_ptr;
    ! struct previous_data * previous_header;
    ! {
    ! enum copy_env_status status = copy_env_no_data;
    !
    ! if (FOLDER_INFO_magic != folder->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"copy_previous_mail",
    ! "Bad magic number (folder_info)",0);
    !
    ! if (FOLDER_TYPE_magic != folder->folder_type->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"copy_previous_mail",
    ! "Bad magic number (folder type)",0);
    !
    ! if (RF_magic != read_state_ptr -> magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"copy_previous_mail",
    ! "Bad magic number (read state)",0);
    !
    ! if (RECONNECT_MODE_magic != reconnect_mode_ptr->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"copy_previous_mail",
    ! "Bad magic number (reconnect_mode)",0);
    !
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: folder=%p (%s), type=%p (%s)\n",
    ! folder,folder->cur_folder_sys,folder -> folder_type,
    ! folder->folder_type->type_name));
    ! DPRINT(Debug,10,(&Debug,
    ! " : entry=%p",entry));
    ! if (!entry->mbx_info) {
    ! DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=NULL }"));
    ! } else {
    ! DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=%p, type=%p }",
    ! entry->mbx_info,entry->mbx_info->type_code));
    ! }
    ! DPRINT(Debug,10,(&Debug,
    ! ", hdr index #%d\n",
    ! entry->index_number_X));
    !
    ! read_state_ptr ->skipping = sm_reading; /* 0 == reading,
    ! 1 == skipping,
    ! -1 == end of message */
    ! entry->body_parsed = 0;
    ! entry->mime_parsed = 0;
    ! read_state_ptr -> linecounter = 0; /* Linecounter of current
    ! message */
    !
    !
    ! if (previous_header->rec) {
    !
    ! if (previous_header->rec->body_parsed) {
    ! struct copy_previous_rs RSHOOK;
    ! char * buffer = NULL;
    ! int len;
    ! int r;
    !
    ! /* bzero is defined hdrs/elm_defs.h */
    ! bzero((void *)&RSHOOK,sizeof RSHOOK);
    !
    ! RSHOOK.magic = CPPREV_RS_magic;
    ! RSHOOK.reconnect_mode_ptr = reconnect_mode_ptr;
    !
    ! zero_FILE_rs(& (RSHOOK.RS));
    !
    ! RSHOOK.fbytes_body = previous_header->rec->offset;
    !
    ! read_state_ptr -> reconnect_copy_previous = &RSHOOK;
    !
    ! entry->status = previous_header->rec->status;
    !
    ! entry->offset = read_state_ptr -> fbytes;
    ! /* Offset of current message */
    !
    ! status = copy_env_eof;
    !
    ! if (PREPARE_ACCESS == read_state_ptr->mode)
    ! panic("MBX PANIC",__FILE__,__LINE__,"copy_previous_mail",
    ! "PREPARE_ACCESS not valid when copying previous mail",0);
    !
    ! if (PRIVATE_DATA_magic != folder->p->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"copy_previous_mail",
    ! "Bad magic number (private_data)",0);
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: entry offset = %ld (previous mail)\n",
    ! previous_header->rec->offset));
    !
    ! r = fseek(reconnect_mode_ptr->tempfolder_fh,
    ! previous_header->rec->offset,
    ! SEEK_SET);
    ! if (-1 == r) {
    ! int err = errno;
    !
    ! lib_error(CATGETS(elm_msg_cat, ElmSet,
    ! ElmCouldntSeekBytesIntoFolder,
    ! "\nCouldn't seek %ld bytes into folder.\n"), ! previous_header->rec->offset);
    ! lib_error(FRM("** %s. **\n"), strerror(err));
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: Failed to seek %s to %ld: %s (errno=%d)\n",
    ! reconnect_mode_ptr->tempfolder_name,
    ! previous_header->rec->offset,
    ! strerror(err),err));
    ! status = copy_env_eof;
    ! goto clean;
    ! } else if (0 == r) {
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: Seeked %s to %ld\n",
    ! reconnect_mode_ptr->tempfolder_name,
    ! previous_header->rec->offset));
    ! }
    !
    ! entry->offset = read_state_ptr -> fbytes; /* Offset of current message */
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: entry offset = %ld\n",
    ! entry->offset));
    !
    ! if (!cpprev_read_buffered_line(reconnect_mode_ptr,&(RSHOOK.RS),&buffer,&len)) {
    ! status = copy_env_eof;
    ! goto clean;
    ! }
    ! if (0 == len) {
    ! status = copy_env_eof;
    ! goto clean;
    ! }
    !
    ! if (real_from(buffer,entry)) {
    ! long f;
    ! header_list_ptr parsed_headers = NULL;
    ! int s;
    !
    ! DPRINT(Debug,12,(&Debug, "copy_previous_mail: "));
    ! if (entry->env_from[0]) {
    ! DPRINT(Debug,12,(&Debug," env from %s",
    ! entry->env_from));
    ! } else {
    ! DPRINT(Debug,12,(&Debug,", no env from"));
    ! }
    ! DPRINT(Debug,12,(&Debug, "\n"));
    !
    ! if (!mbx_copy_line_to_temp(folder,buffer,len)) {
    ! status = copy_env_eof;
    ! goto clean;
    ! }
    !
    ! cpprev_accept_buffered_line(reconnect_mode_ptr,&(RSHOOK.RS),
    ! read_state_ptr,&buffer,&len);
    !
    ! f = ftell(reconnect_mode_ptr->tempfolder_fh);
    !
    ! status = copy_env_ok;
    ! read_state_ptr -> fbytes_body = read_state_ptr -> fbytes;
    ! entry->mime_rec.begin_offset = read_state_ptr -> fbytes;;
    ! RSHOOK.fbytes_body = f;
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: {mime} begin_offset = %ld\n",
    ! entry->mime_rec.begin_offset));
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: {mime} begin_offset = %ld (previous mail)\n",
    ! RSHOOK.fbytes_body));
    !
    ! entry->header_charset = previous_header->rec->header_charset;
    ! entry->content_length = previous_header->rec->content_length;
    !
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: hdr %ld body %ld content_length %ld%s\n",
    ! entry->offset,read_state_ptr -> fbytes_body, ! entry->content_length,
    ! -1 == entry->content_length ? " (unset)" : ""));
    !
    ! parsed_headers =
    ! read_folder_headers(read_state_ptr,folder,entry);
    !
    ! entry->mime_rec.offset = read_state_ptr -> fbytes;
    ! DPRINT(Debug,12,(&Debug,
    ! "copy_previous_mail: {mime} offset = %ld\n", ! entry->mime_rec.offset));
    ! if (entry->binary) {
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: have binary flag\n"));
    ! }
    !
    ! if (entry->header_charset != display_charset) {
    ! const char * MIME_name UNUSED_VAROK =
    ! get_charset_MIME_name(entry->header_charset);
    !
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: header charset is: %s\n",
    ! MIME_name ? MIME_name : "<no MIME name>" ! ));
    !
    ! }
    !
    ! if (-1 != entry->content_length) {
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: content_length is: %ld\n",
    ! entry->content_length
    ! ));
    ! }
    !
    ! s = parse_header(folder,read_state_ptr,entry,parsed_headers); !
    ! if (s <= 0) {
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: parse_header callback failed (%d)\n",
    ! s));
    ! status = copy_env_format;
    ! } else {
    ! switch (read_state_ptr ->skipping) {
    ! case sm_EOM:
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: End of message, body skipped\n"));
    ! break;
    ! case sm_skipping:
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: Body skipped\n"));
    ! break;
    ! case sm_reading:
    ! s = parse_body(folder,read_state_ptr,entry,parsed_headers,counter);
    ! if (s <= 0) {
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: parse_body callback failed (%d)\n",
    ! s));
    ! status = copy_env_format;
    ! }
    ! break;
    ! }
    ! }
    ! delete_headers(&parsed_headers);
    !
    ! if (sm_EOM != read_state_ptr ->skipping &&
    ! ( status >= copy_env_ok ||
    ! copy_env_no_data == status)) {
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: copy_envelope_end_folder not called or succeed (skipping=%d, status=%d)\n",
    ! read_state_ptr ->skipping, status));
    ! }
    !
    ! } else {
    ! lib_error(CATGETS(elm_msg_cat, ElmSet, ElmFolderCorrupt,
    ! "Folder is corrupt!! I can't read it!!")); ! status = copy_env_format;
    ! }
    !
    ! clean:
    ! if (buffer) {
    ! if (buffer == RSHOOK.RS.next_line)
    ! RSHOOK.RS.next_line = NULL;
    ! free(buffer);
    ! buffer = NULL;
    ! }
    !
    ! clear_FILE_rs(& (RSHOOK.RS));
    !
    ! read_state_ptr -> reconnect_copy_previous = NULL;
    ! } else {
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: Previous mail was not parsed.\n"));
    ! status = copy_env_no_data;
    ! }
    !
    ! if (previous_header->rec->status_chgd) {
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail: message #%d: previous (#%d) was changed status",
    ! entry->index_number_X,previous_header->rec->index_number_X
    ! ));
    !
    ! #define X(field,F,T) if (ison(previous_header->rec->field,F) && isoff(entry->field,F)) { \
    ! setit(entry->field,F); \
    ! DPRINT(Debug,10,(&Debug,"; set %s",T)); \
    ! entry->status_chgd = 1; \
    ! } \
    ! else if (isoff(previous_header->rec->status,F) && ison(entry->status,F)) { \
    ! clearit(entry->status,F); \
    ! DPRINT(Debug,10,(&Debug,"; clear %s",T)); \
    ! entry->status_chgd = 1; \
    ! }
    !
    ! X(status,UNREAD,"UNREAD");
    ! X(status,DELETED,"DELETED");
    ! X(status,NEW,"NEW");
    ! X(status,TAGGED,"TAGGED");
    ! X(status,VISIBLE,"VISIBLE");
    ! X(status,REPLIED_TO, "REPLIED_TO");
    ! X(status1,S1_FLAGGED,"S1_FLAGGED");
    !
    ! if (! entry->status_chgd) {
    ! DPRINT(Debug,10,(&Debug, ", no changes to current"));
    ! }
    !
    ! DPRINT(Debug,10,(&Debug, "\n"));
    ! #undef X
    ! }
    !
    ! /* This usually does nothing */
    !
    ! folder->folder_type->
    ! update_prev_hdr_it(folder,entry,
    ! previous_header->rec,
    ! reconnect_mode_ptr,
    ! read_state_ptr);
    !
    ! }
    !
    ! DPRINT(Debug,10,(&Debug,
    ! "copy_previous_mail=%d",
    ! status));
    ! switch (status) {
    ! case copy_env_no_data: DPRINT(Debug,10,(&Debug," copy_env_no_data")); break;
    ! case copy_env_format: DPRINT(Debug,10,(&Debug," copy_env_format")); break;
    ! case copy_env_eof: DPRINT(Debug,10,(&Debug," copy_env_eof")); break;
    ! case copy_env_ok: DPRINT(Debug,10,(&Debug," copy_env_ok")); break;
    ! }
    ! DPRINT(Debug,10,(&Debug,"\n"));
    !
    ! return status;
    ! }
    !
    ! #if ANSI_C
    ! extern parse_mime_callback NO_mime_parse;
    ! #endif
    ! int NO_mime_parse(folder,entry,fp)
    ! struct folder_info *folder;
    ! struct header_rec *entry;
    ! FILE *fp;
    ! {
    ! return 1; /* OK, but not set parsed flag */
    ! }
    !
    ! int prepare_message_access(folder,entry,parse_header,
    ! parse_body,counter,parse_mime)
    ! struct folder_info *folder;
    ! struct header_rec *entry;
    ! parse_header_callback *parse_header;
    ! parse_body_callback *parse_body;
    ! struct counter_data *counter;
    ! parse_mime_callback *parse_mime;
    ! {
    ! int status = 1;
    !
    ! if (FOLDER_INFO_magic != folder->magic)
    ! panic("MBX PANIC",__FILE__,__LINE__,"prepare_message_access",
    ! "Bad magic number (folder_info)",0);

    if (FOLDER_TYPE_magic != folder->folder_type->magic)
    panic("MBX PANIC",__FILE__,__LINE__,"prepare_message_access", ***************
    *** 1457,1478 ****
    " : entry=%p",entry));
    if (!entry->mbx_info) {
    DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=NULL }\n"));
    } else {
    DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=%p, type=%p }\n",
    entry->mbx_info,entry->mbx_info->type_code));
    }

    if (! entry->body_parsed) {
    ! READ_STATE read_state_ptr;
    enum copy_env_status status1 = copy_env_eof;

    DPRINT(Debug,10,(&Debug,
    "prepare_message_access: Need read message\n",
    folder,folder->cur_folder_sys));
    !
    ! malloc_read_folder_state(&read_state_ptr);
    folder->folder_type->zero_rs_fields_it(read_state_ptr);

    if (PRIVATE_DATA_magic != folder->p->magic)
    --- 3081,3115 ----
    " : entry=%p",entry));
    if (!entry->mbx_info) {
    DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=NULL }"));
    } else {
    DPRINT(Debug,10,(&Debug,
    ! ", { mbx_info=%p, type=%p }",
    entry->mbx_info,entry->mbx_info->type_code));
    }
    + DPRINT(Debug,10,(&Debug,
    + ", hdr index #%d",
    + entry->index_number_X));
    + if (entry->message_id) {
    + struct string * entry_message_id =
    + message_id_to_string(entry->message_id);
    + if (entry_message_id) {
    + DPRINT(Debug,10,(&Debug,", message-id=%S",
    + entry_message_id));
    + free_string(& entry_message_id);
    + }
    + }
    + DPRINT(Debug,10,(&Debug,"\n"));

    +
    if (! entry->body_parsed) {
    ! READ_STATE read_state_ptr = malloc_read_folder_state();
    enum copy_env_status status1 = copy_env_eof;

    DPRINT(Debug,10,(&Debug,
    "prepare_message_access: Need read message\n",
    folder,folder->cur_folder_sys));
    !
    folder->f