summaryrefslogtreecommitdiff
path: root/pith/state.c
diff options
context:
space:
mode:
Diffstat (limited to 'pith/state.c')
-rw-r--r--pith/state.c318
1 files changed, 318 insertions, 0 deletions
diff --git a/pith/state.c b/pith/state.c
new file mode 100644
index 00000000..e88c27f6
--- /dev/null
+++ b/pith/state.c
@@ -0,0 +1,318 @@
+#if !defined(lint) && !defined(DOS)
+static char rcsid[] = "$Id: state.c 1074 2008-06-04 00:08:43Z hubert@u.washington.edu $";
+#endif
+
+/*
+ * ========================================================================
+ * Copyright 2006-2008 University of Washington
+ * Copyright 2013 Eduardo Chappa
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * ========================================================================
+ */
+
+/*======================================================================
+ state.c
+ Implements the Pine state management routines
+ ====*/
+
+
+#include "../pith/headers.h"
+#include "../pith/state.h"
+#include "../pith/conf.h"
+#include "../pith/init.h"
+#include "../pith/sort.h"
+#include "../pith/atttype.h"
+#include "../pith/util.h"
+#include "../pith/mailindx.h"
+#include "../pith/remote.h"
+#include "../pith/list.h"
+#include "../pith/smime.h"
+
+
+/*
+ * Globals referenced throughout pine...
+ */
+struct pine *ps_global; /* THE global variable! */
+
+#ifdef DEBUG
+/*
+ * Debug level and output file defined here, referenced globally.
+ * The debug file is opened and initialized below...
+ */
+int debug = DEFAULT_DEBUG;
+#endif
+
+
+/*----------------------------------------------------------------------
+ General use big buffer. It is used in the following places:
+ compose_mail: while parsing header of postponed message
+ append_message2: while writing header into folder
+ q_status_messageX: while doing printf formatting
+ addr_book: Used to return expanded address in. (Can only use here
+ because mm_log doesn't q_status on PARSE errors !)
+ alpine.c: When address specified on command line
+ init.c: When expanding variable values
+ and many many more...
+
+ ----*/
+char tmp_20k_buf[SIZEOF_20KBUF];
+
+
+/*
+ * new_pine_struct - allocate and fill in with default values a new pine struct
+ */
+struct pine *
+new_pine_struct(void)
+{
+ struct pine *p;
+
+ p = (struct pine *)fs_get(sizeof (struct pine));
+ memset((void *) p, 0, sizeof(struct pine));
+ p->def_sort = SortArrival;
+ p->sort_types[0] = SortSubject;
+ p->sort_types[1] = SortArrival;
+ p->sort_types[2] = SortFrom;
+ p->sort_types[3] = SortTo;
+ p->sort_types[4] = SortCc;
+ p->sort_types[5] = SortDate;
+ p->sort_types[6] = SortSize;
+ p->sort_types[7] = SortSubject2;
+ p->sort_types[8] = SortScore;
+ p->sort_types[9] = SortThread;
+ p->sort_types[10] = EndofList;
+#ifdef SMIME
+ /*
+ * We need to have access to p->smime even before calling
+ * smime_init() so that we can set do_encrypt and do_sign.
+ */
+ p->smime = new_smime_struct();
+#endif /* SMIME */
+ p->atmts = (ATTACH_S *) fs_get(sizeof(ATTACH_S));
+ p->atmts_allocated = 1;
+ p->atmts->description = NULL;
+ p->low_speed = 1;
+ p->init_context = -1;
+ msgno_init(&p->msgmap, 0L, SortArrival, 0);
+ init_init_vars(p);
+
+ return(p);
+}
+
+
+
+/*
+ * free_pine_struct -- free up allocated data in pine struct and then the
+ * struct itself
+ */
+void
+free_pine_struct(struct pine **pps)
+{
+ if(!(pps && (*pps)))
+ return;
+
+ if((*pps)->hostname != NULL)
+ fs_give((void **)&(*pps)->hostname);
+
+ if((*pps)->localdomain != NULL)
+ fs_give((void **)&(*pps)->localdomain);
+
+ if((*pps)->ttyo != NULL)
+ fs_give((void **)&(*pps)->ttyo);
+
+ if((*pps)->home_dir != NULL)
+ fs_give((void **)&(*pps)->home_dir);
+
+ if((*pps)->folders_dir != NULL)
+ fs_give((void **)&(*pps)->folders_dir);
+
+ if((*pps)->ui.homedir)
+ fs_give((void **)&(*pps)->ui.homedir);
+
+ if((*pps)->ui.login)
+ fs_give((void **)&(*pps)->ui.login);
+
+ if((*pps)->ui.fullname)
+ fs_give((void **)&(*pps)->ui.fullname);
+
+ free_index_format(&(*pps)->index_disp_format);
+
+ if((*pps)->conv_table){
+ if((*pps)->conv_table->table)
+ fs_give((void **) &(*pps)->conv_table->table);
+
+ if((*pps)->conv_table->from_charset)
+ fs_give((void **) &(*pps)->conv_table->from_charset);
+
+ if((*pps)->conv_table->to_charset)
+ fs_give((void **) &(*pps)->conv_table->to_charset);
+
+ fs_give((void **)&(*pps)->conv_table);
+ }
+
+ if((*pps)->pinerc)
+ fs_give((void **)&(*pps)->pinerc);
+
+#if defined(DOS) || defined(OS2)
+ if((*pps)->pine_dir)
+ fs_give((void **)&(*pps)->pine_dir);
+
+ if((*pps)->aux_files_dir)
+ fs_give((void **)&(*pps)->aux_files_dir);
+#endif
+
+ if((*pps)->display_charmap)
+ fs_give((void **)&(*pps)->display_charmap);
+
+ if((*pps)->keyboard_charmap)
+ fs_give((void **)&(*pps)->keyboard_charmap);
+
+ if((*pps)->posting_charmap)
+ fs_give((void **)&(*pps)->posting_charmap);
+
+#ifdef PASSFILE
+ if((*pps)->passfile)
+ fs_give((void **)&(*pps)->passfile);
+#endif /* PASSFILE */
+
+ if((*pps)->hdr_colors)
+ free_spec_colors(&(*pps)->hdr_colors);
+
+ if((*pps)->keywords)
+ free_keyword_list(&(*pps)->keywords);
+
+ if((*pps)->kw_colors)
+ free_spec_colors(&(*pps)->kw_colors);
+
+ if((*pps)->atmts){
+ int i;
+
+ for(i = 0; (*pps)->atmts[i].description; i++){
+ fs_give((void **) &(*pps)->atmts[i].description);
+ fs_give((void **) &(*pps)->atmts[i].number);
+ }
+
+ fs_give((void **) &(*pps)->atmts);
+ }
+
+ if((*pps)->msgmap)
+ msgno_give(&(*pps)->msgmap);
+
+ free_vars(*pps);
+
+ fs_give((void **) pps);
+}
+
+
+void
+free_pinerc_strings(struct pine **pps)
+{
+ if((*pps)->prc){
+ if((*pps)->prc->outstanding_pinerc_changes)
+ write_pinerc((*pps), Main, WRP_NONE);
+
+ if((*pps)->prc->rd)
+ rd_close_remdata(&(*pps)->prc->rd);
+
+ free_pinerc_s(&(*pps)->prc);
+ }
+
+ if((*pps)->pconf)
+ free_pinerc_s(&(*pps)->pconf);
+
+ if((*pps)->post_prc){
+ if((*pps)->post_prc->outstanding_pinerc_changes)
+ write_pinerc((*pps), Post, WRP_NONE);
+
+ if((*pps)->post_prc->rd)
+ rd_close_remdata(&(*pps)->post_prc->rd);
+
+ free_pinerc_s(&(*pps)->post_prc);
+ }
+}
+
+
+/*
+ * free_vars -- give back resources acquired when we defined the
+ * variables list
+ */
+void
+free_vars(struct pine *ps)
+{
+ register int i;
+
+ for(i = 0; ps && i <= V_LAST_VAR; i++)
+ free_variable_values(&ps->vars[i]);
+}
+
+
+void
+free_variable_values(struct variable *var)
+{
+ if(var){
+ if(var->is_list){
+ free_list_array(&var->current_val.l);
+ free_list_array(&var->main_user_val.l);
+ free_list_array(&var->post_user_val.l);
+ free_list_array(&var->global_val.l);
+ free_list_array(&var->fixed_val.l);
+ free_list_array(&var->cmdline_val.l);
+ }
+ else{
+ if(var->current_val.p)
+ fs_give((void **)&var->current_val.p);
+ if(var->main_user_val.p)
+ fs_give((void **)&var->main_user_val.p);
+ if(var->post_user_val.p)
+ fs_give((void **)&var->post_user_val.p);
+ if(var->global_val.p)
+ fs_give((void **)&var->global_val.p);
+ if(var->fixed_val.p)
+ fs_give((void **)&var->fixed_val.p);
+ if(var->cmdline_val.p)
+ fs_give((void **)&var->cmdline_val.p);
+ }
+ }
+}
+
+
+PINERC_S *
+new_pinerc_s(char *name)
+{
+ PINERC_S *prc = NULL;
+
+ if(name){
+ prc = (PINERC_S *)fs_get(sizeof(*prc));
+ memset((void *)prc, 0, sizeof(*prc));
+ prc->name = cpystr(name);
+ if(IS_REMOTE(name))
+ prc->type = RemImap;
+ else
+ prc->type = Loc;
+ }
+
+ return(prc);
+}
+
+
+void
+free_pinerc_s(PINERC_S **prc)
+{
+ if(prc && *prc){
+ if((*prc)->name)
+ fs_give((void **)&(*prc)->name);
+
+ if((*prc)->rd)
+ rd_free_remdata(&(*prc)->rd);
+
+ if((*prc)->pinerc_lines)
+ free_pinerc_lines(&(*prc)->pinerc_lines);
+
+ fs_give((void **)prc);
+ }
+}