home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / elm.lzh / ELM / SRC / SAVE_OPTS.C < prev    next >
Text File  |  1991-01-11  |  11KB  |  401 lines

  1.  
  2. static char rcsid[] = "@(#)$Id: save_opts.c,v 4.1 90/04/28 22:44:00 syd Exp $";
  3.  
  4. /*******************************************************************************
  5.  *  The Elm Mail System  -  $Revision: 4.1 $   $State: Exp $
  6.  *
  7.  *             Copyright (c) 1986, 1987 Dave Taylor
  8.  *             Copyright (c) 1988, 1989, 1990 USENET Community Trust
  9.  *******************************************************************************
  10.  * Bug reports, patches, comments, suggestions should be sent to:
  11.  *
  12.  *    Syd Weinstein, Elm Coordinator
  13.  *    elm@DSI.COM            dsinc!elm
  14.  *
  15.  *******************************************************************************
  16.  * $Log:    save_opts.c,v $
  17.  * Revision 4.1  90/04/28  22:44:00  syd
  18.  * checkin of Elm 2.3 as of Release PL0
  19.  * 
  20.  *
  21.  ******************************************************************************/
  22.  
  23. /** This file contains the routine needed to allow the users to change the
  24.     Elm parameters and then save the configuration in a ".elm/elmrc" file in
  25.     their home directory.  With any luck this will allow them never to have
  26.     to actually EDIT the file!!
  27.  
  28. **/
  29.  
  30. #include "headers.h"
  31. #include <errno.h>
  32.  
  33. #undef onoff
  34. #define   onoff(n)    (n == 1? "ON":"OFF")
  35.  
  36. #define absolute(x)        ((x) < 0? -(x) : (x))
  37.  
  38. extern  int errno;
  39. extern char version_buff[];
  40.  
  41. char *error_name(), *sort_name();
  42. long  ftell();
  43.  
  44. #include "save_opts.h"
  45.  
  46. FILE *elminfo;        /* informational file as needed... */
  47.  
  48. save_options()
  49. {
  50.     /** Save the options currently specified to a file.  This is a
  51.         fairly complex routine since it tries to put in meaningful
  52.         comments and such as it goes along.  The comments are
  53.         extracted from the file ELMRC_INFO as defined in the sysdefs.h
  54.         file.  THAT file has the format;
  55.  
  56.         varname
  57.           <comment>
  58.           <comment>
  59.         <blank line>
  60.  
  61.         and each comment is written ABOVE the variable to be added.  This
  62.         program also tries to make 'pretty' stuff like the alternatives
  63.         and such.
  64.     **/
  65.  
  66.     FILE *newelmrc; 
  67.     char  oldfname[SLEN], newfname[SLEN];
  68.  
  69.     sprintf(newfname, "%s/%s", home, elmrcfile);
  70.     sprintf(oldfname, "%s/%s", home, old_elmrcfile);
  71.  
  72.     /** first off, let's see if they already HAVE a .elm/elmrc file **/
  73.  
  74.     save_file_stats(newfname);
  75.     if (access(newfname, ACCESS_EXISTS) != -1) {
  76.       /** YES!  Copy it to the file ".old.elmrc".. **/
  77.       if (rename(newfname, oldfname) < 0)
  78.         dprint(2, (debugfile, "Unable to rename %s to %s\n", 
  79.            newfname, oldfname));
  80.       (void) ochown(oldfname, userid, groupid);
  81.  
  82.     }
  83.  
  84.     /** now let's open the datafile if we can... **/
  85.  
  86.     if ((elminfo = fopen(ELMRC_INFO, "r")) == NULL) 
  87.       error1("Warning: saving without comments! Can't get to %s.", 
  88.           ELMRC_INFO);
  89.  
  90.     /** next, open the new .elm/elmrc file... **/
  91.  
  92.     if ((newelmrc = fopen(newfname, "w")) == NULL) {
  93.        error2("Can't save configuration! Can't write to %s [%s].",
  94.            newfname, error_name(errno));
  95.        return;
  96.     }
  97.     
  98.     save_user_options(elminfo, newelmrc);
  99.     restore_file_stats(newfname);
  100.  
  101.     error1("Options saved in file %s.", newfname);
  102. }
  103.  
  104. save_user_options(elminfo_fd, newelmrc)
  105. FILE *elminfo_fd, *newelmrc;
  106. {
  107.     /** save the information in the file.  If elminfo_fd == NULL don't look
  108.         for comments!
  109.     **/
  110.  
  111.     if (elminfo_fd != NULL) 
  112.       build_offset_table(elminfo_fd);
  113.  
  114.     fprintf(newelmrc,     
  115.           "#\n# .elm/elmrc - options file for the ELM mail system\n#\n");
  116.  
  117.     if (strlen(full_username) > 0)
  118.       fprintf(newelmrc, "# Saved automatically by ELM %s for %s\n#\n\n",
  119.           version_buff, full_username);
  120.     else
  121.       fprintf(newelmrc, "# Saved automatically by ELM %s\n#\n\n", version_buff);
  122.     fprintf(newelmrc,"# For yes/no settings with ?, ON means yes, OFF means no\n\n");
  123.  
  124.     save_option_string(CALENDAR, raw_calendar_file, newelmrc, FALSE);
  125.     save_option_string(EDITOR, raw_editor, newelmrc, FALSE);
  126.  
  127.     save_option_char(ESCAPECHAR, escape_char, newelmrc);
  128.  
  129.     save_option_string(FULLNAME, full_username, newelmrc, FALSE);
  130.     save_option_string(RECEIVEDMAIL, raw_recvdmail, newelmrc, FALSE);
  131.     save_option_string(MAILDIR, raw_folders, newelmrc, FALSE);
  132.     save_option_string(TMPDIR, temp_dir, newelmrc, FALSE);
  133.     save_option_string(PAGER, raw_pager, newelmrc, FALSE);
  134.     save_option_string(PREFIX, prefixchars, newelmrc, TRUE);
  135.     save_option_string(PRINT, raw_printout, newelmrc, FALSE);
  136.     save_option_string(SENTMAIL, raw_sentmail, newelmrc, FALSE);
  137.     save_option_string(SHELL, raw_shell, newelmrc, FALSE);
  138.  
  139.     save_option_string(LOCALSIGNATURE, raw_local_signature,
  140.        newelmrc, FALSE);
  141.     save_option_string(REMOTESIGNATURE, raw_remote_signature,
  142.       newelmrc, FALSE);
  143.     save_option_on_off(SIGDASHES, sig_dashes, newelmrc);
  144.  
  145.     save_option_sort(SORTBY, newelmrc);
  146.  
  147.     save_option_on_off(ALWAYSDELETE, always_del, newelmrc);
  148.     save_option_on_off(ALWAYSSTORE, always_store, newelmrc);
  149.     save_option_on_off(ALWAYSKEEP, always_keep, newelmrc);
  150.     save_option_on_off(ARROW, arrow_cursor, newelmrc);
  151.     save_option_on_off(ASK, question_me, newelmrc);
  152.     save_option_on_off(ASKCC, prompt_for_cc, newelmrc);
  153.     save_option_string(ATTRIBUTION, attribution, newelmrc, FALSE);
  154.     save_option_on_off(AUTOCOPY, auto_copy, newelmrc);
  155.  
  156.     save_option_number(BOUNCEBACK, bounceback, newelmrc);
  157.  
  158.     save_option_on_off(COPY, auto_cc, newelmrc);
  159.     save_option_on_off(FORCENAME, force_name, newelmrc);
  160.     save_option_on_off(FORMS, (allow_forms != NO), newelmrc);
  161.     save_option_on_off(KEEPEMPTY, keep_empty_files, newelmrc);
  162.     save_option_on_off(KEYPAD, hp_terminal, newelmrc);
  163.     save_option_on_off(MENU, mini_menu, newelmrc);
  164.     save_option_on_off(MOVEPAGE, move_when_paged, newelmrc);
  165.     save_option_on_off(NAMES, names_only, newelmrc);
  166.     save_option_on_off(NOHEADER, noheader, newelmrc);
  167.     save_option_on_off(POINTNEW, point_to_new, newelmrc);
  168.     save_option_on_off(PROMPTAFTER, prompt_after_pager, newelmrc);
  169.     save_option_on_off(RESOLVE, resolve_mode, newelmrc);
  170.     save_option_on_off(SAVENAME, save_by_name, newelmrc);
  171.     save_option_on_off(SOFTKEYS, hp_softkeys, newelmrc);
  172.  
  173.     save_option_number(TIMEOUT, (int) timeout, newelmrc);
  174.  
  175.     save_option_on_off(TITLES, title_messages, newelmrc);
  176.  
  177.     save_option_number(USERLEVEL, user_level, newelmrc);
  178.  
  179.     save_option_on_off(WARNINGS, warnings, newelmrc);
  180.     save_option_on_off(WEED, filter, newelmrc);
  181.  
  182.     save_option_weedlist(WEEDOUT, newelmrc);
  183.     save_option_alternatives(ALTERNATIVES, alternative_addresses, newelmrc);
  184.  
  185.     fclose(newelmrc);
  186.     if ( elminfo_fd != NULL ) {
  187.         fclose(elminfo_fd);
  188.     }
  189. }
  190.  
  191. save_option_string(iindex, value, fd, underscores)
  192. int iindex, underscores;
  193. char *value;
  194. FILE *fd;
  195. {
  196.     /** Save a string option to the file... only subtlety is when we
  197.         save strings with spaces in 'em - translate to underscores!
  198.     **/
  199.  
  200.     char     buffer[SLEN], *bufptr;
  201.     
  202.     add_comment(iindex, fd);
  203.     
  204.     strcpy(buffer, value);
  205.  
  206.     if (underscores)
  207.       for (bufptr = buffer; *bufptr; bufptr++)
  208.         if (*bufptr == SPACE) *bufptr = '_';
  209.  
  210.     fprintf(fd, "%s = %s\n\n", save_info[iindex].name, buffer);
  211. }
  212.        
  213. save_option_sort(iindex, fd)
  214. int iindex;
  215. FILE *fd;
  216. {
  217.     /** save the current sorting option to a file **/
  218.  
  219.     add_comment(iindex, fd);
  220.  
  221.     fprintf(fd, "%s = %s\n\n", save_info[iindex].name,
  222.         sort_name(SHORT));
  223. }
  224.  
  225. save_option_char(iindex, value, fd)
  226. int iindex;
  227. char value;
  228. FILE *fd;
  229. {
  230.     /** Save a character option to the file **/
  231.  
  232.     add_comment(iindex, fd);
  233.     
  234.     fprintf(fd, "%s = %c\n\n", save_info[iindex].name, value);
  235. }
  236.  
  237. save_option_number(iindex, value, fd)
  238. int iindex, value;
  239. FILE *fd;
  240. {
  241.     /** Save a binary option to the file - boy is THIS easy!! **/
  242.  
  243.     add_comment(iindex, fd);
  244.     
  245.     fprintf(fd, "%s = %d\n\n", save_info[iindex].name, value);
  246. }
  247.  
  248. save_option_on_off(iindex, value, fd)
  249. int iindex, value;
  250. FILE *fd;
  251. {
  252.     /** Save a binary option to the file - boy is THIS easy!! **/
  253.  
  254.     add_comment(iindex, fd);
  255.     
  256.     fprintf(fd, "%s = %s\n\n", save_info[iindex].name, onoff(value));
  257. }
  258.  
  259. save_option_weedlist(iindex, fd)
  260. int iindex;
  261. FILE *fd;
  262. {
  263.     /** save a list of weedout headers to the file **/
  264.  
  265.     int length_so_far = 0, i;
  266.  
  267.     add_comment(iindex, fd);
  268.  
  269.     length_so_far = strlen(save_info[iindex].name) + 4;
  270.  
  271.     fprintf(fd, "%s = ", save_info[iindex].name);
  272.  
  273.     /** first off, skip till we get past the default list **/
  274.  
  275.     for (i = 0; i < weedcount; i++) 
  276.       if (strcmp(weedlist[i],"*end-of-defaults*") == 0)
  277.         break;
  278.  
  279.     while (i < weedcount) {
  280.       if (strcmp(weedlist[i], "*end-of-defaults*") != 0)
  281.         break;
  282.       i++;    /* and get PAST it too! */
  283.     }
  284.  
  285.     while (i < weedcount) {
  286.       if (strlen(weedlist[i]) + length_so_far > 78) {
  287.         fprintf(fd, "\n\t");
  288.         length_so_far = 8;
  289.       }
  290.       fprintf(fd, "\"%s\" ", weedlist[i]);
  291.       length_so_far += (strlen(weedlist[i]) + 4);
  292.       i++;
  293.     }
  294.     fprintf(fd, "\t\"*end-of-user-headers*\"\n\n");
  295. }
  296.  
  297. save_option_alternatives(iindex, list, fd)
  298. int iindex;
  299. struct addr_rec *list;
  300. FILE *fd;
  301. {
  302.     /** save a list of options to the file **/
  303.     int length_so_far = 0;
  304.     struct addr_rec     *alternate;
  305.  
  306.     if (list == NULL) return;    /* nothing to do! */
  307.  
  308.     add_comment(iindex, fd);
  309.  
  310.     alternate = list;    /* don't LOSE the top!! */
  311.  
  312.     length_so_far = strlen(save_info[iindex].name) + 4;
  313.  
  314.     fprintf(fd, "%s = ", save_info[iindex].name);
  315.  
  316.     while (alternate != NULL) {
  317.       if (strlen(alternate->address) + length_so_far > 78) {
  318.         fprintf(fd, "\n\t");
  319.         length_so_far = 8;
  320.       }
  321.       fprintf(fd, "%s  ", alternate->address);
  322.       length_so_far += (strlen(alternate->address) + 3);
  323.       alternate = alternate->next;
  324.     }
  325.     fprintf(fd, "\n\n");
  326. }
  327.  
  328. add_comment(iindex, fd)
  329. int iindex;
  330. FILE *fd;
  331. {    
  332.     /** get to and add the comment to the file **/
  333.     char buffer[SLEN];
  334.  
  335.     /** first off, add the comment from the comment file, if available **/
  336.  
  337.     if (save_info[iindex].offset > 0L) {
  338.       if (fseek(elminfo, save_info[iindex].offset, 0) == -1) {
  339.         dprint(1,(debugfile,
  340.            "** error %s seeking to %ld in elm-info file!\n",
  341.            error_name(errno), save_info[iindex].offset));
  342.       }
  343.       else while (fgets(buffer, SLEN, elminfo) != NULL) {
  344.         if (buffer[0] != '#') 
  345.            break;
  346.         else
  347.            fprintf(fd, "%s", buffer);
  348.       }
  349.     }
  350. }
  351.  
  352. build_offset_table(elminfo_fd)
  353. FILE *elminfo_fd;
  354. {
  355.     /** read in the info file and build the table of offsets.
  356.         This is a rather laborious puppy, but at least we can
  357.         do a binary search through the array for each element and
  358.         then we have it all at once!
  359.     **/
  360.  
  361.     char line_buffer[SLEN];
  362.     
  363.     while (fgets(line_buffer, SLEN, elminfo_fd) != NULL) {
  364.       if (strlen(line_buffer) > 1)
  365.         if (line_buffer[0] != '#' && !whitespace(line_buffer[0])) {
  366.            no_ret(line_buffer);
  367.            if (find_and_store_loc(line_buffer, ftell(elminfo_fd))) {
  368.              dprint(1, (debugfile,"** Couldn't find and store \"%s\" **\n", 
  369.              line_buffer));
  370.            }
  371.         }
  372.     }
  373. }
  374.  
  375. find_and_store_loc(name, offset)
  376. char *name;
  377. long  offset;
  378. {
  379.     /** given the name and offset, find it in the table and store it **/
  380.  
  381.     int first = 0, last, middle, compare;
  382.  
  383.     last = NUMBER_OF_SAVEABLE_OPTIONS;
  384.  
  385.     while (first <= last) {
  386.  
  387.       middle = (first+last) / 2;
  388.  
  389.       if ((compare = strcmp(name, save_info[middle].name)) < 0) /* a < b */
  390.         last = middle - 1;
  391.       else if (compare == 0) {                    /* a = b */
  392.         save_info[middle].offset = offset;
  393.         return(0);
  394.       }
  395.       else  /* greater */                        /* a > b */
  396.         first = middle + 1; 
  397.     }
  398.  
  399.     return(-1);
  400. }
  401.