home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / LO241SRV.ZIP / menu.c < prev    next >
Text File  |  1998-08-01  |  67KB  |  2,198 lines

  1.  
  2. // LoraBBS Version 2.41 Free Edition
  3. // Copyright (C) 1987-98 Marco Maccaferri
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #include <stdio.h>
  20. #include <ctype.h>
  21. #include <alloc.h>
  22. #include <string.h>
  23. #include <io.h>
  24. #include <time.h>
  25. #include <fcntl.h>
  26. #include <conio.h>
  27. #include <stdlib.h>
  28. #include <dir.h>
  29. #include <sys\stat.h>
  30.  
  31. #include <cxl\cxlvid.h>
  32. #include <cxl\cxlstr.h>
  33.  
  34. #include "lsetup.h"
  35. #include "sched.h"
  36. #include "msgapi.h"
  37. #include "externs.h"
  38. #include "prototyp.h"
  39.  
  40. int process_menu_option(int, char *);
  41. int get_user_age (void);
  42. void ask_default_protocol (void);
  43. void ask_default_archiver (void);
  44. void tag_files (int);
  45. void ask_birthdate (void);
  46. void list_tagged_files (int remove);
  47. int naplps_read_file (char *name);
  48. void kludge_change (void);
  49. int bluewave_pack_tagged_areas (void);
  50. void offline_pack_tagged_areas (int bw);
  51. void forward_message_area (int sig, int flag);
  52.  
  53. #define MENU_LENGTH  14
  54. #define MENU_STACK   10
  55. #define MAX_ITEMS   100
  56.  
  57. extern int msg_parent, msg_child;
  58. extern char stop_hotkey, num_hotkey, no_precheck;
  59.  
  60. static int i;
  61. static char mnu_name[MENU_LENGTH], *st, max_menu, active, old_activ;
  62. static char menu_stack[MENU_STACK][MENU_LENGTH], filename[50], first_time;
  63. static char menu_sp, readed, file_stack[MENU_STACK][MENU_LENGTH], *mnu_file;
  64. static struct _cmd *cmd = NULL;
  65.  
  66. static int get_menu_password (char *);
  67. static void return_menu(void);
  68. static void gosub_menu(char *);
  69. static void process_user_display (char *, int);
  70. static void get_buffer_keystrokes (char *);
  71. static int ok_counter (char *);
  72. static int get_sig (char *);
  73. static int user_age_ok (char *arg);
  74.  
  75. struct _menu_header {
  76.    char name[14];
  77.    short  n_elem;
  78. };
  79.  
  80. int check_hotkey (char c)
  81. {
  82.    int m = 0, i;
  83.  
  84.    for (i = 0; i < max_menu; i++) {
  85.       if (usr.priv < cmd[i].priv || cmd[i].priv == HIDDEN)
  86.          continue;
  87.       if ((usr.flags & cmd[i].flags) != cmd[i].flags)
  88.          continue;
  89.       if (!cmd[i].flag_type || cmd[i].automatic)
  90.          continue;
  91.       if (cmd[i].first_time && !first_time)
  92.          continue;
  93.       if (cmd[i].hotkey == toupper (c) || (cmd[i].hotkey == '|' && !c)) {
  94.          m = 1;
  95.          break;
  96.       }
  97.    }
  98.  
  99.    return (m);
  100. }
  101.  
  102. void menu_dispatcher(start)
  103. char *start;
  104. {
  105.    FILE *fd;
  106.    int m, processed;
  107.    char last_command, err;
  108.    struct _menu_header m_header;
  109.  
  110.    st = start;
  111.    strcpy(mnu_name, (start == NULL) ? "MAIN" : start);
  112.    mnu_file = NULL;
  113.  
  114.    max_menu = 0;
  115.    err = 0;
  116.    readed = 0;
  117.    menu_sp = 0;
  118.    old_activ = 0;
  119.    active = (start == NULL) ? 0 : 4;
  120.    allow_reply = (active == 4) ? 1 : 0;
  121.    cmd = NULL;
  122.  
  123.    if (start == NULL)
  124.       cls ();
  125.  
  126.    i = 0;
  127. //   cmd[i].nocls = 0;
  128.    cmd_string[0] = '\0';
  129.  
  130.    i = (start == NULL) ? 0 : -1;
  131.  
  132.    for (;;) {
  133.       XON_ENABLE();
  134.       _BRK_ENABLE();
  135.  
  136.       if (!readed) {
  137.          num_hotkey = 0;
  138.  
  139.          if (mnu_file == NULL)
  140.             sprintf (filename, "%s%s.MNU", config->menu_path, config->language[usr.language].basename);
  141.          else
  142.             sprintf (filename, "%s%s.MNU", config->menu_path, mnu_file);
  143.          fd = fopen (filename, "rb");
  144.          if (fd == NULL || filelength (fileno(fd)) < sizeof (struct _menu_header)) {
  145.             if (mnu_file != NULL) {
  146.                mnu_file = NULL;
  147.                sprintf (filename, "%s%s.MNU", config->menu_path, config->language[usr.language].basename);
  148.                if (fd != NULL)
  149.                   fclose (fd);
  150.                fd = fopen (filename, "rb");
  151.             }
  152.             if (fd == NULL || filelength (fileno(fd)) < sizeof (struct _menu_header)) {
  153.                if (fd != NULL)
  154.                   fclose (fd);
  155.                sprintf (filename,"%s%s.MNU", config->menu_path, config->language[0].basename);
  156.                fd = fopen (filename, "rb");
  157.                if (fd == NULL) {
  158.                   status_line ("!Can't open `%s'", filename);
  159.                   return;
  160.                }
  161.             }
  162.          }
  163.  
  164.          for (;;) {
  165.             if (fread((char *)&m_header, 1, sizeof(struct _menu_header),fd) != sizeof(struct _menu_header)) {
  166.                status_line("!Menu `%s' not found", mnu_name);
  167.                if (err == 1)
  168.                   return;
  169.                strcpy (mnu_name, "MAIN");
  170.                fseek (fd, 0, SEEK_SET);
  171.                err = 1;
  172.                menu_sp = 0;
  173.                mnu_file = NULL;
  174.             }
  175.             else {
  176.                if (!stricmp(m_header.name, mnu_name))
  177.                   break;
  178.  
  179.                fseek (fd, (long)sizeof(struct _cmd) * m_header.n_elem, SEEK_CUR);
  180.             }
  181.          }
  182.  
  183.          err = 0;
  184.  
  185.          if (m_header.n_elem > MAX_ITEMS)
  186.             m_header.n_elem = MAX_ITEMS;
  187.          if (cmd != NULL)
  188.             free (cmd);
  189.          if (sq_ptr != NULL) {
  190.             MsgCloseArea (sq_ptr);
  191.             if (sys.squish) {
  192.                sq_ptr = MsgOpenArea (sys.msg_path, MSGAREA_CRIFNEC, MSGTYPE_SQUISH);
  193.                MsgUnlock (sq_ptr);
  194.             }
  195.             else
  196.                sq_ptr = NULL;
  197.          }
  198.          cmd = (struct _cmd *)malloc (m_header.n_elem * sizeof (struct _cmd));
  199.          if (cmd == NULL) {
  200.             status_line(msgtxt[M_NODELIST_MEM]);
  201.             return;
  202.          }
  203.  
  204.          fread((char *)cmd,sizeof(struct _cmd) * m_header.n_elem,1,fd);
  205.          fclose (fd);
  206.  
  207.          readed = 1;
  208.          first_time = 1;
  209.          max_menu = m_header.n_elem;
  210.       }
  211.  
  212.       i = 0;
  213.  
  214.       for (m=0; m < max_menu; m++) {
  215.          if(usr.priv < cmd[m].priv || cmd[m].priv == HIDDEN)
  216.             continue;
  217.          if((usr.flags & cmd[m].flags) != cmd[m].flags)
  218.             continue;
  219.  
  220.          if (cmd[m].first_time && !first_time)
  221.             continue;
  222.  
  223.          if (!user_age_ok (cmd[m].argument))
  224.             continue;
  225.  
  226.          if (cmd[m].flag_type == _MSG_INDIVIDUAL || cmd[m].flag_type == _MAIL_INDIVIDUAL)
  227.             num_hotkey = 1;
  228.  
  229.          if ((cmd[m].flag_type == _F_DNLD || cmd[m].flag_type == _F_GLOBAL_DNLD) && stristr (cmd[m].argument, "/F=") == NULL) {
  230.             if (usr.priv < sys.download_priv || sys.download_priv == HIDDEN)
  231.                continue;
  232.             if((usr.flags & sys.download_flags) != sys.download_flags)
  233.                continue;
  234.          }
  235.  
  236.          if(cmd[m].flag_type == _F_TAG) {
  237.             if (usr.priv < sys.download_priv || sys.download_priv == HIDDEN)
  238.                continue;
  239.             if((usr.flags & sys.download_flags) != sys.download_flags)
  240.                continue;
  241.          }
  242.  
  243.          if(cmd[m].flag_type == _F_UPLD) {
  244.             if (usr.priv < sys.upload_priv || sys.upload_priv == HIDDEN)
  245.                continue;
  246.             if((usr.flags & sys.upload_flags) != sys.upload_flags)
  247.                continue;
  248.          }
  249.  
  250. /*
  251.          if(cmd[m].flag_type == _F_TITLES) {
  252.             if (usr.priv < sys.list_priv || sys.list_priv == HIDDEN)
  253.                continue;
  254.             if((usr.flags & sys.list_flags) != sys.list_flags)
  255.                continue;
  256.          }
  257. */
  258.  
  259.          if((cmd[m].flag_type == _MSG_EDIT_NEW) || (cmd[m].flag_type == _MSG_EDIT_REPLY))
  260.             if (strstr (cmd[m].argument, "/A=") == NULL) {
  261.                if (usr.priv < sys.write_priv || sys.write_priv == HIDDEN)
  262.                   continue;
  263.                if((usr.flags & sys.write_flags) != sys.write_flags)
  264.                   continue;
  265.             }
  266.  
  267.          if ((cmd[m].flag_type == _MSG_CHILD && !msg_child) || (cmd[m].flag_type == _MSG_PARENT && !msg_parent))
  268.             continue;
  269.  
  270.          if (cmd[m].automatic && cmd[m].flag_type) {
  271.             if (cmd_string[0] && (cmd[m].flag_type == _SHOW ||
  272.                                   cmd[m].flag_type == _SHOW_TEXT ||
  273.                                   cmd[m].flag_type == _CONFIG))
  274.                continue;
  275.  
  276.             if (!ok_counter (cmd[m].argument))
  277.                continue;
  278.  
  279.             get_buffer_keystrokes (cmd[m].argument);
  280.             i = m;
  281.             stop_hotkey = 1;
  282.             if (process_menu_option(cmd[m].flag_type, cmd[m].argument)) {
  283.                stop_hotkey = 0;
  284.                if (cmd != NULL)
  285.                   free (cmd);
  286.                return;
  287.             }
  288.             stop_hotkey = 0;
  289.             if (!readed)
  290.                break;
  291.             continue;
  292.          }
  293.  
  294.          if (!cmd_string[0] && !cmd[m].no_display && cmd[m].name[0])
  295.             process_user_display (cmd[m].name, m);
  296.       }
  297.  
  298.       if (!readed)
  299.          continue;
  300.  
  301.       if (user_status != BROWSING)
  302.          set_useron_record(BROWSING, 0, 0);
  303.       first_time = 0;
  304.  
  305.       if (!cmd_string[0]) {
  306.          if (local_mode) {
  307.             while (kbhit())
  308.                m = getch ();
  309.             local_kbd = -1;
  310.          }
  311.  
  312.          if (usr.hotkey) {
  313.             do {
  314.                cmd_input (cmd_string, MAX_CMDLEN - 1);
  315.                if (!cmd_string[0] && cmd_string[1] == 5)
  316.                   break;
  317.                m = 0;
  318.                for (i = 0; i < max_menu; i++) {
  319.                   if (usr.priv < cmd[i].priv || cmd[i].priv == HIDDEN)
  320.                      continue;
  321.                   if ((usr.flags & cmd[i].flags) != cmd[i].flags)
  322.                      continue;
  323.                   if (!cmd[i].flag_type || cmd[i].automatic)
  324.                      continue;
  325.                   if (cmd[i].first_time && !first_time)
  326.                      continue;
  327.                   if (cmd[i].hotkey == toupper (cmd_string[0]) || (cmd[i].hotkey == '|' && !cmd_string[0])) {
  328.                      m = 1;
  329.                      break;
  330.                   }
  331.                }
  332.                if (!cmd_string[0])
  333.                   m_print (" ");
  334.  
  335.                if (m == 0)
  336.                   m_print ("\b \b");
  337.             } while (m == 0 && CARRIER && time_remain() > 0);
  338.  
  339.             m_print (bbstxt[B_ONE_CR]);
  340.          }
  341.          else
  342.             input (cmd_string, MAX_CMDLEN - 1);
  343.       }
  344.       else
  345.          CLEAR_OUTBOUND();
  346.  
  347.       if (!CARRIER || time_remain() <= 0)
  348.          return;
  349.  
  350.       last_command = '\0';
  351.       processed = 0;
  352.  
  353.       for (i = 0; i < max_menu && i >= 0; i++) {
  354.          if(usr.priv < cmd[i].priv || cmd[i].priv == HIDDEN)
  355.             continue;
  356.          if((usr.flags & cmd[i].flags) != cmd[i].flags)
  357.             continue;
  358.          if (!cmd[i].flag_type || cmd[i].automatic)
  359.             continue;
  360.          if (cmd[i].first_time && !first_time)
  361.             continue;
  362.  
  363.          if (!user_age_ok (cmd[i].argument))
  364.             continue;
  365.  
  366.          if ((cmd[i].flag_type == _F_DNLD || cmd[m].flag_type == _F_GLOBAL_DNLD) && stristr (cmd[i].argument, "/F=") == NULL) {
  367.             if (usr.priv < sys.download_priv || sys.download_priv == HIDDEN)
  368.                continue;
  369.             if((usr.flags & sys.download_flags) != sys.download_flags)
  370.                continue;
  371.          }
  372.          if(cmd[i].flag_type == _F_TAG) {
  373.             if (usr.priv < sys.download_priv || sys.download_priv == HIDDEN)
  374.                continue;
  375.             if((usr.flags & sys.download_flags) != sys.download_flags)
  376.                continue;
  377.          }
  378.          if(cmd[i].flag_type == _F_UPLD) {
  379.             if (usr.priv < sys.upload_priv || sys.upload_priv == HIDDEN)
  380.                continue;
  381.             if((usr.flags & sys.upload_flags) != sys.upload_flags)
  382.                continue;
  383.          }
  384. /*
  385.          if(cmd[i].flag_type == _F_TITLES) {
  386.             if (usr.priv < sys.list_priv || sys.list_priv == HIDDEN)
  387.                continue;
  388.             if((usr.flags & sys.list_flags) != sys.list_flags)
  389.                continue;
  390.          }
  391. */
  392.          if((cmd[i].flag_type == _MSG_EDIT_NEW) || (cmd[i].flag_type == _MSG_EDIT_REPLY))
  393.             if (strstr (cmd[i].argument, "/A=") == NULL) {
  394.                if (usr.priv < sys.write_priv || sys.write_priv == HIDDEN)
  395.                   continue;
  396.                if((usr.flags & sys.write_flags) != sys.write_flags)
  397.                   continue;
  398.             }
  399.  
  400.          if ((cmd[i].flag_type == _MSG_CHILD && !msg_child) || (cmd[i].flag_type == _MSG_PARENT && !msg_parent))
  401.             continue;
  402.  
  403.          if ((cmd[i].hotkey == toupper(cmd_string[0]) && !processed) ||
  404.              (cmd[i].hotkey == '|' && !cmd_string[0] && !processed) ||
  405.              (cmd[i].hotkey == toupper(last_command) && processed))
  406.          {
  407.             last_command = cmd[i].hotkey;
  408.             if (!ok_counter (cmd[i].argument))
  409.                break;
  410.             get_buffer_keystrokes (cmd[i].argument);
  411.             if (cmd_string[0] && cmd[i].flag_type != _MSG_INDIVIDUAL && cmd[i].flag_type != _MAIL_INDIVIDUAL) {
  412.                strcpy (&cmd_string[0], &cmd_string[1]);
  413.                strtrim (cmd_string);
  414.             }
  415.             if (process_menu_option(cmd[i].flag_type, cmd[i].argument)) {
  416.                if (cmd != NULL)
  417.                   free (cmd);
  418.                return;
  419.             }
  420.             processed = 1;
  421.             if (i == -1)
  422.                break;
  423.          }
  424.       }
  425.  
  426.       if (!processed && cmd_string[0]) {
  427.          m_print (bbstxt[B_UNKNOW_CMD], toupper (cmd_string[0]));
  428.          cmd_string[0] = '\0';
  429.       }
  430.  
  431.       if (!CARRIER || time_remain() <= 0)
  432.          break;
  433.    }
  434. }
  435.  
  436.  
  437. int process_menu_option (int flag_type, char *argument)
  438. {
  439.    static int s, v, gg, lo;
  440.    int xp;
  441.    char *p = NULL, buf[128];
  442.  
  443.    switch (flag_type) {
  444.       case _MESSAGE:
  445.          if (!get_menu_password (argument))
  446.             break;
  447.          active = 1;
  448.          xp = get_sig (argument);
  449.          if ((p=strstr(argument, "/A=")) != NULL)
  450.             usr.msg = atoi(p + 3);
  451.          if (!read_system(usr.msg, active)) {
  452.             if (strstr (argument, "/2") != NULL)
  453.                display_area_list(active, 1, xp);
  454.             else if (strstr (argument, "/3") != NULL)
  455.                display_area_list(active, 3, xp);
  456.             else if (strstr (argument, "/4") != NULL)
  457.                display_area_list(active, 4, xp);
  458.             else
  459.                display_area_list(active, 2, xp);
  460.          }
  461.          else
  462.             status_line(msgtxt[M_BBS_EXIT], usr.msg, sys.msg_name);
  463.          if (sys.quick_board || sys.gold_board)
  464.             quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  465.          else if (sys.pip_board)
  466.             pip_scan_message_base (usr.msg, 1);
  467.          else if (sys.squish)
  468.             squish_scan_message_base (usr.msg, sys.msg_path, 1);
  469.          else
  470.             scan_message_base(usr.msg, 1);
  471.          allow_reply = 0;
  472.          if (strstr (argument, "/NS") == NULL)
  473.             cls ();
  474.          gosub_menu (argument);
  475.          break;
  476.       case _FILE:
  477.          if (!get_menu_password (cmd[i].argument))
  478.             break;
  479.          active = 2;
  480.          xp = get_sig (argument);
  481.          if ((p=strstr(argument, "/A=")) != NULL)
  482.             usr.files = atoi(p + 3);
  483.          if (!read_system (usr.files, active)) {
  484.             if (strstr (argument, "/2") != NULL)
  485.                display_area_list(active, 1, xp);
  486.             else if (strstr (argument, "/3") != NULL)
  487.                display_area_list(active, 3, xp);
  488.             else if (strstr (argument, "/4") != NULL)
  489.                display_area_list(active, 4, xp);
  490.             else
  491.                display_area_list(active, 2, xp);
  492.          }
  493.          else
  494.             status_line(msgtxt[M_BBS_SPAWN], usr.files, sys.file_name);
  495.          if (strstr (argument, "/NS") == NULL)
  496.             cls ();
  497.          gosub_menu (argument);
  498.          break;
  499.       case _GOODBYE:
  500.          if (logoff_procedure())
  501.             return (1);
  502.          break;
  503.       case _SHOW:
  504.          if (stristr (argument, "/NS") == NULL)
  505.             cls ();
  506.          if (stristr (argument, "/R") == NULL)
  507.             read_file (argument);
  508.          else
  509.             naplps_read_file (argument);
  510.          if (stristr (argument, "/P") != NULL)
  511.             press_enter ();
  512.          break;
  513.       case _YELL:
  514.          if (stristr (argument, "/NL") == NULL) {
  515.             if (!lorainfo.wants_chat)
  516.                status_line (":User request chat"),
  517.             lorainfo.wants_chat = 1;
  518.             lorainfo.yelling++;
  519.             if (function_active == 1)
  520.                f1_status();
  521.          }
  522.          yelling_at_sysop (argument);
  523.          break;
  524.       case _CONFIG:
  525.          user_configuration();
  526.          if (strstr (argument, "/R") != NULL)
  527.             press_enter ();
  528.          break;
  529.       case _USERLIST:
  530.          user_list(argument);
  531.          break;
  532.       case _BULLETIN_MENU:
  533.          bulletin_menu (argument);
  534.          break;
  535.       case _OUTSIDE:
  536.          open_outside_door(argument);
  537.          break;
  538.       case _VERSION:
  539.          software_version (argument);
  540.          break;
  541.       case _QUOTES:
  542.          if (strstr (argument, "/NS") == NULL)
  543.             cls ();
  544.          read_system_file ("APHORISM");
  545.          show_quote();
  546.          if (strstr (argument, "/P") != NULL)
  547.             press_enter ();
  548.          break;
  549.       case _CLEAR_GOTO:
  550.          menu_sp = 0;
  551.          mnu_file = NULL;
  552.          if ((p=strchr (argument, ' ')) != NULL)
  553.             *p = '\0';
  554.          strcpy(mnu_name, argument);
  555.          readed = 0;
  556.          if (strstr (argument, "/NS") == NULL)
  557.             cls ();
  558.          break;
  559.       case _CLEAR_GOSUB:
  560.          menu_sp = 0;
  561.          mnu_file = NULL;
  562.          if (!get_menu_password (cmd[i].argument))
  563.             break;
  564.          if (strstr (argument, "/NS") == NULL)
  565.             cls ();
  566.          gosub_menu (argument);
  567.          break;
  568.       case _MAIN:
  569.          if (!get_menu_password (cmd[i].argument))
  570.             break;
  571.          strcpy(mnu_name, "MAIN");
  572.          readed = 0;
  573.          active = 0;
  574.          if (strstr (argument, "/NS") == NULL)
  575.             cls ();
  576.          show_quote();
  577.          break;
  578.       case _CHG_AREA:
  579.          xp = get_sig (argument);
  580.          do {
  581.             if (strstr (argument, "/R") != NULL) {
  582.                if (strstr (argument, "/2") != NULL)
  583.                   display_area_list(active, 0x81, xp);
  584.                else if (strstr (argument, "/3") != NULL)
  585.                   display_area_list(active, 0x83, xp);
  586.                else if (strstr (argument, "/4") != NULL)
  587.                   display_area_list(active, 0x84, xp);
  588.                else
  589.                   display_area_list(active, 0x82, xp);
  590.             }
  591.             else {
  592.                if (strstr (argument, "/2") != NULL)
  593.                   display_area_list(active, 1, xp);
  594.                else if (strstr (argument, "/3") != NULL)
  595.                   display_area_list(active, 3, xp);
  596.                else if (strstr (argument, "/4") != NULL)
  597.                   display_area_list(active, 4, xp);
  598.                else
  599.                   display_area_list(active, 2, xp);
  600.             }
  601.             if (!CARRIER || time_remain() <= 0)
  602.                break;
  603.  
  604.             s = 0;
  605.             if (active == 1)
  606.                s = read_system(usr.msg, active);
  607.             else if (active == 2)
  608.                s = read_system(usr.files, active);
  609.          } while (!s);
  610.          if (active == 1) {
  611.             if (sys.quick_board || sys.gold_board)
  612.                quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  613.             else if (sys.pip_board)
  614.                pip_scan_message_base (usr.msg, 1);
  615.             else if (sys.squish)
  616.                squish_scan_message_base (usr.msg, sys.msg_path, 1);
  617.             else
  618.                scan_message_base(usr.msg, 1);
  619.             allow_reply = 0;
  620.          }
  621.          first_time = 1;
  622.          break;
  623.       case _MSG_KILL:
  624.          msg_kill();
  625.          break;
  626.       case _GOTO_MENU:
  627.          xp = get_sig (argument);
  628.          if ((p=strstr(argument, "/M")) != NULL) {
  629.             active = 1;
  630.             if (p[2] == '=')
  631.                usr.msg = atoi (p + 3);
  632.             if (!read_system (usr.msg, active)) {
  633.                if (strstr (argument, "/2") != NULL)
  634.                   display_area_list(active, 1, xp);
  635.                else if (strstr (argument, "/3") != NULL)
  636.                   display_area_list(active, 3, xp);
  637.                else if (strstr (argument, "/4") != NULL)
  638.                   display_area_list(active, 4, xp);
  639.                else
  640.                   display_area_list(active, 2, xp);
  641.             }
  642.             else
  643.                status_line(msgtxt[M_BBS_EXIT], usr.msg, sys.msg_name);
  644.             if (sys.quick_board || sys.gold_board)
  645.                quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  646.             else if (sys.pip_board)
  647.                pip_scan_message_base (usr.msg, 1);
  648.             else if (sys.squish)
  649.                squish_scan_message_base (usr.msg, sys.msg_path, 1);
  650.             else
  651.                scan_message_base(usr.msg, 1);
  652.             allow_reply = 0;
  653.          }
  654.          if ((p=strstr(argument, "/F")) != NULL) {
  655.             active = 2;
  656.             if (p[2] == '=')
  657.                usr.files = atoi(p + 3);
  658.             if (!read_system (usr.files, active)) {
  659.                if (strstr (argument, "/2") != NULL)
  660.                   display_area_list(active, 1, xp);
  661.                else if (strstr (argument, "/3") != NULL)
  662.                   display_area_list(active, 3, xp);
  663.                else if (strstr (argument, "/4") != NULL)
  664.                   display_area_list(active, 4, xp);
  665.                else
  666.                   display_area_list(active, 2, xp);
  667.             }
  668.             else
  669.                status_line(msgtxt[M_BBS_SPAWN], usr.files, sys.file_name);
  670.          }
  671.          if ((p=strchr(argument, ' ')) != NULL)
  672.             *p = '\0';
  673.          strcpy(mnu_name, argument);
  674.          readed = 0;
  675.          if (strstr (argument, "/NS") == NULL)
  676.             cls ();
  677.          break;
  678.       case _F_TITLES:
  679.          if (argument[0] != '\0') {
  680.             if ((p = strstr (argument, " ")) != NULL) {
  681.                while (*p == ' ')
  682.                   p++;
  683.                *(p - 1) = '\0';
  684.                file_list (argument, p);
  685.                *(p - 1) = ' ';
  686.             }
  687.             else
  688.                file_list (argument, NULL);
  689.          }
  690.          else if (active == 2)
  691.             file_list(sys.filepath, sys.filelist);
  692.          break;
  693.       case _F_DNLD:
  694.          set_useron_record(UPLDNLD, 0, 0);
  695.          v = 0;
  696.          if (stristr (argument, "/NOREM"))
  697.             v = -2;
  698.          if ((p = stristr (argument, "/F=")) != NULL) {
  699.             strcpy (buf, &p[3]);
  700.             p = strtok (buf, " ");
  701.             translate_filenames (p, 0, NULL);
  702.          }
  703.          else
  704.             p = sys.filepath;
  705.          download_file (p, v);
  706.          break;
  707.       case _F_DISPL:
  708.          file_display();
  709.          break;
  710.       case _F_RAWDIR:
  711.          raw_dir();
  712.          break;
  713.       case _F_KILL:
  714.          file_kill (0, NULL);
  715.          break;
  716.       case _SET_PWD:
  717.          password_change();
  718.          break;
  719.       case _SET_HELP:
  720.          v = select_language ();
  721.          if (v != -1) {
  722.         usr.language = (byte) v;
  723.             free (bbstxt);
  724.             if (!load_language (usr.language)) {
  725.                usr.language = 0;
  726.                load_language (usr.language);
  727.             }
  728.             if (config->language[usr.language].txt_path[0])
  729.                text_path = config->language[usr.language].txt_path;
  730.             else
  731.                text_path = config->language[0].txt_path;
  732.             readed = 0;
  733.          }
  734.          break;
  735.       case _SET_NULLS:
  736.          nulls_change();
  737.          break;
  738.       case _SET_LEN:
  739.          screen_change();
  740.          break;
  741.       case _SET_TABS:
  742.          tabs_change();
  743.          break;
  744.       case _SET_MORE:
  745.          more_change();
  746.          break;
  747.       case _SET_CLS:
  748.          formfeed_change();
  749.          break;
  750.       case _SET_EDIT:
  751.          fullscreen_change();
  752.          break;
  753.       case _SET_CITY:
  754.          city_change ();
  755.          break;
  756.       case _SET_SCANMAIL:
  757.          scanmail_change ();
  758.          break;
  759.       case _SET_AVATAR:
  760.          avatar_change ();
  761.          break;
  762.       case _SET_ANSI:
  763.          ansi_change ();
  764.          break;
  765.       case _SET_COLOR:
  766.          color_change ();
  767.          break;
  768.       case _MSG_EDIT_NEW:
  769.          s = active;
  770.          active = 1;
  771.          lo = 0;
  772.          if (strstr (argument, "/L"))
  773.             lo = 1;
  774.          set_useron_record (READWRITE, 0, 0);
  775.          if ((gg = get_message_data (0, argument)) == 1) {
  776.             if (usr.use_lore) {
  777.                line_editor (0);
  778.                gosub_menu (argument);
  779.             }
  780.             else {
  781.                if (external_editor (0))
  782.                   if (lo) {
  783.                      logoff_procedure ();
  784.                      return (1);
  785.                   }
  786.                active = s;
  787.             }
  788.          }
  789.          else {
  790.             if (gg == 0)
  791.                m_print(bbstxt[B_LORE_MSG3]);
  792.  
  793.             active = s;
  794.          }
  795.          break;
  796.       case _MSG_EDIT_REPLY:
  797.          if (!allow_reply)
  798.             break;
  799.  
  800.          s = active;
  801.          active = 1;
  802.          set_useron_record (READWRITE, 0, 0);
  803.  
  804.          if ((gg = get_message_data (lastread, argument)) == 1) {
  805.             if (usr.use_lore) {
  806.                line_editor(0);
  807.                gosub_menu (argument);
  808.             }
  809.             else {
  810.                external_editor (1);
  811.                active = s;
  812.             }
  813.          }
  814.          else {
  815.             if (gg == 0)
  816.                m_print (bbstxt[B_LORE_MSG3]);
  817.  
  818.             active = s;
  819.          }
  820.          break;
  821.       case _ED_SAVE:
  822.             if (sys.quick_board||sys.gold_board)
  823.                 quick_save_message(NULL);
  824.          else if (sys.pip_board)
  825.             pip_save_message(NULL);
  826.          else if (sys.squish)
  827.             squish_save_message(NULL);
  828.          else
  829.             save_message(NULL);
  830.  
  831.          usr.msgposted++;
  832.  
  833.          if (lo) {
  834.             free_message_array();
  835.             logoff_procedure ();
  836.             return (1);
  837.          }
  838.  
  839.          if (strstr(argument, "/RET")) {
  840.             active = s;
  841.             free_message_array();
  842.             return_menu();
  843.          }
  844.          break;
  845.       case _ED_ABORT:
  846.          change_attr (LRED|_BLACK);
  847.          m_print(bbstxt[B_LORE_MSG3]);
  848.          free_message_array();
  849.          active = s;
  850.          return_menu();
  851.          break;
  852.       case _ED_LIST:
  853.          edit_list();
  854.          break;
  855.       case _ED_CHG:
  856.          edit_line();
  857.          break;
  858.       case _ED_INSERT:
  859.          edit_insert();
  860.          break;
  861.       case _ED_DEL:
  862.          edit_delete();
  863.          break;
  864.       case _ED_CONT:
  865.          edit_continue();
  866.          break;
  867.       case _ED_TO:
  868.          edit_change_to();
  869.          break;
  870.       case _ED_SUBJ:
  871.          edit_change_subject();
  872.          break;
  873.       case _PRESS_ENTER:
  874.          if (argument[0]) {
  875.             m_print (argument);
  876.             input(filename,2);
  877.          }
  878.          else
  879.             press_enter ();
  880.          break;
  881.       case _CHG_AREA_NAME:
  882.          xp = get_sig (argument);
  883.          do {
  884.             display_area_list(active, 3, xp);
  885.             if (!CARRIER || time_remain() <= 0)
  886.                break;
  887.  
  888.             s = 0;
  889.             if (active == 1)
  890.                s = read_system( usr.msg, active);
  891.             else if (active == 2)
  892.                s = read_system(usr.files, active);
  893.          } while (!s);
  894.          if (active == 1) {
  895.             if (sys.quick_board || sys.gold_board)
  896.                quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  897.             else if (sys.pip_board)
  898.                pip_scan_message_base (usr.msg, 1);
  899.             else if (sys.squish)
  900.                squish_scan_message_base (usr.msg, sys.msg_path, 1);
  901.             else
  902.                scan_message_base(usr.msg, 1);
  903.             allow_reply = 0;
  904.          }
  905.          first_time = 1;
  906.          break;
  907.       case _MSG_LIST:
  908.          list_headers (0);
  909.          break;
  910.       case _MSG_VERBOSE:
  911.          list_headers (1);
  912.          break;
  913.       case _MSG_NEXT:
  914.          read_forward(lastread,0);
  915.          break;
  916.       case _MSG_PRIOR:
  917.          read_backward(lastread);
  918.          break;
  919.       case _MSG_NONSTOP:
  920.          read_nonstop();
  921.          break;
  922.         case _MSG_PARENT:
  923.             read_parent ();
  924.             break;
  925.         case _MSG_CHILD:
  926.             read_reply ();
  927.             break;
  928.         case _MSG_SCAN:
  929.             if (scan_mailbox())
  930.             {
  931.                 v = active;
  932.                 active = 4;
  933.                 i = -1;
  934.                 mail_read_forward (0);
  935.                 allow_reply = 1;
  936.                 gosub_menu ("READMAIL");
  937.             }
  938.             break;
  939.         case _MSG_INQ:
  940.             message_inquire ();
  941.          break;
  942.       case _GOSUB_MENU:
  943.          if (!get_menu_password (cmd[i].argument))
  944.             break;
  945.          xp = get_sig (argument);
  946.          if ((p=strstr(argument, "/M")) != NULL) {
  947.             active = 1;
  948.             if (p[2] == '=')
  949.                usr.msg = atoi(p + 3);
  950.             if (!read_system(usr.msg, active))
  951.                display_area_list(active, 1, xp);
  952.             else
  953.                status_line(msgtxt[M_BBS_EXIT], usr.msg, sys.msg_name);
  954.             if (sys.quick_board || sys.gold_board)
  955.                quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  956.             else if (sys.pip_board)
  957.                pip_scan_message_base (usr.msg, 1);
  958.             else if (sys.squish)
  959.                squish_scan_message_base (usr.msg, sys.msg_path, 1);
  960.             else
  961.                scan_message_base(usr.msg, 1);
  962.             allow_reply = 0;
  963.          }
  964.          if ((p=strstr(argument, "/F")) != NULL) {
  965.             active = 2;
  966.             if (p[2] == '=')
  967.                usr.files = atoi(p + 3);
  968.             if (!read_system (usr.files, active))
  969.                display_area_list(active, 1, xp);
  970.             else
  971.                status_line(msgtxt[M_BBS_SPAWN], usr.files, sys.file_name);
  972.          }
  973.          if (strstr (argument, "/NS") == NULL)
  974.             cls ();
  975.          gosub_menu (argument);
  976.          break;
  977.       case _FILE_HURL:
  978.          hurl ();
  979.          break;
  980.       case _MSG_INDIVIDUAL:
  981.          if ((p = strchr (cmd_string, ' ')) != NULL)
  982.             *p = '\0';
  983.          read_forward(atoi(cmd_string) - 1, 0);
  984.          if (p != NULL)
  985.          {
  986.             *p = ' ';
  987.             strcpy (cmd_string, p);
  988.          }
  989.          else
  990.             cmd_string[0] = '\0';
  991.          break;
  992.       case _F_TAG:
  993.          tag_files (0);
  994.          break;
  995.       case _RETURN_MENU:
  996.          if (st != NULL)
  997.             return (1);
  998.  
  999.          return_menu();
  1000.  
  1001.          if (active == 4) {
  1002.             active = v;
  1003.  
  1004.             if (active == 1) {
  1005.                read_system(usr.msg, active);
  1006.                if (sys.quick_board || sys.gold_board)
  1007.                   quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  1008.                else if (sys.pip_board)
  1009.                   pip_scan_message_base (usr.msg, 1);
  1010.                else if (sys.squish)
  1011.                   squish_scan_message_base (usr.msg, sys.msg_path, 1);
  1012.                else
  1013.                   scan_message_base(usr.msg, 1);
  1014.                allow_reply = 0;
  1015.             }
  1016.          }
  1017.          if (strstr (argument, "/NS") == NULL)
  1018.             cls ();
  1019.          break;
  1020.       case _MENU_CLEAR:
  1021.          menu_sp = 0;
  1022.          mnu_file = 0;
  1023.          break;
  1024.       case _F_LOCATE:
  1025.          if (strstr (argument, "/F"))
  1026.             locate_files (1);
  1027.          else
  1028.             locate_files (0);
  1029.          break;
  1030.       case _F_UPLD:
  1031.          set_useron_record (UPLDNLD, 0, 0);
  1032.  
  1033.          strcpy (buf, argument);
  1034.          strupr (buf);
  1035.  
  1036.          // Se e' presente il /C effettua prima il controllo sui file
  1037.          // mandati, altrimenti lo esegue dopo.
  1038.          if (strstr (buf, "/C") == NULL && strstr (buf, "/c") == NULL)
  1039.             no_precheck = 1;
  1040.          else
  1041.             no_precheck = 0;
  1042.  
  1043.          // /F= definisce il nome del file da mandare (o la directory in cui
  1044.          // far finire gli upload.
  1045.          if ((p = strstr (buf, "/F=")) != NULL) {
  1046.             p = strtok (&p[3], " ");
  1047.             upload_file (p, 0);
  1048.          }
  1049.          else
  1050.             upload_file (sys.uppath, 0);
  1051.  
  1052.          no_precheck = 0;
  1053.          break;
  1054.       case _SET_SIGN:
  1055.          signature_change();
  1056.          break;
  1057.       case _MAKE_LOG:
  1058.          status_line (argument);
  1059.          break;
  1060.       case _F_OVERRIDE:
  1061.          override_path ();
  1062.          break;
  1063.       case _F_NEW:
  1064.          if (strstr (argument, "/F"))
  1065.             new_file_list (1);
  1066.          else
  1067.             new_file_list (0);
  1068.          break;
  1069.       case _MAIL_NEXT:
  1070.          mail_read_forward(0);
  1071.          break;
  1072.       case _MAIL_PRIOR:
  1073.          mail_read_backward(0);
  1074.          break;
  1075.       case _MAIL_NONSTOP:
  1076.          mail_read_nonstop ();
  1077.          break;
  1078.       case _SET_FULLREAD:
  1079.          fullread_change();
  1080.          break;
  1081.       case _ONLINE_MESSAGE:
  1082.          if (stristr (argument, "/H"))
  1083.             send_online_message (1);
  1084.          else
  1085.             send_online_message (0);
  1086.          break;
  1087.       case _MAIL_END:
  1088.          if (st != NULL)
  1089.             return (1);
  1090.  
  1091.          return_menu();
  1092.  
  1093.          if (old_activ) {
  1094.             active = old_activ;
  1095.             if (active == 1)
  1096.                read_system(usr.msg, active);
  1097.             old_activ = 0;
  1098.          }
  1099.          break;
  1100.       case _CHG_AREA_LONG:
  1101.          xp = get_sig (argument);
  1102.          do {
  1103.             display_area_list(active, 2, xp);
  1104.             if (!CARRIER || time_remain() <= 0)
  1105.                break;
  1106.  
  1107.             s = 0;
  1108.             if (active == 1)
  1109.                s = read_system( usr.msg, active);
  1110.             else if (active == 2)
  1111.                s = read_system(usr.files, active);
  1112.          } while (!s);
  1113.          if (active == 1) {
  1114.             if (sys.quick_board || sys.gold_board)
  1115.                quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  1116.             else if (sys.pip_board)
  1117.                pip_scan_message_base (usr.msg, 1);
  1118.             else if (sys.squish)
  1119.                squish_scan_message_base (usr.msg, sys.msg_path, 1);
  1120.             else
  1121.                scan_message_base(usr.msg, 1);
  1122.             allow_reply = 0;
  1123.          }
  1124.          first_time = 1;
  1125.          break;
  1126.       case _ONLINE_USERS:
  1127.          if (stristr (argument, "/H") != NULL)
  1128.             online_users (1, 1);
  1129.          else
  1130.             online_users (1, 0);
  1131.          break;
  1132.       case _MAIL_LIST:
  1133.          if (active == 4)
  1134.             mail_list ();
  1135.          break;
  1136.       case _WRITE_NEXT_CALLER:
  1137.          message_to_next_caller ();
  1138.          break;
  1139.       case _F_GLOBAL_DNLD:
  1140.          set_useron_record(UPLDNLD, 0, 0);
  1141.          v = 1;
  1142.          if (stristr (argument, "/NOREM"))
  1143.             v = -3;
  1144.          if ((p = stristr (argument, "/F=")) != NULL) {
  1145.             strcpy (buf, &p[3]);
  1146.             p = strtok (buf, " ");
  1147.             translate_filenames (p, 0, NULL);
  1148.          }
  1149.          else
  1150.             p = sys.filepath;
  1151.          download_file (p, v);
  1152.          break;
  1153.       case _MAIL_INDIVIDUAL:
  1154.          if ((p = strchr (cmd_string, ' ')) != NULL)
  1155.             *p = '\0';
  1156.          last_mail = atoi(cmd_string) - 1;
  1157.          mail_read_forward(0);
  1158.          if (p != NULL)
  1159.          {
  1160.             *p = ' ';
  1161.             strcpy (cmd_string, p);
  1162.          }
  1163.          else
  1164.             cmd_string[0] = '\0';
  1165.          break;
  1166.       case _DRAW_WINDOW:
  1167.          time_statistics ();
  1168.          break;
  1169.       case _CHAT_WHOIS:
  1170.          cb_who_is_where (1);
  1171.          break;
  1172.       case _CB_CHAT:
  1173.          cb_chat();
  1174.          break;
  1175.       case _SHOW_TEXT:
  1176.          if (stristr (argument, "/NS") == NULL)
  1177.             cls ();
  1178.          read_system_file (argument);
  1179.          if (stristr (argument, "/P") != NULL)
  1180.             press_enter ();
  1181.          break;
  1182.       case _LASTCALLERS:
  1183.          show_lastcallers(argument);
  1184.          break;
  1185.       case _SET_HANDLE:
  1186.          handle_change ();
  1187.          break;
  1188.       case _SET_VOICE:
  1189.          voice_phone_change ();
  1190.          break;
  1191.       case _SET_DATA:
  1192.          data_phone_change ();
  1193.          break;
  1194.       case _F_CONTENTS:
  1195.          display_contents ();
  1196.          break;
  1197.       case _COUNTER:
  1198.          if ((p=strstr(argument, "/C=")) != NULL)
  1199.          {
  1200.             gg = atoi(p + 3);
  1201.             if (gg < 0 || gg >= MAXCOUNTER)
  1202.                break;
  1203.             if ((p=strstr(argument, "/I=")) != NULL)
  1204.                usr.counter[gg] += atoi (p + 3);
  1205.             if ((p=strstr(argument, "/D=")) != NULL)
  1206.                usr.counter[gg] -= atoi (p + 3);
  1207.             if ((p=strstr(argument, "/R=")) != NULL)
  1208.                usr.counter[gg] = atoi (p + 3);
  1209.          }
  1210.          break;
  1211.       case _MSG_TAG:
  1212.          xp = get_sig (argument);
  1213.  
  1214.          if (strstr (argument, "/2") != NULL)
  1215.             tag_area_list (1, xp);
  1216.          else if (strstr (argument, "/3") != NULL)
  1217.             tag_area_list (3, xp);
  1218.          else if (strstr (argument, "/4") != NULL)
  1219.             tag_area_list (4, xp);
  1220.          else
  1221.             tag_area_list (2, xp);
  1222.          break;
  1223.       case _ASCII_DOWNLOAD:
  1224.          offline_pack_tagged_areas (0);
  1225.          break;
  1226.       case _RESUME_DOWNLOAD:
  1227.          resume_transmission ();
  1228.          break;
  1229.       case _USAGE:
  1230.          display_usage ();
  1231.          break;
  1232.       case _BANK_ACCOUNT:
  1233.          show_account ();
  1234.          break;
  1235.       case _BANK_DEPOSIT:
  1236.             deposit_time ();
  1237.          break;
  1238.       case _BANK_WITHDRAW:
  1239.          withdraw_time ();
  1240.          break;
  1241.       case _BANK_KDEPOSIT:
  1242.          deposit_kbytes ();
  1243.          break;
  1244.       case _BANK_KWITHDRAW:
  1245.          withdraw_kbytes ();
  1246.          break;
  1247.       case _SET_HOTKEY:
  1248.          hotkey_change ();
  1249.          break;
  1250.       case _BBSLIST_ADD:
  1251.          if ((p = strstr (argument, "/L=")) != NULL)
  1252.             bbs_add_list (atoi (&p[3]));
  1253.          else
  1254.             bbs_add_list (0);
  1255.          break;
  1256.       case _BBSLIST_SHORT:
  1257.          if ((p = strstr (argument, "/L=")) != NULL)
  1258.             bbs_short_list (atoi (&p[3]));
  1259.          else
  1260.             bbs_short_list (0);
  1261.          break;
  1262.       case _BBSLIST_LONG:
  1263.          if ((p = strstr (argument, "/L=")) != NULL)
  1264.             bbs_long_list (atoi (&p[3]));
  1265.          else
  1266.             bbs_long_list (0);
  1267.          break;
  1268.       case _BBSLIST_CHANGE:
  1269.          if (strstr (argument, "/R") != NULL)
  1270.             xp = 1;
  1271.          else
  1272.             xp = 0;
  1273.          if ((p = strstr (argument, "/L=")) != NULL)
  1274.             bbs_change (atoi (&p[3]), xp);
  1275.          else
  1276.             bbs_change (0, xp);
  1277.          break;
  1278.       case _BBSLIST_REMOVE:
  1279.          if (strstr (argument, "/R") != NULL)
  1280.             xp = 1;
  1281.          else
  1282.             xp = 0;
  1283.          if ((p = strstr (argument, "/L=")) != NULL)
  1284.             bbs_remove (atoi (&p[3]), xp);
  1285.          else
  1286.             bbs_remove (0, xp);
  1287.          break;
  1288.       case _QWK_DOWNLOAD:
  1289.          qwk_pack_tagged_areas ();
  1290.          break;
  1291.       case _QWK_UPLOAD:
  1292.          getrep ();
  1293.          break;
  1294. //      case _VOTE_USER:
  1295. //         if ((p=strstr(argument, "/V=")) != NULL) {
  1296. //            xp = atoi(p + 3);
  1297. //            if (xp != 0)
  1298. //               vote_user (xp);
  1299. //         }
  1300. //         break;
  1301.       case 117:
  1302.          ibmset_change ();
  1303.          break;
  1304.       case 118:
  1305.          if (!get_menu_password (argument))
  1306.             break;
  1307.          xp = get_sig (argument);
  1308.          display_new_area_list (xp);
  1309.          if (sys.quick_board || sys.gold_board)
  1310.              quick_scan_message_base (sys.quick_board, sys.gold_board, usr.msg, 1);
  1311.          else if (sys.pip_board)
  1312.             pip_scan_message_base (usr.msg, 1);
  1313.          else if (sys.squish)
  1314.             squish_scan_message_base (usr.msg, sys.msg_path, 1);
  1315.          else
  1316.             scan_message_base(usr.msg, 1);
  1317.          allow_reply = 0;
  1318.          break;
  1319.       case 119:
  1320.          xport_message ();
  1321.          break;
  1322.       case 120:
  1323.          if ((p=strchr(argument,'/')) != NULL && isdigit(*(p + 1)))
  1324.             bbs_list_download (atoi (p + 1));
  1325.          else
  1326.             bbs_list_download (0);
  1327.          break;
  1328.       case 121:
  1329.          if ((p=strstr(argument, "/G=")) != NULL)
  1330.             xp = atoi (&p[3]);
  1331.          else
  1332.             xp = -1;
  1333.  
  1334.          if (strstr(argument, "/M") != NULL)
  1335.             select_group (1, xp);
  1336.          else if (strstr(argument, "/F") != NULL)
  1337.             select_group (2, xp);
  1338.          else
  1339.             select_group (0, xp);
  1340.          break;
  1341.       case 122:
  1342.          upload_filebox ();
  1343.          break;
  1344.       case 123:
  1345.          download_filebox (1);
  1346.          break;
  1347.       case 124:
  1348.          ask_birthdate ();
  1349.          break;
  1350.       case 125:
  1351.          ask_default_protocol ();
  1352.          break;
  1353.       case 126:
  1354.          ask_default_archiver ();
  1355.          break;
  1356.       case _FBOX_KILL:
  1357.          file_kill (1, NULL);
  1358.          break;
  1359.       case _FBOX_LIST:
  1360.          download_filebox (0);
  1361.          break;
  1362.       case 129:
  1363.          if (stristr (argument, "/R") != NULL)
  1364.             list_tagged_files (1);
  1365.          else
  1366.             list_tagged_files (0);
  1367.          break;
  1368.       case 130:
  1369.          kludge_change ();
  1370.          break;
  1371.       case 131:
  1372.          offline_pack_tagged_areas (1);
  1373.          break;
  1374.       case _MSG_FORWARD:
  1375.          xp = get_sig (argument);
  1376.          if (strstr (argument, "/2") != NULL)
  1377.             forward_message_area (xp, 1);
  1378.          else if (strstr (argument, "/3") != NULL)
  1379.             forward_message_area (xp, 3);
  1380.          else if (strstr (argument, "/4") != NULL)
  1381.             forward_message_area (xp, 4);
  1382.          else
  1383.             forward_message_area (xp, 2);
  1384.          break;
  1385.    }
  1386.    return (0);
  1387. }
  1388.  
  1389. static void return_menu()
  1390. {
  1391.    if (menu_sp) {
  1392.       menu_sp--;
  1393.       strcpy (mnu_name, menu_stack[menu_sp]);
  1394.       if (file_stack[menu_sp][0] == '\0')
  1395.          mnu_file = NULL;
  1396.       else
  1397.          mnu_file = file_stack[menu_sp];
  1398.       i = -1;
  1399.       readed = 0;
  1400.    }
  1401. }
  1402.  
  1403. static void gosub_menu (char *m)
  1404. {
  1405.    char *p, *v;
  1406.  
  1407.    if (menu_sp < MENU_STACK) {
  1408.       strcpy (menu_stack[menu_sp], mnu_name);
  1409.       if (mnu_file == NULL)
  1410.          file_stack[menu_sp][0] = '\0';
  1411.       else
  1412.          strcpy (file_stack[menu_sp], mnu_file);
  1413.       menu_sp++;
  1414.  
  1415.       if ((p = stristr (m, "/L=")) != NULL) {
  1416.          if ((v = strchr (p, ' ')) == NULL)
  1417.             v = p;
  1418.          else
  1419.             *v = '\0';
  1420.          strcpy (file_stack[menu_sp], v);
  1421.          if (v != p)
  1422.             *v = ' ';
  1423.          mnu_file = file_stack[menu_sp];
  1424.       }
  1425.       else {
  1426.          if (mnu_file == NULL)
  1427.             file_stack[menu_sp][0] = '\0';
  1428.          else
  1429.             strcpy (file_stack[menu_sp], mnu_file);
  1430.       }
  1431.  
  1432.       if ((p = strchr (m, ' ')) == NULL)
  1433.          p = m;
  1434.       else
  1435.          *p = '\0';
  1436.  
  1437.       strcpy (mnu_name, m);
  1438.       readed = 0;
  1439.  
  1440.       if (p != m)
  1441.          *p = ' ';
  1442.    }
  1443. }
  1444.  
  1445. static void process_user_display (st, item)
  1446. char *st;
  1447. int item;
  1448. {
  1449.    int m, first, i, fd;
  1450.    char ext[256], buffer[50], *p, parola[36];
  1451.    long tempo;
  1452.    struct tm *tim;
  1453.  
  1454.    m = 0;
  1455.    ext[0] = '\0';
  1456.    first = 1;
  1457.  
  1458.    for (p=st; *p; p++)
  1459.       switch (*p) {
  1460.       case '^':
  1461.          if (first)
  1462.             sprintf(buffer,"%c", cmd[item].first_color);
  1463.          else
  1464.             sprintf(buffer,"%c", cmd[item].color);
  1465.          strcat(ext, buffer);
  1466.          m += strlen(buffer);
  1467.          first = first ? 0 : 1;
  1468.          break;
  1469.       case '~':
  1470.          sprintf(buffer,"%d", time_remain());
  1471.          strcat(ext, buffer);
  1472.          m += strlen(buffer);
  1473.          break;
  1474.       case CTRLF:
  1475.          p++;
  1476.          switch(*p) {
  1477.             case '"':
  1478.                for (i = 0; i < 10; i++) {
  1479.                   if (config->packid[i].display[0] == usr.archiver)
  1480.                      break;
  1481.                }
  1482.                if (i < 10)
  1483.                   sprintf (buffer, "%s", &config->packid[i].display[1]);
  1484.                else
  1485.                   sprintf (buffer, "%s", &bbstxt[B_NONE][1]);
  1486.                strcat (ext, buffer);
  1487.                m += strlen (buffer);
  1488.                break;
  1489.             case '%':
  1490.                if (usr.protocol == protocols[0][0])
  1491.                   sprintf (buffer, "%s", &protocols[0][1]);
  1492.                else if (usr.protocol == protocols[1][0])
  1493.                   sprintf (buffer, "%s", &protocols[1][1]);
  1494.                else if (usr.protocol == protocols[2][0])
  1495.                   sprintf (buffer, "%s", &protocols[2][1]);
  1496.                else if (usr.protocol == protocols[5][0])
  1497.                   sprintf (buffer, "%s", &protocols[5][1]);
  1498.                else if (config->hslink && usr.protocol == protocols[3][0])
  1499.                   sprintf (buffer, "%s", &protocols[3][1]);
  1500.                else if (config->puma && usr.protocol == protocols[4][0])
  1501.                   sprintf (buffer, "%s", &protocols[4][1]);
  1502.                else {
  1503.                   PROTOCOL prot;
  1504.  
  1505.                   sprintf (buffer, "%sPROTOCOL.DAT", config->sys_path);
  1506.                   fd = sh_open (buffer, O_RDONLY|O_BINARY, SH_DENYWR, S_IREAD|S_IWRITE);
  1507.                   buffer[0] = '\0';
  1508.                   if (fd != -1) {
  1509.                      while (read (fd, &prot, sizeof (PROTOCOL)) == sizeof (PROTOCOL)) {
  1510.                         if (prot.active && prot.hotkey == usr.protocol) {
  1511.                            sprintf (buffer, "%s", prot.name);
  1512.                            break;
  1513.                         }
  1514.                      }
  1515.                      close (fd);
  1516.                   }
  1517.                   if (fd == -1 || !prot.active || prot.hotkey != usr.protocol)
  1518.                      sprintf (buffer, "%s", &protocols[B_NONE][1]);
  1519.                }
  1520.                strcat (ext, buffer);
  1521.                m += strlen (buffer);
  1522.                break;
  1523.             case 'C':
  1524.                if (cps) {
  1525.                   sprintf (buffer, "%ld", cps);
  1526.                   strcat(ext, buffer);
  1527.                   m += strlen(buffer);
  1528.                }
  1529.                break;
  1530.             case 'D':
  1531.                sprintf (buffer, "%s",usr.dataphone);
  1532.                strcat(ext, buffer);
  1533.                m += strlen(buffer);
  1534.                break;
  1535.             case 'E':
  1536.                sprintf (buffer, "%s",usr.voicephone);
  1537.                strcat(ext, buffer);
  1538.                m += strlen(buffer);
  1539.                break;
  1540.             case 'F':
  1541.                usr.ldate[9] = '\0';
  1542.                sprintf (buffer, "%s", usr.ldate);
  1543.                usr.ldate[9] = ' ';
  1544.                strcat(ext, buffer);
  1545.                m += strlen(buffer);
  1546.                break;
  1547.             case 'G':
  1548.                sprintf (buffer, "%s",&usr.ldate[11]);
  1549.                strcat(ext, buffer);
  1550.                m += strlen(buffer);
  1551.                break;
  1552.             case 'H':
  1553.                if (cps) {
  1554.                   sprintf (buffer, "%ld", (cps * 100) / (rate / 10));
  1555.                   strcat(ext, buffer);
  1556.                   m += strlen(buffer);
  1557.                }
  1558.                break;
  1559.             case 'I':
  1560.                sprintf (buffer, "%s",usr.ibmset ? bbstxt[B_YES] : bbstxt[B_NO]);
  1561.                strcat(ext, buffer);
  1562.                m += strlen(buffer);
  1563.                break;
  1564.             case 'L':
  1565.                sprintf (buffer, "%d", usr.credit);
  1566.                strcat(ext, buffer);
  1567.                m += strlen(buffer);
  1568.                break;
  1569.             case 'M':
  1570.                sprintf (buffer, "%d", last_mail);
  1571.                strcat(ext, buffer);
  1572.                m += strlen(buffer);
  1573.                break;
  1574.             case 'N':
  1575.                sprintf (buffer, "%d", lastread);
  1576.                strcat(ext, buffer);
  1577.                m += strlen(buffer);
  1578.                break;
  1579.             case 'O':
  1580.                sprintf (buffer, "%s", get_priv_text(usr.priv));
  1581.                strcat(ext, buffer);
  1582.                m += strlen(buffer);
  1583.                break;
  1584.             case 'Q':
  1585.                sprintf (buffer, "%u", usr.n_upld);
  1586.                strcat(ext, buffer);
  1587.                m += strlen(buffer);
  1588.                break;
  1589.             case 'R':
  1590.                sprintf (buffer, "%lu", usr.upld);
  1591.                strcat(ext, buffer);
  1592.                m += strlen(buffer);
  1593.                break;
  1594.             case 'S':
  1595.                sprintf (buffer, "%u", usr.n_dnld);
  1596.                strcat(ext, buffer);
  1597.                m += strlen(buffer);
  1598.                break;
  1599.             case 'T':
  1600.                sprintf (buffer, "%lu", usr.dnld);
  1601.                strcat(ext, buffer);
  1602.                m += strlen(buffer);
  1603.                strcat(ext, buffer);
  1604.                m += strlen(buffer);
  1605.                break;
  1606.             case 'V':
  1607.                sprintf (buffer, "%d", usr.len);
  1608.                strcat(ext, buffer);
  1609.                m += strlen(buffer);
  1610.                break;
  1611.             case 'X':
  1612.                sprintf (buffer, "%s",usr.ansi ? bbstxt[B_YES] : bbstxt[B_NO]);
  1613.                strcat(ext, buffer);
  1614.                m += strlen(buffer);
  1615.                break;
  1616.             case 'Y':
  1617.                sprintf (buffer, "%s",usr.more ? bbstxt[B_YES] : bbstxt[B_NO]);
  1618.                strcat(ext, buffer);
  1619.                m += strlen(buffer);
  1620.                break;
  1621.             case 'Z':
  1622.                sprintf (buffer, "%s",usr.formfeed ? bbstxt[B_YES] : bbstxt[B_NO]);
  1623.                strcat(ext, buffer);
  1624.                m += strlen(buffer);
  1625.                break;
  1626.             case '0':
  1627.                sprintf (buffer, "%s",usr.use_lore ? bbstxt[B_NO] : bbstxt[B_YES]);
  1628.                strcat(ext, buffer);
  1629.                m += strlen(buffer);
  1630.                break;
  1631.             case '2':
  1632.                sprintf (buffer, "%d", get_user_age ());
  1633.                strcat(ext, buffer);
  1634.                m += strlen(buffer);
  1635.                break;
  1636.             case '3':
  1637.                sprintf (buffer, "%s",usr.hotkey ? bbstxt[B_YES] : bbstxt[B_NO]);
  1638.                strcat(ext, buffer);
  1639.                m += strlen(buffer);
  1640.                break;
  1641.             case '4':
  1642.                sprintf (buffer, "%s",usr.firstdate);
  1643.                strcat(ext, buffer);
  1644.                m += strlen(buffer);
  1645.                break;
  1646.             case '5':
  1647.                sprintf (buffer, "%s",usr.birthdate);
  1648.                strcat(ext, buffer);
  1649.                m += strlen(buffer);
  1650.                break;
  1651.             case '6':
  1652.                sprintf (buffer, "%s",usr.scanmail ? bbstxt[B_YES] : bbstxt[B_NO]);
  1653.                strcat(ext, buffer);
  1654.                m += strlen(buffer);
  1655.                break;
  1656.             case '7':
  1657.                sprintf (buffer, "%s",usr.subscrdate);
  1658.                strcat(ext, buffer);
  1659.                m += strlen(buffer);
  1660.                break;
  1661.             case '8':
  1662.                sprintf (buffer, "%s",usr.avatar ? bbstxt[B_YES] : bbstxt[B_NO]);
  1663.                strcat(ext, buffer);
  1664.                m += strlen(buffer);
  1665.                break;
  1666.             case '!':
  1667.                sprintf (buffer, "%s",usr.color ? bbstxt[B_YES] : bbstxt[B_NO]);
  1668.                strcat(ext, buffer);
  1669.                m += strlen(buffer);
  1670.                break;
  1671.             case CTRLA:
  1672.                show_quote();
  1673.                break;
  1674.             case 'A':
  1675.             case CTRLB:
  1676.                sprintf (buffer, "%s", usr.name);
  1677.                strcat(ext, buffer);
  1678.                m += strlen(buffer);
  1679.                break;
  1680.             case 'B':
  1681.             case CTRLC:
  1682.                sprintf (buffer, "%s", usr.city);
  1683.                strcat(ext, buffer);
  1684.                m += strlen(buffer);
  1685.                break;
  1686.             case CTRLD:
  1687.                data(parola);
  1688.                buffer[9] = '\0';
  1689.                sprintf (buffer, "%s", parola);
  1690.                strcat(ext, buffer);
  1691.                m += strlen(buffer);
  1692.                break;
  1693.             case 'P':
  1694.             case CTRLE:
  1695.                sprintf (buffer, "%ld",usr.times);
  1696.                strcat(ext, buffer);
  1697.                m += strlen(buffer);
  1698.                break;
  1699.             case 'W':
  1700.             case CTRLF:
  1701.                strcpy(buffer,usr.name);
  1702.                get_fancy_string(buffer, parola);
  1703.                strcat(ext, parola);
  1704.                m += strlen(parola);
  1705.                break;
  1706.             case CTRLG:
  1707.                timer(10);
  1708.                break;
  1709.             case CTRLK:
  1710.                m = (int)((time(NULL)-start_time)/60);
  1711.                m += usr.time;
  1712.                sprintf (buffer, "%d",m);
  1713.                strcat(ext, buffer);
  1714.                m += strlen(buffer);
  1715.                break;
  1716.             case 'U':
  1717.             case CTRLL:
  1718.                m = (int)((time(0)-start_time)/60);
  1719.                sprintf (buffer, "%d",m);
  1720.                strcat(ext, buffer);
  1721.                m += strlen(buffer);
  1722.                break;
  1723.             case CTRLO:
  1724.                sprintf (buffer, "%d",time_remain());
  1725.                strcat(ext, buffer);
  1726.                m += strlen(buffer);
  1727.                break;
  1728.             case CTRLP:
  1729.                sprintf (buffer, "%s",ctime(&start_time));
  1730.                strcat(ext, buffer);
  1731.                m += strlen(buffer);
  1732.                break;
  1733.             case CTRLQ:
  1734.                sprintf (buffer, "%lu",sysinfo.total_calls);
  1735.                strcat(ext, buffer);
  1736.                m += strlen(buffer);
  1737.                break;
  1738.             case CTRLR:
  1739.                sprintf (buffer, "%lu",usr.dnld-usr.upld);
  1740.                strcat(ext, buffer);
  1741.                m += strlen(buffer);
  1742.                break;
  1743.             case CTRLS:
  1744.                strcat(ext, usr.signature);
  1745.                m += strlen(usr.signature);
  1746.                break;
  1747.             case CTRLT:
  1748.                data(buffer);
  1749.                strcpy (buffer, &buffer[10]);
  1750.                strcat(ext, buffer);
  1751.                m += strlen(buffer);
  1752.                break;
  1753.             case CTRLW:
  1754.                sprintf (buffer, "%lu", usr.upld);
  1755.                strcat(ext, buffer);
  1756.                m += strlen(buffer);
  1757.                break;
  1758.             case CTRLX:
  1759.                sprintf (buffer, "%lu",usr.dnld);
  1760.                strcat(ext, buffer);
  1761.                m += strlen(buffer);
  1762.                break;
  1763.             case '9':
  1764.                if (usr.n_upld == 0)
  1765.                   sprintf (buffer, "0:%u", usr.n_dnld);
  1766.                else {
  1767.                   m = (unsigned int)(usr.n_dnld / usr.n_upld);
  1768.                   sprintf (buffer, "1:%u", m);
  1769.                }
  1770.                strcat(ext, buffer);
  1771.                m += strlen(buffer);
  1772.                break;
  1773.             case CTRLY:
  1774.             case ':':
  1775.                if (usr.upld == 0)
  1776.                   sprintf (buffer, "0:%lu", usr.dnld);
  1777.                else {
  1778.                   m = (unsigned int)(usr.dnld / usr.upld);
  1779.                   sprintf (buffer, "1:%u", m);
  1780.                }
  1781.                strcat(ext, buffer);
  1782.                m += strlen(buffer);
  1783.                break;
  1784.             case ';':
  1785.                sprintf (buffer, "%s",usr.full_read ? bbstxt[B_YES] : bbstxt[B_NO]);
  1786.                strcat(ext, buffer);
  1787.                m += strlen(buffer);
  1788.                break;
  1789.             case '[':
  1790.                sprintf (buffer, "%lu", config->class[usr_class].max_dl - usr.dnldl);
  1791.                strcat(ext, buffer);
  1792.                m += strlen(buffer);
  1793.                break;
  1794.             case '\\':
  1795.                sprintf (buffer, "%s", &config->language[usr.language].descr[1]);
  1796.                strcat(ext, buffer);
  1797.                m += strlen(buffer);
  1798.                break;
  1799.             case ']':
  1800.                sprintf (buffer, "%s", usr.comment);
  1801.                strcat(ext, buffer);
  1802.                m += strlen(buffer);
  1803.                break;
  1804.          }
  1805.          break;
  1806.       case CTRLK:
  1807.          p++;
  1808.          switch(*p) {
  1809.             case 'A':
  1810.                sprintf (buffer, "%lu",sysinfo.total_calls);
  1811.                strcat(ext, buffer);
  1812.                m += strlen(buffer);
  1813.                break;
  1814.             case 'B':
  1815.                sprintf (buffer, "%s",lastcall.name);
  1816.                strcat(ext, buffer);
  1817.                m += strlen(buffer);
  1818.                break;
  1819.             case 'C':
  1820.                sprintf (buffer, "%d", msg_child);
  1821.                strcat(ext, buffer);
  1822.                m += strlen(buffer);
  1823.                break;
  1824.             case 'D':
  1825.                sprintf (buffer, "%d",first_msg);
  1826.                strcat(ext, buffer);
  1827.                m += strlen(buffer);
  1828.                break;
  1829.             case 'E':
  1830.                sprintf (buffer, "%d",last_msg);
  1831.                strcat(ext, buffer);
  1832.                m += strlen(buffer);
  1833.                break;
  1834.             case 'G':
  1835.                tempo = time(0);
  1836.                tim = localtime(&tempo);
  1837.                sprintf (buffer, "%s", bbstxt[B_SUNDAY + tim->tm_wday]);
  1838.                strcat(ext, buffer);
  1839.                m += strlen(buffer);
  1840.                break;
  1841.             case 'I':
  1842.                data(buffer);
  1843.                strcpy (buffer, &buffer[10]);
  1844.                strcat(ext, buffer);
  1845.                m += strlen(buffer);
  1846.                break;
  1847.             case 'J':
  1848.                data(buffer);
  1849.                buffer[9] = '\0';
  1850.                strcat(ext, buffer);
  1851.                m += strlen(buffer);
  1852.                break;
  1853.             case 'K':
  1854.                m = (int)((time(NULL)-start_time)/60);
  1855.                sprintf (buffer, "%d",m);
  1856.                strcat(ext, buffer);
  1857.                m += strlen(buffer);
  1858.                break;
  1859.             case 'M':
  1860.                sprintf (buffer, "%d",max_priv_mail);
  1861.                strcat(ext, buffer);
  1862.                m += strlen(buffer);
  1863.                break;
  1864.             case 'O':
  1865.                sprintf (buffer, "%d",time_remain());
  1866.                strcat(ext, buffer);
  1867.                m += strlen(buffer);
  1868.                break;
  1869.             case 'P':
  1870.                sprintf (buffer, "%d", msg_parent);
  1871.                strcat(ext, buffer);
  1872.                m += strlen(buffer);
  1873.                break;
  1874.             case 'Q':
  1875.                sprintf (buffer, "%d",config->class[usr_class].max_call);
  1876.                strcat(ext, buffer);
  1877.                m += strlen(buffer);
  1878.                break;
  1879.             case 'R':
  1880.                sprintf (buffer, "%lu", local_mode ? 0L : rate);
  1881.                strcat(ext, buffer);
  1882.                m += strlen(buffer);
  1883.                break;
  1884.             case 'T':
  1885.                sprintf (buffer, "%d",config->class[usr_class].max_dl);
  1886.                strcat(ext, buffer);
  1887.                m += strlen(buffer);
  1888.                break;
  1889.             case 'U':
  1890.                sprintf (buffer, "%d", time_to_next (1));
  1891.                strcat(ext, buffer);
  1892.                m += strlen(buffer);
  1893.                break;
  1894.             case 'W':
  1895.                sprintf (buffer, "%d", line_offset);
  1896.                strcat(ext, buffer);
  1897.                m += strlen(buffer);
  1898.                break;
  1899.             case 'Y':
  1900.                strcat(ext, sys.msg_name);
  1901.                m += strlen(sys.msg_name);
  1902.                break;
  1903.             case 'Z':
  1904.                strcat(ext, sys.file_name);
  1905.                m += strlen(sys.file_name);
  1906.                break;
  1907.             case '0':
  1908.             case '9':
  1909.                sprintf (buffer, "%d",num_msg);
  1910.                strcat(ext, buffer);
  1911.                m += strlen(buffer);
  1912.                break;
  1913.             case '1':
  1914.                sprintf (buffer, "%d",usr.msg);
  1915.                strcat(ext, buffer);
  1916.                m += strlen(buffer);
  1917.                break;
  1918.             case '2':
  1919.                sprintf (buffer, "%d",usr.files);
  1920.                strcat(ext, buffer);
  1921.                m += strlen(buffer);
  1922.                break;
  1923.             case '5':
  1924.                sprintf (buffer, "%s", sys.msg_name);
  1925.                strcat(ext, buffer);
  1926.                m += strlen(buffer);
  1927.                break;
  1928.             case '7':
  1929.                sprintf (buffer, "%d",usr.account);
  1930.                strcat(ext, buffer);
  1931.                m += strlen(buffer);
  1932.                break;
  1933.             case '8':
  1934.                sprintf (buffer, "%d",usr.f_account);
  1935.                strcat(ext, buffer);
  1936.                m += strlen(buffer);
  1937.                break;
  1938.             case '[':
  1939.                sprintf (buffer, "%d", config->class[usr_class].max_dl - usr.dnldl);
  1940.                strcat(ext, buffer);
  1941.                m += strlen(buffer);
  1942.                break;
  1943.             case '\\':
  1944.                del_line ();
  1945.                break;
  1946.          }
  1947.          break;
  1948.       case CTRLV:
  1949.          p++;
  1950.  
  1951.          i = 0;
  1952.          buffer[i++] = CTRLV;
  1953.  
  1954.          switch(*p) {
  1955.          case CTRLA:
  1956.             buffer[i++] = CTRLA;
  1957.  
  1958.             p++;
  1959.             if (*p == CTRLP)
  1960.                buffer[i++] = CTRLP;
  1961.  
  1962.             buffer[i++] = *p;
  1963.  
  1964.             buffer[i] = '\0';
  1965.             strcat(ext, buffer);
  1966.             m += strlen(buffer);
  1967.             break;
  1968.          case CTRLC:
  1969.             buffer[i++] = CTRLC;
  1970.             buffer[i] = '\0';
  1971.             strcat(ext, buffer);
  1972.             m += strlen(buffer);
  1973.             break;
  1974.          case CTRLD:
  1975.             buffer[i++] = CTRLD;
  1976.             buffer[i] = '\0';
  1977.             strcat(ext, buffer);
  1978.             m += strlen(buffer);
  1979.             break;
  1980.          case CTRLE:
  1981.             buffer[i++] = CTRLE;
  1982.             buffer[i] = '\0';
  1983.             strcat(ext, buffer);
  1984.             m += strlen(buffer);
  1985.             break;
  1986.          case CTRLF:
  1987.             buffer[i++] = CTRLF;
  1988.             buffer[i] = '\0';
  1989.             strcat(ext, buffer);
  1990.             m += strlen(buffer);
  1991.             break;
  1992.          case CTRLG:
  1993.             buffer[i++] = CTRLG;
  1994.             buffer[i] = '\0';
  1995.             strcat(ext, buffer);
  1996.             m += strlen(buffer);
  1997.             break;
  1998.          case CTRLH:
  1999.             buffer[i++] = *(p+1);
  2000.             buffer[i++] = *(p+2);
  2001.             buffer[i] = '\0';
  2002.             strcat(ext, buffer);
  2003.             m += strlen(buffer);
  2004.             p+=2;
  2005.             break;
  2006.          }
  2007.          break;
  2008.       case CTRLW:
  2009.          p++;
  2010.          switch(*p) {
  2011.             case 'P':
  2012.                strcat (ext, usr.voicephone);
  2013.                m += strlen (usr.voicephone);
  2014.                break;
  2015.             case 'R':
  2016.                strcat (ext, usr.handle);
  2017.                m += strlen (usr.handle);
  2018.                break;
  2019.             case 'S':
  2020.                strcat (ext, usr.signature);
  2021.                m += strlen (usr.signature);
  2022.                break;
  2023.          }
  2024.          break;
  2025.       default:
  2026.          ext[m++] = *p;
  2027.          ext[m] = '\0';
  2028.          break;
  2029.       }
  2030.  
  2031.    change_attr(cmd[item].color);
  2032.  
  2033.    m = strlen(ext) - 1;
  2034.    if (ext[m] == ';') {
  2035.       ext[m] = '\0';
  2036.       m_print("%s\n",ext);
  2037.    }
  2038.    else
  2039.       m_print("%s",ext);
  2040. }
  2041.  
  2042. static int get_menu_password (args)
  2043. char *args;
  2044. {
  2045.    char *s, *p, password[40], c;
  2046.  
  2047.    if ((s=strstr(args,"/P=")) == NULL)
  2048.       return (1);
  2049.  
  2050.    s+=3;
  2051.    if ((p = strchr(s, ' ')) == NULL)
  2052.       p = strchr(s, '\0');
  2053.    c = *p;
  2054.    *p = '\0';
  2055.  
  2056.    change_attr(LRED|_BLACK);
  2057.  
  2058.    if (!get_command_word (password, 39))
  2059.       do {
  2060.          m_print(bbstxt[B_MENU_PASSWORD]);
  2061.          inpwd(password, 39);
  2062.          if (!CARRIER || !strlen(password))
  2063.          {
  2064.             *p = c;
  2065.             return (0);
  2066.          }
  2067.       } while(!strlen(password));
  2068.  
  2069.    if(!stricmp(password, s))
  2070.    {
  2071.       *p = c;
  2072.       return (1);
  2073.    }
  2074.  
  2075.    change_attr(YELLOW|_BLACK);
  2076.    m_print(bbstxt[B_DENIED]);
  2077.    status_line(msgtxt[M_BAD_PASSWORD], password);
  2078.    press_enter ();
  2079.  
  2080.    *p = c;
  2081.  
  2082.    return (0);
  2083. }
  2084.  
  2085. static void get_buffer_keystrokes (args)
  2086. char *args;
  2087. {
  2088.    char *s, *p, c;
  2089.  
  2090.    if (!registered)
  2091.       return;
  2092.  
  2093.    if ((s=strstr(args,"/K=")) == NULL)
  2094.       return;
  2095.  
  2096.    s+=3;
  2097.    if ((p = strchr(s, ' ')) == NULL)
  2098.       p = strchr(s, '\0');
  2099.    c = *p;
  2100.    *p = '\0';
  2101.  
  2102.    if (cmd_string[0] == '\0')
  2103.       strcat (cmd_string, s);
  2104.    else
  2105.       strins (s, cmd_string, 1);
  2106.  
  2107.    *p = c;
  2108. }
  2109.  
  2110. static int ok_counter (args)
  2111. char *args;
  2112. {
  2113.    char *p, op;
  2114.    int gg, val;
  2115.  
  2116.    if ((p = strstr (args, "/C")) == NULL)
  2117.       return (1);
  2118.  
  2119.    if (!isdigit (p[2]))
  2120.       return (1);
  2121.    if (sscanf ( (p + 2), "%d%c%d", &gg, &op, &val) < 3)
  2122.       return (1);
  2123.  
  2124.    if (gg < 0 || gg >= MAXCOUNTER)
  2125.       return (0);
  2126.  
  2127.    switch (op) {
  2128.       case '=':
  2129.          if (usr.counter[gg] == val)
  2130.             return (1);
  2131.          break;
  2132.       case '<':
  2133.          if (usr.counter[gg] < val)
  2134.             return (1);
  2135.          break;
  2136.       case '>':
  2137.          if (usr.counter[gg] > val)
  2138.             return (1);
  2139.          break;
  2140.       case '!':
  2141.          if (usr.counter[gg] != val)
  2142.             return (1);
  2143.          break;
  2144.       default:
  2145.          return (1);
  2146.    }
  2147.  
  2148.    return (0);
  2149. }
  2150.  
  2151. static int get_sig (argument)
  2152. char *argument;
  2153. {
  2154.    char *p;
  2155.    int xp = 0;
  2156.  
  2157.    if ((p=strstr(argument, "/F")) != NULL)
  2158.       active = 2;
  2159.  
  2160.    if ((p=strstr(argument, "/M")) != NULL)
  2161.       active = 1;
  2162.  
  2163.    if ((p=strstr(argument, "/G")) != NULL) {
  2164.       if ( *(p +2) == '=') {
  2165.          if ( *(p + 3) == '?' )
  2166.             xp = -1;
  2167.          else
  2168.             xp = atoi(p + 3);
  2169.       }
  2170.       else {
  2171.          if (active == 1)
  2172.             xp = usr.msg_sig;
  2173.          else if (active == 2)
  2174.             xp = usr.file_sig;
  2175.       }
  2176.    }
  2177.  
  2178.    return (xp);
  2179. }
  2180.  
  2181. static int user_age_ok (char *arg)
  2182. {
  2183.    int i;
  2184.    char *p, argument[80];
  2185.  
  2186.    strcpy (argument, arg);
  2187.    strupr (argument);
  2188.    if ((p = strstr (argument, "/AGE=")) != NULL) {
  2189.       p = strtok (p, " ");
  2190.       i = atoi (&p[5]);
  2191.       if (i > get_user_age ())
  2192.          return (0);
  2193.    }
  2194.  
  2195.    return (1);
  2196. }
  2197.  
  2198.