home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d832 / term.lha / Term / term-3.1-Source.lha / termARexxAttributes.c < prev    next >
C/C++ Source or Header  |  1993-02-18  |  58KB  |  3,285 lines

  1. /*
  2. **    termARexxAttributes.c
  3. **
  4. **    ARexx interface attribute handling routines
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termARexxGlobal.h"
  11. #include "termARexxAttributes.h"
  12.  
  13.     /* ToBoolean(WORD Value):
  14.      *
  15.      *    Map an index value to a boolean string.
  16.      */
  17.  
  18. STATIC STRPTR __regargs
  19. ToBoolean(WORD Value)
  20. {
  21.     if(Value)
  22.         return("ON");
  23.     else
  24.         return("OFF");
  25. }
  26.  
  27.     /* FromBoolean(STRPTR Value):
  28.      *
  29.      *    Map a boolean value to an index value.
  30.      */
  31.  
  32. STATIC WORD __regargs
  33. FromBoolean(STRPTR Value)
  34. {
  35.     STATIC STRPTR BoolTrueMappings[] =
  36.     {
  37.         "TRUE",
  38.         "ON",
  39.         "YES",
  40.         "ENABLED",
  41.         "AVAILABLE",
  42.         NULL
  43.     };
  44.  
  45.     WORD i = 0;
  46.  
  47.     while(BoolTrueMappings[i])
  48.     {
  49.         if(!Stricmp(Value,BoolTrueMappings[i]))
  50.             return(TRUE);
  51.         else
  52.             i++;
  53.     }
  54.  
  55.     return(FALSE);
  56. }
  57.  
  58.     /* ToMap(WORD Index,STRPTR *Mappings):
  59.      *
  60.      *    Map an index to a string.
  61.      */
  62.  
  63. STATIC STRPTR __regargs
  64. ToMap(WORD Index,STRPTR *Mappings)
  65. {
  66.     WORD i = 0;
  67.  
  68.     while(Mappings[i])
  69.     {
  70.         if(Index == i)
  71.             return(Mappings[i]);
  72.         else
  73.             i++;
  74.     }
  75.  
  76.     return(Mappings[0]);
  77. }
  78.  
  79.     /* FromMap(STRPTR String,STRPTR *Mappings):
  80.      *
  81.      *    Map a string to an index number.
  82.      */
  83.  
  84. STATIC WORD __regargs
  85. FromMap(STRPTR String,STRPTR *Mappings)
  86. {
  87.     WORD i = 0;
  88.  
  89.     while(Mappings[i])
  90.     {
  91.         if(!Stricmp(String,Mappings[i]))
  92.             return(i);
  93.         else
  94.             i++;
  95.     }
  96.  
  97.     return(-1);
  98. }
  99.  
  100.     /* ToIndex(STRPTR Name,WORD *Count1,WORD *Count2):
  101.      *
  102.      *    Turn an index name into an index and count key.
  103.      */
  104.  
  105. STATIC WORD __regargs
  106. ToIndex(STRPTR Name,WORD *Count1,WORD *Count2)
  107. {
  108.     UBYTE    NodeName[40];
  109.     WORD    i,Level = 0,Top = 0,Index = -1;
  110.     BYTE    FoundIt = FALSE,
  111.         NodeIsNumeric;
  112.  
  113.         /* Reset counter variables. */
  114.  
  115.     *Count1 = *Count2 = -1;
  116.  
  117.         /* Skip leading blank spaces. */
  118.  
  119.     while(*Name == ' ' || *Name == '\t')
  120.         Name++;
  121.  
  122.         /* Scan until end of string found. */
  123.  
  124.     while(*Name)
  125.     {
  126.             /* Get the node name. */
  127.  
  128.         i = 0;
  129.  
  130.         while(*Name != '.' && *Name != ' ' && *Name != '\t' && *Name)
  131.             NodeName[i++] = *Name++;
  132.  
  133.         NodeName[i] = 0;
  134.  
  135.             /* Is the name really a number? */
  136.  
  137.         NodeIsNumeric = IsNumeric(NodeName);
  138.  
  139.             /* Skip any trailing spaces. */
  140.  
  141.         while(*Name == ' ' || *Name == '\t')
  142.             Name++;
  143.  
  144.             /* Is a component name to follow? */
  145.  
  146.         if(*Name == '.')
  147.         {
  148.                 /* Skip dot and trailing spaces. */
  149.  
  150.             do
  151.                 Name++;
  152.             while(*Name == ' ' || *Name == '\t');
  153.         }
  154.         else
  155.             Name = "";    /* Last iteration. */
  156.  
  157.             /* Try to find the corresponding keyword in the tree. */
  158.  
  159.         FoundIt = FALSE;
  160.  
  161.         for(i = Top ; i < AttributeTableSize ; i++)
  162.         {
  163.                 /* Is it on the same tree level? Note: code will
  164.                  * scan into the branches but will not move back up
  165.                  * in the tree.
  166.                  */
  167.  
  168.             if(AttributeTable[i] . Level == Level)
  169.             {
  170.                     /* Is a keyword required? */
  171.  
  172.                 if(AttributeTable[i] . Name)
  173.                 {
  174.                         /* Does the name match? */
  175.  
  176.                     if(!Stricmp(AttributeTable[i] . Name,NodeName))
  177.                     {
  178.                             /* Remember new anchor point. */
  179.  
  180.                         Index    = i;
  181.                         Top    = i + 1;
  182.  
  183.                         FoundIt = TRUE;
  184.  
  185.                         break;
  186.                     }
  187.                 }
  188.                 else
  189.                 {
  190.                         /* Is the name really a number? */
  191.  
  192.                     if(NodeIsNumeric)
  193.                     {
  194.                             /* Store the counter. */
  195.  
  196.                         if(*Count1 == -1)
  197.                             *Count2 = Atol(NodeName);
  198.                         else
  199.                             *Count1 = Atol(NodeName);
  200.  
  201.                             /* Remember new anchor point. */
  202.  
  203.                         Index    = i;
  204.                         Top    = i + 1;
  205.  
  206.                         FoundIt = TRUE;
  207.  
  208.                         break;
  209.                     }
  210.                 }
  211.             }
  212.             else
  213.             {
  214.                     /* Don't move back up in the tree! */
  215.  
  216.                 if(AttributeTable[i] . Level < Level)
  217.                     break;
  218.             }
  219.         }
  220.  
  221.         if(FoundIt)
  222.             Level++;
  223.         else
  224.             break;
  225.     }
  226.  
  227.         /* In case the last entry was found, return the index. */
  228.  
  229.     if(FoundIt)
  230.         return(Index);
  231.     else
  232.         return(-1);
  233. }
  234.  
  235.     /* FromIndex(WORD Index,WORD Count1,WORD Count2):
  236.      *
  237.      *    Turn an index/count key into a neat index name.
  238.      */
  239.  
  240. STATIC STRPTR __regargs
  241. FromIndex(WORD Index,WORD Count1,WORD Count2,BYTE IncludeRoot)
  242. {
  243.     STATIC UBYTE NameBuffer[160];
  244.  
  245.     WORD Levels[4],i;
  246.  
  247.         /* Reset the level indices. */
  248.  
  249.     for(i = 1 ; i < 4 ; i++)
  250.         Levels[i] = -1;
  251.  
  252.         /* Fill in the leaf level. */
  253.  
  254.     Levels[0] = Index;
  255.  
  256.         /* Top node? */
  257.  
  258.     if(Index > 0)
  259.     {
  260.         WORD Count = 1,Level = AttributeTable[Index] . Level;
  261.  
  262.             /* Move up in the tree. */
  263.  
  264.         for(i = Index - 1 ; i >= 0 ; i--)
  265.         {
  266.                 /* Previous level? */
  267.  
  268.             if(AttributeTable[i] . Level == Level - 1)
  269.             {
  270.                     /* Store index. */
  271.  
  272.                 Levels[Count++] = i;
  273.  
  274.                 Level--;
  275.             }
  276.         }
  277.     }
  278.  
  279.         /* Clear name buffer. */
  280.  
  281.     NameBuffer[0] = 0;
  282.  
  283.         /* Scan backwards. */
  284.  
  285.     for(i = 4 ; i >= 0 ; i--)
  286.     {
  287.             /* Valid level index? */
  288.  
  289.         if(Levels[i] != -1)
  290.         {
  291.                 /* First name? */
  292.  
  293.             if(!NameBuffer[0])
  294.                 strcpy(NameBuffer,AttributeTable[Levels[i]] . Name);
  295.             else
  296.             {
  297.                     /* Valid name string? */
  298.  
  299.                 if(AttributeTable[Levels[i]] . Name)
  300.                 {
  301.                     strcat(NameBuffer,".");
  302.                     strcat(NameBuffer,AttributeTable[Levels[i]] . Name);
  303.                 }
  304.                 else
  305.                 {
  306.                     UBYTE Number[20];
  307.  
  308.                         /* Add an index number. */
  309.  
  310.                     if(Count1 != -1)
  311.                     {
  312.                         SPrintf(Number,".%ld",Count1);
  313.  
  314.                         Count1 = -1;
  315.                     }
  316.                     else
  317.                         SPrintf(Number,".%ld",Count2);
  318.  
  319.                     strcat(NameBuffer,Number);
  320.                 }
  321.             }
  322.         }
  323.     }
  324.  
  325.         /* Return the name string. */
  326.  
  327.     if(IncludeRoot)
  328.         return(NameBuffer);
  329.     else
  330.     {
  331.         STRPTR Name = NameBuffer;
  332.  
  333.         while(*Name++ != '.');
  334.  
  335.         return(Name);
  336.     }
  337. }
  338.  
  339.     /* GetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR Input):
  340.      *
  341.      *    Beware the MONSTER!
  342.      */
  343.  
  344. STATIC LONG __regargs
  345. GetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR *Result)
  346. {
  347.     STATIC UBYTE ResultBuffer[MAXPUBSCREENNAME + 1];
  348.  
  349.     STRPTR    String;
  350.     LONG    Number,Error = 0;
  351.  
  352.     switch(ID)
  353.     {
  354.         case ATTR_APPLICATION_VERSION:
  355.  
  356.             SPrintf(ResultBuffer,"%ld.%ld",TermVersion,TermRevision);
  357.  
  358.             String = ResultBuffer;
  359.  
  360.             break;
  361.  
  362.         case ATTR_APPLICATION_SCREEN:
  363.  
  364.             if(GetPubScreenName(Window -> WScreen,ResultBuffer))
  365.                 String = ResultBuffer;
  366.             else
  367.                 Error = ERROR_OBJECT_NOT_FOUND;
  368.  
  369.             break;
  370.  
  371.         case ATTR_APPLICATION_SESSION_ONLINE:
  372.  
  373.             Number = Online;
  374.             break;
  375.  
  376.         case ATTR_APPLICATION_SESSION_SESSIONSTART:
  377.  
  378.             {
  379.                 UBYTE        Time[30],
  380.                         Date[30];
  381.                 struct DateTime    DateTime;
  382.  
  383.                 DateTime . dat_Stamp    = SessionStart;
  384.                 DateTime . dat_Format    = FORMAT_DOS;
  385.                 DateTime . dat_Flags    = 0;
  386.                 DateTime . dat_StrDay    = NULL;
  387.                 DateTime . dat_StrDate    = Date;
  388.                 DateTime . dat_StrTime    = Time;
  389.  
  390.                 if(DateToStr(&DateTime))
  391.                     SPrintf(ResultBuffer,"%s %s",Date,Time);
  392.                 else
  393.                     strcpy(ResultBuffer,"-");
  394.  
  395.                 String = ResultBuffer;
  396.             }
  397.  
  398.             break;
  399.  
  400.         case ATTR_APPLICATION_SESSION_BYTESSENT:
  401.  
  402.             Number = BytesOut;
  403.             break;
  404.  
  405.         case ATTR_APPLICATION_SESSION_BYTESRECEIVED:
  406.  
  407.             Number = BytesIn;
  408.             break;
  409.  
  410.         case ATTR_APPLICATION_SESSION_CONNECTMESSAGE:
  411.  
  412.             String = BaudBuffer;
  413.             break;
  414.  
  415.         case ATTR_APPLICATION_SESSION_BBSNAME:
  416.  
  417.             String = CurrentBBSName;
  418.             break;
  419.  
  420.         case ATTR_APPLICATION_SESSION_BBSNUMBER:
  421.  
  422.             String = CurrentBBSNumber;
  423.             break;
  424.  
  425.         case ATTR_APPLICATION_SESSION_BBSCOMMENT:
  426.  
  427.             String = CurrentBBSComment;
  428.             break;
  429.  
  430.         case ATTR_APPLICATION_SESSION_USERNAME:
  431.  
  432.             String = UserName;
  433.             break;
  434.  
  435.         case ATTR_APPLICATION_SESSION_ONLINEMINUTES:
  436.  
  437.             Number = OnlineMinutes;
  438.             break;
  439.  
  440.         case ATTR_APPLICATION_SESSION_ONLINECOST:
  441.  
  442.             Number = CurrentPay;
  443.             break;
  444.  
  445.         case ATTR_APPLICATION_AREXX:
  446.  
  447.             String = RexxPortName;
  448.             break;
  449.  
  450.         case ATTR_APPLICATION_LASTERROR:
  451.  
  452.             Number = LastRexxError;
  453.             break;
  454.  
  455.         case ATTR_APPLICATION_TERMINAL_ROWS:
  456.  
  457.             if(XEmulatorBase && XEM_IO)
  458.             {
  459.                 if(XEmulatorBase -> lib_Version >= 4)
  460.                 {
  461.                     ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  462.  
  463.                     Number = XEMI_EXTRACT_LINES(Result);
  464.                 }
  465.                 else
  466.                     Number = 0;
  467.             }
  468.             else
  469.                 Number = LastLine + 1;
  470.  
  471.             break;
  472.  
  473.         case ATTR_APPLICATION_TERMINAL_COLUMNS:
  474.  
  475.             if(XEmulatorBase && XEM_IO)
  476.             {
  477.                 if(XEmulatorBase -> lib_Version >= 4)
  478.                 {
  479.                     ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  480.  
  481.                     Number = XEMI_EXTRACT_COLUMNS(Result);
  482.                 }
  483.                 else
  484.                     Number = 0;
  485.             }
  486.             else
  487.                 Number = LastColumn + 1;
  488.  
  489.             break;
  490.  
  491.         case ATTR_APPLICATION_BUFFER_SIZE:
  492.  
  493.             Number = BufferSpace;
  494.             break;
  495.  
  496.         case ATTR_PREFS_SERIAL_BAUDRATE:
  497.  
  498.             Number = Config -> SerialConfig -> BaudRate;
  499.             break;
  500.  
  501.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  502.  
  503.             Number = Config -> SerialConfig -> BreakLength;
  504.             break;
  505.  
  506.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  507.  
  508.             Number = Config -> SerialConfig -> SerialBufferSize;
  509.             break;
  510.  
  511.         case ATTR_PREFS_SERIAL_DEVICENAME:
  512.  
  513.             String = Config -> SerialConfig -> SerialDevice;
  514.             break;
  515.  
  516.         case ATTR_PREFS_SERIAL_UNIT:
  517.  
  518.             Number = Config -> SerialConfig -> UnitNumber;
  519.             break;
  520.  
  521.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  522.  
  523.             Number = Config -> SerialConfig -> BitsPerChar;
  524.             break;
  525.  
  526.         case ATTR_PREFS_SERIAL_PARITYMODE:
  527.  
  528.             Number = Config -> SerialConfig -> Parity;
  529.             break;
  530.  
  531.         case ATTR_PREFS_SERIAL_STOPBITS:
  532.  
  533.             Number = Config -> SerialConfig -> StopBits;
  534.             break;
  535.  
  536.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  537.  
  538.             Number = Config -> SerialConfig -> HandshakingProtocol;
  539.             break;
  540.  
  541.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  542.  
  543.             Number = Config -> SerialConfig -> Duplex;
  544.             break;
  545.  
  546.         case ATTR_PREFS_SERIAL_XONXOFF:
  547.  
  548.             Number = Config -> SerialConfig -> xONxOFF;
  549.             break;
  550.  
  551.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  552.  
  553.             Number = Config -> SerialConfig -> HighSpeed;
  554.             break;
  555.  
  556.         case ATTR_PREFS_SERIAL_SHARED:
  557.  
  558.             Number = Config -> SerialConfig -> Shared;
  559.             break;
  560.  
  561.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  562.  
  563.             Number = Config -> SerialConfig -> StripBit8;
  564.             break;
  565.  
  566.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  567.  
  568.             Number = Config -> SerialConfig -> CheckCarrier;
  569.             break;
  570.  
  571.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  572.  
  573.             Number = Config -> SerialConfig -> PassThrough;
  574.             break;
  575.  
  576.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  577.  
  578.             String = Config -> ModemConfig -> ModemInit;
  579.             break;
  580.  
  581.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  582.  
  583.             String = Config -> ModemConfig -> ModemExit;
  584.             break;
  585.  
  586.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  587.  
  588.             String = Config -> ModemConfig -> ModemHangup;
  589.             break;
  590.  
  591.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  592.  
  593.             String = Config -> ModemConfig -> DialPrefix;
  594.             break;
  595.  
  596.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  597.  
  598.             String = Config -> ModemConfig -> DialSuffix;
  599.             break;
  600.  
  601.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  602.  
  603.             String = Config -> ModemConfig -> NoCarrier;
  604.             break;
  605.  
  606.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  607.  
  608.             String = Config -> ModemConfig -> NoDialTone;
  609.             break;
  610.  
  611.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  612.  
  613.             String = Config -> ModemConfig -> Connect;
  614.             break;
  615.  
  616.         case ATTR_PREFS_MODEM_VOICETEXT:
  617.  
  618.             String = Config -> ModemConfig -> Voice;
  619.             break;
  620.  
  621.         case ATTR_PREFS_MODEM_RINGTEXT:
  622.  
  623.             String = Config -> ModemConfig -> Ring;
  624.             break;
  625.  
  626.         case ATTR_PREFS_MODEM_BUSYTEXT:
  627.  
  628.             String = Config -> ModemConfig -> Busy;
  629.             break;
  630.  
  631.         case ATTR_PREFS_MODEM_REDIALDELAY:
  632.  
  633.             Number = (Config -> ModemConfig -> RedialDelay / 6) * 60 + (Config -> ModemConfig -> RedialDelay % 6) * 10;
  634.             break;
  635.  
  636.         case ATTR_PREFS_MODEM_DIALRETRIES:
  637.  
  638.             Number = Config -> ModemConfig -> DialRetries;
  639.             break;
  640.  
  641.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  642.  
  643.             Number = Config -> ModemConfig -> DialTimeout;
  644.             break;
  645.  
  646.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  647.  
  648.             Number = Config -> ModemConfig -> ConnectAutoBaud;
  649.             break;
  650.  
  651.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  652.  
  653.             Number = Config -> ModemConfig -> DropDTR;
  654.             break;
  655.  
  656.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  657.  
  658.             Number = Config -> ModemConfig -> RedialAfterHangup;
  659.             break;
  660.  
  661.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  662.  
  663.             String = Config -> CommandConfig -> StartupMacro;
  664.             break;
  665.  
  666.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  667.  
  668.             String = Config -> CommandConfig -> LogoffMacro;
  669.             break;
  670.  
  671.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  672.  
  673.             String = Config -> CommandConfig -> UploadMacro;
  674.             break;
  675.  
  676.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  677.  
  678.             String = Config -> CommandConfig -> DownloadMacro;
  679.             break;
  680.  
  681.         case ATTR_PREFS_SCREEN_COLOURMODE:
  682.  
  683.             Number = Config -> ScreenConfig -> ColourMode;
  684.             break;
  685.  
  686.         case ATTR_PREFS_SCREEN_FONTNAME:
  687.  
  688.             String = Config -> ScreenConfig -> FontName;
  689.             break;
  690.  
  691.         case ATTR_PREFS_SCREEN_FONTSIZE:
  692.  
  693.             Number = Config -> ScreenConfig -> FontHeight;
  694.             break;
  695.  
  696.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  697.  
  698.             Number = Config -> ScreenConfig -> MakeScreenPublic;
  699.             break;
  700.  
  701.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  702.  
  703.             Number = Config -> ScreenConfig -> ShanghaiWindows;
  704.             break;
  705.  
  706.         case ATTR_PREFS_SCREEN_BLINKING:
  707.  
  708.             Number = Config -> ScreenConfig -> Blinking;
  709.             break;
  710.  
  711.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  712.  
  713.             Number = Config -> ScreenConfig -> FasterLayout;
  714.             break;
  715.  
  716.         case ATTR_PREFS_SCREEN_TITLEBAR:
  717.  
  718.             Number = Config -> ScreenConfig -> TitleBar;
  719.             break;
  720.  
  721.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  722.  
  723.             Number = Config -> ScreenConfig -> StatusLine;
  724.             break;
  725.  
  726.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  727.  
  728.             Number = Config -> ScreenConfig -> UseWorkbench;
  729.             break;
  730.  
  731.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  732.  
  733.             String = Config -> ScreenConfig -> PubScreenName;
  734.             break;
  735.  
  736.         case ATTR_PREFS_TERMINAL_BELLMODE:
  737.  
  738.             Number = Config -> TerminalConfig -> BellMode;
  739.             break;
  740.  
  741.         case ATTR_PREFS_TERMINAL_ALERTMODE:
  742.  
  743.             Number = Config -> TerminalConfig -> AlertMode;
  744.             break;
  745.  
  746.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  747.  
  748.             Number = Config -> TerminalConfig -> EmulationMode;
  749.             break;
  750.  
  751.         case ATTR_PREFS_TERMINAL_FONTMODE:
  752.  
  753.             Number = Config -> TerminalConfig -> FontMode;
  754.             break;
  755.  
  756.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  757.  
  758.             Number = Config -> TerminalConfig -> SendCR;
  759.             break;
  760.  
  761.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  762.  
  763.             Number = Config -> TerminalConfig -> SendLF;
  764.             break;
  765.  
  766.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  767.  
  768.             Number = Config -> TerminalConfig -> ReceiveCR;
  769.             break;
  770.  
  771.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  772.  
  773.             Number = Config -> TerminalConfig -> ReceiveLF;
  774.             break;
  775.  
  776.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  777.  
  778.             Number = Config -> TerminalConfig -> NumColumns;
  779.             break;
  780.  
  781.         case ATTR_PREFS_TERMINAL_NUMLINES:
  782.  
  783.             Number = Config -> TerminalConfig -> NumLines;
  784.             break;
  785.  
  786.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  787.  
  788.             String = Config -> TerminalConfig -> KeyMapFileName;
  789.             break;
  790.  
  791.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  792.  
  793.             String = Config -> TerminalConfig -> EmulationFileName;
  794.             break;
  795.  
  796.         case ATTR_PREFS_TERMINAL_BEEPNAME:
  797.  
  798.             String = Config -> TerminalConfig -> BeepFileName;
  799.             break;
  800.  
  801.         case ATTR_PREFS_TERMINAL_FONTNAME:
  802.  
  803.             String = Config -> TerminalConfig -> TextFontName;
  804.             break;
  805.  
  806.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  807.  
  808.             Number = Config -> TerminalConfig -> TextFontHeight;
  809.             break;
  810.  
  811.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  812.  
  813.             String = Config -> PathConfig -> ASCIIUploadPath;
  814.             break;
  815.  
  816.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  817.  
  818.             String = Config -> PathConfig -> ASCIIDownloadPath;
  819.             break;
  820.  
  821.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  822.  
  823.             String = Config -> PathConfig -> TextUploadPath;
  824.             break;
  825.  
  826.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  827.  
  828.             String = Config -> PathConfig -> TextDownloadPath;
  829.             break;
  830.  
  831.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  832.  
  833.             String = Config -> PathConfig -> BinaryUploadPath;
  834.             break;
  835.  
  836.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  837.  
  838.             String = Config -> PathConfig -> BinaryDownloadPath;
  839.             break;
  840.  
  841.         case ATTR_PREFS_PATHS_CONFIGPATH:
  842.  
  843.             String = Config -> PathConfig -> DefaultStorage;
  844.             break;
  845.  
  846.         case ATTR_PREFS_PATHS_EDITORNAME:
  847.  
  848.             String = Config -> PathConfig -> Editor;
  849.             break;
  850.  
  851.         case ATTR_PREFS_PATHS_HELPFILENAME:
  852.  
  853.             String = Config -> PathConfig -> HelpFile;
  854.             break;
  855.  
  856.         case ATTR_PREFS_MISC_PRIORITY:
  857.  
  858.             Number = Config -> MiscConfig -> Priority;
  859.             break;
  860.  
  861.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  862.  
  863.             Number = Config -> MiscConfig -> BackupConfig;
  864.             break;
  865.  
  866.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  867.  
  868.             Number = Config -> MiscConfig -> OpenFastMacroPanel;
  869.             break;
  870.  
  871.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  872.  
  873.             Number = Config -> MiscConfig -> ReleaseDevice;
  874.             break;
  875.  
  876.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  877.  
  878.             Number = Config -> MiscConfig -> OverridePath;
  879.             break;
  880.  
  881.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  882.  
  883.             Number = Config -> MiscConfig -> AutoUpload;
  884.             break;
  885.  
  886.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  887.  
  888.             Number = Config -> MiscConfig -> SetArchivedBit;
  889.             break;
  890.  
  891.         case ATTR_PREFS_MISC_COMMENTMODE:
  892.  
  893.             Number = Config -> MiscConfig -> IdentifyFiles;
  894.             break;
  895.  
  896.         case ATTR_PREFS_MISC_TRANSFERICONS:
  897.  
  898.             Number = Config -> MiscConfig -> TransferIcons;
  899.             break;
  900.  
  901.         case ATTR_PREFS_CLIPBOARD_UNIT:
  902.  
  903.             Number = Config -> ClipConfig -> ClipboardUnit;
  904.             break;
  905.  
  906.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  907.  
  908.             Number = Config -> ClipConfig -> LineDelay;
  909.             break;
  910.  
  911.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  912.  
  913.             Number = Config -> ClipConfig -> CharDelay;
  914.             break;
  915.  
  916.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  917.  
  918.             String = Config -> ClipConfig -> InsertPrefix;
  919.             break;
  920.  
  921.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  922.  
  923.             String = Config -> ClipConfig -> InsertSuffix;
  924.             break;
  925.  
  926.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  927.  
  928.             Number = Config -> CaptureConfig -> LogActions;
  929.             break;
  930.  
  931.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  932.  
  933.             Number = Config -> CaptureConfig -> LogCall;
  934.             break;
  935.  
  936.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  937.  
  938.             String = Config -> CaptureConfig -> LogFileName;
  939.             break;
  940.  
  941.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  942.  
  943.             Number = Config -> CaptureConfig -> MaxBufferSize;
  944.             break;
  945.  
  946.         case ATTR_PREFS_CAPTURE_BUFFER:
  947.  
  948.             Number = Config -> CaptureConfig -> BufferEnabled;
  949.             break;
  950.  
  951.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  952.  
  953.             Number = Config -> CaptureConfig -> ConnectAutoCapture;
  954.             break;
  955.  
  956.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  957.  
  958.             Number = Config -> CaptureConfig -> CaptureFilterMode;
  959.             break;
  960.  
  961.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  962.  
  963.             String = Config -> CaptureConfig -> CapturePath;
  964.             break;
  965.  
  966.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  967.  
  968.             String = Config -> CaptureConfig -> CallLogFileName;
  969.             break;
  970.  
  971.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  972.  
  973.             String = Config -> CaptureConfig -> BufferPath;
  974.             break;
  975.  
  976.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  977.  
  978.             String = Config -> FileConfig -> ProtocolFileName;
  979.             break;
  980.  
  981.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  982.  
  983.             String = Config -> FileConfig -> TranslationFileName;
  984.             break;
  985.  
  986.         case ATTR_PREFS_FILE_MACROFILENAME:
  987.  
  988.             String = Config -> FileConfig -> MacroFileName;
  989.             break;
  990.  
  991.         case ATTR_PREFS_FILE_CURSORFILENAME:
  992.  
  993.             String = Config -> FileConfig -> CursorFileName;
  994.             break;
  995.  
  996.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  997.  
  998.             String = Config -> FileConfig -> FastMacroFileName;
  999.             break;
  1000.  
  1001.         case ATTR_PREFS_EMULATION_CURSORMODE:
  1002.  
  1003.             Number = Config -> EmulationConfig -> CursorMode;
  1004.             break;
  1005.  
  1006.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  1007.  
  1008.             Number = Config -> EmulationConfig -> NumericMode;
  1009.             break;
  1010.  
  1011.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  1012.  
  1013.             Number = Config -> EmulationConfig -> CursorWrap;
  1014.             break;
  1015.  
  1016.         case ATTR_PREFS_EMULATION_LINEWRAP:
  1017.  
  1018.             Number = Config -> EmulationConfig -> LineWrap;
  1019.             break;
  1020.  
  1021.         case ATTR_PREFS_EMULATION_INSERTMODE:
  1022.  
  1023.             Number = Config -> EmulationConfig -> InsertMode;
  1024.             break;
  1025.  
  1026.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  1027.  
  1028.             Number = Config -> EmulationConfig -> NewLineMode;
  1029.             break;
  1030.  
  1031.         case ATTR_PREFS_EMULATION_FONTSCALEMODE:
  1032.  
  1033.             Number = Config -> EmulationConfig -> FontScale;
  1034.             break;
  1035.  
  1036.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  1037.  
  1038.             Number = Config -> EmulationConfig -> ScrollMode;
  1039.             break;
  1040.  
  1041.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  1042.  
  1043.             Number = Config -> EmulationConfig -> DestructiveBackspace;
  1044.             break;
  1045.  
  1046.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  1047.  
  1048.             Number = Config -> EmulationConfig -> SwapBSDelete;
  1049.             break;
  1050.  
  1051.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  1052.  
  1053.             Number = Config -> EmulationConfig -> PrinterEnabled;
  1054.             break;
  1055.  
  1056.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  1057.  
  1058.             String = Config -> EmulationConfig -> AnswerBack;
  1059.             break;
  1060.  
  1061.         case ATTR_PREFS_SPEECH_RATE:
  1062.  
  1063.             Number = SpeechConfig . Rate;
  1064.             break;
  1065.  
  1066.         case ATTR_PREFS_SPEECH_PITCH:
  1067.  
  1068.             Number = SpeechConfig . Pitch;
  1069.             break;
  1070.  
  1071.         case ATTR_PREFS_SPEECH_FREQUENCY:
  1072.  
  1073.             Number = SpeechConfig . Frequency;
  1074.             break;
  1075.  
  1076.         case ATTR_PREFS_SPEECH_SEXMODE:
  1077.  
  1078.             Number = SpeechConfig . Sex;
  1079.             break;
  1080.  
  1081.         case ATTR_PREFS_SPEECH_VOLUME:
  1082.  
  1083.             Number = SpeechConfig . Volume;
  1084.             break;
  1085.  
  1086.         case ATTR_PREFS_SPEECH_SPEECH:
  1087.  
  1088.             Number = SpeechConfig . Enabled;
  1089.             break;
  1090.  
  1091.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  1092.  
  1093.             if(Count1 < 0 || Count1 > 255)
  1094.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1095.             else
  1096.             {
  1097.                 if(SendTable)
  1098.                 {
  1099.                     if(SendTable[Count1])
  1100.                         TranslateBack(SendTable[Count1] -> String,SendTable[Count1] -> Len,ResultBuffer);
  1101.                     else
  1102.                         SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1103.                 }
  1104.                 else
  1105.                     SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1106.  
  1107.                 String = ResultBuffer;
  1108.             }
  1109.  
  1110.             break;
  1111.  
  1112.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  1113.  
  1114.             if(Count1 < 0 || Count1 > 255)
  1115.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1116.             else
  1117.             {
  1118.                 if(ReceiveTable)
  1119.                 {
  1120.                     if(ReceiveTable[Count1])
  1121.                         TranslateBack(ReceiveTable[Count1] -> String,ReceiveTable[Count1] -> Len,ResultBuffer);
  1122.                     else
  1123.                         SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1124.                 }
  1125.                 else
  1126.                     SPrintf(ResultBuffer,"\\*%s",CodeToName(Count1));
  1127.             }
  1128.  
  1129.             String = ResultBuffer;
  1130.  
  1131.             break;
  1132.  
  1133.         case ATTR_PREFS_FASTMACROS_COUNT:
  1134.  
  1135.             Number = FastMacroCount;
  1136.             break;
  1137.  
  1138.         case ATTR_PREFS_FASTMACROS_X_NAME:
  1139.  
  1140.             if(Count1 < FastMacroCount && Count1 >= 0)
  1141.             {
  1142.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1143.  
  1144.                 String = Node -> mn_Macro;
  1145.             }
  1146.             else
  1147.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1148.  
  1149.             break;
  1150.  
  1151.         case ATTR_PREFS_FASTMACROS_X_CODE:
  1152.  
  1153.             if(Count1 < FastMacroCount && Count1 >= 0)
  1154.             {
  1155.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1156.  
  1157.                 String = Node -> mn_Code;
  1158.             }
  1159.             else
  1160.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1161.  
  1162.             break;
  1163.  
  1164.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  1165.  
  1166.             String = Hotkeys . termScreenToFront;
  1167.             break;
  1168.  
  1169.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  1170.  
  1171.             String = Hotkeys . BufferScreenToFront;
  1172.             break;
  1173.  
  1174.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  1175.  
  1176.             String = Hotkeys . SkipDialEntry;
  1177.             break;
  1178.  
  1179.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  1180.  
  1181.             String = Hotkeys . AbortARexx;
  1182.             break;
  1183.  
  1184.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  1185.  
  1186.             Number = Hotkeys . CommodityPriority;
  1187.             break;
  1188.  
  1189.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  1190.  
  1191.             Number = Hotkeys . HotkeysEnabled;
  1192.             break;
  1193.  
  1194.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  1195.  
  1196.             String = CursorKeys -> Keys[0][0];
  1197.             break;
  1198.  
  1199.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  1200.  
  1201.             String = CursorKeys -> Keys[0][1];
  1202.             break;
  1203.  
  1204.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  1205.  
  1206.             String = CursorKeys -> Keys[0][2];
  1207.             break;
  1208.  
  1209.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  1210.  
  1211.             String = CursorKeys -> Keys[0][3];
  1212.             break;
  1213.  
  1214.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  1215.  
  1216.             String = CursorKeys -> Keys[1][0];
  1217.             break;
  1218.  
  1219.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  1220.  
  1221.             String = CursorKeys -> Keys[1][1];
  1222.             break;
  1223.  
  1224.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  1225.  
  1226.             String = CursorKeys -> Keys[1][2];
  1227.             break;
  1228.  
  1229.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  1230.  
  1231.             String = CursorKeys -> Keys[1][3];
  1232.             break;
  1233.  
  1234.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  1235.  
  1236.             String = CursorKeys -> Keys[2][0];
  1237.             break;
  1238.  
  1239.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  1240.  
  1241.             String = CursorKeys -> Keys[2][1];
  1242.             break;
  1243.  
  1244.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  1245.  
  1246.             String = CursorKeys -> Keys[2][2];
  1247.             break;
  1248.  
  1249.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  1250.  
  1251.             String = CursorKeys -> Keys[2][3];
  1252.             break;
  1253.  
  1254.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  1255.  
  1256.             String = CursorKeys -> Keys[3][0];
  1257.             break;
  1258.  
  1259.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  1260.  
  1261.             String = CursorKeys -> Keys[3][1];
  1262.             break;
  1263.  
  1264.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  1265.  
  1266.             String = CursorKeys -> Keys[3][2];
  1267.             break;
  1268.  
  1269.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  1270.  
  1271.             String = CursorKeys -> Keys[3][3];
  1272.             break;
  1273.  
  1274.         case ATTR_PREFS_FUNCTIONKEYS_X:
  1275.  
  1276.             if(Count1 < 1 || Count1 > 10)
  1277.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1278.             else
  1279.                 String = MacroKeys -> Keys[0][Count1 - 1];
  1280.  
  1281.             break;
  1282.  
  1283.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  1284.  
  1285.             if(Count1 < 1 || Count1 > 10)
  1286.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1287.             else
  1288.                 String = MacroKeys -> Keys[1][Count1 - 1];
  1289.  
  1290.             break;
  1291.  
  1292.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  1293.  
  1294.             if(Count1 < 1 || Count1 > 10)
  1295.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1296.             else
  1297.                 String = MacroKeys -> Keys[2][Count1 - 1];
  1298.  
  1299.             break;
  1300.  
  1301.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  1302.  
  1303.             if(Count1 < 1 || Count1 > 10)
  1304.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1305.             else
  1306.                 String = MacroKeys -> Keys[3][Count1 - 1];
  1307.  
  1308.             break;
  1309.  
  1310.         case ATTR_PREFS_PROTOCOL:
  1311.  
  1312.             String = ProtocolOptsBuffer;
  1313.             break;
  1314.  
  1315.         case ATTR_PREFS_CONSOLE:
  1316.  
  1317.             String = WindowName;
  1318.             break;
  1319.  
  1320.         case ATTR_PHONEBOOK_COUNT:
  1321.  
  1322.             Number = NumPhoneEntries;
  1323.             break;
  1324.  
  1325.         case ATTR_PHONEBOOK_X_NAME:
  1326.  
  1327.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1328.                 String = Phonebook[Count1] -> Header -> Name;
  1329.             else
  1330.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1331.  
  1332.             break;
  1333.  
  1334.         case ATTR_PHONEBOOK_X_NUMBER:
  1335.  
  1336.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1337.                 String = Phonebook[Count1] -> Header -> Number;
  1338.             else
  1339.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1340.  
  1341.             break;
  1342.  
  1343.         case ATTR_PHONEBOOK_X_COMMENTTEXT:
  1344.  
  1345.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1346.                 String = Phonebook[Count1] -> Header -> Comment;
  1347.             else
  1348.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1349.  
  1350.             break;
  1351.  
  1352.         case ATTR_PHONEBOOK_X_USERNAME:
  1353.  
  1354.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1355.                 String = Phonebook[Count1] -> Header -> UserName;
  1356.             else
  1357.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1358.  
  1359.             break;
  1360.  
  1361.         case ATTR_PHONEBOOK_X_PASSWORDTEXT:
  1362.  
  1363.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1364.                 String = Phonebook[Count1] -> Header -> Password;
  1365.             else
  1366.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1367.  
  1368.             break;
  1369.     }
  1370.  
  1371.     if(!Error)
  1372.     {
  1373.         switch(AttributeTable[Index] . Type)
  1374.         {
  1375.             case INFO_TEXT:
  1376.  
  1377.                 *Result = String;
  1378.  
  1379.                 break;
  1380.  
  1381.             case INFO_NUMERIC:
  1382.  
  1383.                 SPrintf(ResultBuffer,"%ld",Number);
  1384.  
  1385.                 *Result = ResultBuffer;
  1386.  
  1387.                 break;
  1388.  
  1389.             case INFO_BOOLEAN:
  1390.  
  1391.                 *Result = ToBoolean(Number);
  1392.  
  1393.                 break;
  1394.  
  1395.             case INFO_MAPPED:
  1396.  
  1397.                 *Result = ToMap(Number,AttributeTable[Index] . Mappings);
  1398.  
  1399.                 break;
  1400.         }
  1401.     }
  1402.  
  1403.     return(Error);
  1404. }
  1405.  
  1406.     /* SetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR Input):
  1407.      *
  1408.      *    Beware the MONSTER!
  1409.      */
  1410.  
  1411. STATIC LONG __regargs
  1412. SetSingleAttribute(WORD ID,WORD Index,WORD Count1,STRPTR Input)
  1413. {
  1414.     STRPTR    String;
  1415.     LONG    Number;
  1416.     LONG    Error = 0;
  1417.  
  1418.     switch(AttributeTable[Index] . Type)
  1419.     {
  1420.         case INFO_TEXT:    
  1421.  
  1422.             String = Input;
  1423.             break;
  1424.  
  1425.         case INFO_NUMERIC:
  1426.  
  1427.             Number = Atol(Input);
  1428.             break;
  1429.  
  1430.         case INFO_BOOLEAN:
  1431.  
  1432.             Number = FromBoolean(Input);
  1433.             break;
  1434.  
  1435.         case INFO_MAPPED:
  1436.  
  1437.             if((Number = FromMap(Input,AttributeTable[Index] . Mappings)) == -1)
  1438.                 return(ERROR_TOO_MANY_ARGS);
  1439.             else
  1440.                 break;
  1441.     }
  1442.  
  1443.     UpdateRequired = TRUE;
  1444.  
  1445.     switch(ID)
  1446.     {
  1447.         case ATTR_PREFS_SERIAL_BAUDRATE:
  1448.         {
  1449.             LONG Min = MILLION,Diff,Index;
  1450.             WORD i;
  1451.  
  1452.             for(i = 0 ; i < NumBaudRates ; i++)
  1453.             {
  1454.                 Diff = Number - BaudRates[i];
  1455.  
  1456.                 if(Diff >= 0 && Diff < Min)
  1457.                 {
  1458.                     Min    = Diff;
  1459.                     Index    = i;
  1460.                 }
  1461.             }
  1462.  
  1463.             if(BaudRates[Index] != Config -> SerialConfig -> BaudRate)
  1464.             {
  1465.                 Config -> SerialConfig -> BaudRate = BaudRates[Index];
  1466.  
  1467.                 ConfigChanged = TRUE;
  1468.  
  1469.                 UpdateRequired = TRUE;
  1470.             }
  1471.  
  1472.             break;
  1473.         }
  1474.  
  1475.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  1476.  
  1477.             Config -> SerialConfig -> BreakLength = Number;
  1478.  
  1479.             ConfigChanged = TRUE;
  1480.  
  1481.             break;
  1482.  
  1483.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  1484.         {
  1485.             WORD i;
  1486.  
  1487.             for(i = 9 ; i <= 19 ; i++)
  1488.             {
  1489.                 if(1L << i >= Number)
  1490.                 {
  1491.                     Config -> SerialConfig -> SerialBufferSize = 1L << i;
  1492.  
  1493.                     ConfigChanged = TRUE;
  1494.  
  1495.                     break;
  1496.                 }
  1497.             }
  1498.  
  1499.             break;
  1500.         }
  1501.  
  1502.         case ATTR_PREFS_SERIAL_DEVICENAME:
  1503.  
  1504.             strcpy(Config -> SerialConfig -> SerialDevice,String);
  1505.  
  1506.             ConfigChanged = TRUE;
  1507.  
  1508.             break;
  1509.  
  1510.         case ATTR_PREFS_SERIAL_UNIT:
  1511.  
  1512.             if(Number >= 0)
  1513.             {
  1514.                 Config -> SerialConfig -> UnitNumber = Number;
  1515.  
  1516.                 ConfigChanged = TRUE;
  1517.             }
  1518.             else
  1519.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  1520.  
  1521.             break;
  1522.  
  1523.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  1524.  
  1525.             if(Number < 7 || Number > 8)
  1526.             {
  1527.                 Error = ERROR_BAD_NUMBER;
  1528.  
  1529.                 ConfigChanged = TRUE;
  1530.             }
  1531.             else
  1532.                 Config -> SerialConfig -> BitsPerChar = Number;
  1533.  
  1534.             break;
  1535.  
  1536.         case ATTR_PREFS_SERIAL_PARITYMODE:
  1537.  
  1538.             Config -> SerialConfig -> Parity = Number;
  1539.  
  1540.             ConfigChanged = TRUE;
  1541.  
  1542.             break;
  1543.  
  1544.         case ATTR_PREFS_SERIAL_STOPBITS:
  1545.  
  1546.             if(Number < 0 || Number > 1)
  1547.                 Error = ERROR_BAD_NUMBER;
  1548.             else
  1549.             {
  1550.                 Config -> SerialConfig -> StopBits = Number;
  1551.  
  1552.                 ConfigChanged = TRUE;
  1553.             }
  1554.  
  1555.             break;
  1556.  
  1557.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  1558.  
  1559.             Config -> SerialConfig -> HandshakingProtocol = Number;
  1560.  
  1561.             ConfigChanged = TRUE;
  1562.  
  1563.             break;
  1564.  
  1565.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  1566.  
  1567.             Config -> SerialConfig -> Duplex = Number;
  1568.  
  1569.             ConfigChanged = TRUE;
  1570.  
  1571.             break;
  1572.  
  1573.         case ATTR_PREFS_SERIAL_XONXOFF:
  1574.  
  1575.             Config -> SerialConfig -> xONxOFF = Number;
  1576.  
  1577.             ConfigChanged = TRUE;
  1578.  
  1579.             break;
  1580.  
  1581.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  1582.  
  1583.             Config -> SerialConfig -> HighSpeed = Number;
  1584.  
  1585.             ConfigChanged = TRUE;
  1586.  
  1587.             break;
  1588.  
  1589.         case ATTR_PREFS_SERIAL_SHARED:
  1590.  
  1591.             Config -> SerialConfig -> Shared = Number;
  1592.  
  1593.             ConfigChanged = TRUE;
  1594.  
  1595.             break;
  1596.  
  1597.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  1598.  
  1599.             Config -> SerialConfig -> StripBit8 = Number;
  1600.  
  1601.             ConfigChanged = TRUE;
  1602.  
  1603.             break;
  1604.  
  1605.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  1606.  
  1607.             Config -> SerialConfig -> CheckCarrier = Number;
  1608.  
  1609.             ConfigChanged = TRUE;
  1610.  
  1611.             break;
  1612.  
  1613.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  1614.  
  1615.             Config -> SerialConfig -> PassThrough = Number;
  1616.  
  1617.             ConfigChanged = TRUE;
  1618.  
  1619.             break;
  1620.  
  1621.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  1622.  
  1623.             strcpy(Config -> ModemConfig -> ModemInit,String);
  1624.  
  1625.             ConfigChanged = TRUE;
  1626.  
  1627.             break;
  1628.  
  1629.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  1630.  
  1631.             strcpy(Config -> ModemConfig -> ModemExit,String);
  1632.  
  1633.             ConfigChanged = TRUE;
  1634.  
  1635.             break;
  1636.  
  1637.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  1638.  
  1639.             strcpy(Config -> ModemConfig -> ModemHangup,String);
  1640.  
  1641.             ConfigChanged = TRUE;
  1642.  
  1643.             break;
  1644.  
  1645.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  1646.  
  1647.             strcpy(Config -> ModemConfig -> DialPrefix,String);
  1648.  
  1649.             ConfigChanged = TRUE;
  1650.  
  1651.             break;
  1652.  
  1653.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  1654.  
  1655.             strcpy(Config -> ModemConfig -> DialSuffix,String);
  1656.  
  1657.             ConfigChanged = TRUE;
  1658.  
  1659.             break;
  1660.  
  1661.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  1662.  
  1663.             strcpy(Config -> ModemConfig -> NoCarrier,String);
  1664.  
  1665.             ConfigChanged = TRUE;
  1666.  
  1667.             break;
  1668.  
  1669.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  1670.  
  1671.             strcpy(Config -> ModemConfig -> NoDialTone,String);
  1672.  
  1673.             ConfigChanged = TRUE;
  1674.  
  1675.             break;
  1676.  
  1677.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  1678.  
  1679.             strcpy(Config -> ModemConfig -> Connect,String);
  1680.  
  1681.             ConfigChanged = TRUE;
  1682.  
  1683.             break;
  1684.  
  1685.         case ATTR_PREFS_MODEM_VOICETEXT:
  1686.  
  1687.             strcpy(Config -> ModemConfig -> Voice,String);
  1688.  
  1689.             ConfigChanged = TRUE;
  1690.  
  1691.             break;
  1692.  
  1693.         case ATTR_PREFS_MODEM_RINGTEXT:
  1694.  
  1695.             strcpy(Config -> ModemConfig -> Ring,String);
  1696.  
  1697.             ConfigChanged = TRUE;
  1698.  
  1699.             break;
  1700.  
  1701.         case ATTR_PREFS_MODEM_BUSYTEXT:
  1702.  
  1703.             strcpy(Config -> ModemConfig -> Busy,String);
  1704.  
  1705.             ConfigChanged = TRUE;
  1706.  
  1707.             break;
  1708.  
  1709.         case ATTR_PREFS_MODEM_REDIALDELAY:
  1710.  
  1711.             if(Number >= 0)
  1712.             {
  1713.                 Config -> ModemConfig -> RedialDelay = (Number / 60) * 6 + (Number % 60) / 10;
  1714.  
  1715.                 ConfigChanged = TRUE;
  1716.             }
  1717.             else
  1718.                 Error = ERROR_BAD_NUMBER;
  1719.  
  1720.             break;
  1721.  
  1722.         case ATTR_PREFS_MODEM_DIALRETRIES:
  1723.  
  1724.             if(Number < 0)
  1725.                 Error = ERROR_BAD_NUMBER;
  1726.             else
  1727.             {
  1728.                 Config -> ModemConfig -> DialRetries = Number;
  1729.  
  1730.                 ConfigChanged = TRUE;
  1731.             }
  1732.  
  1733.             break;
  1734.  
  1735.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  1736.  
  1737.             if(Number < 0)
  1738.                 Error = ERROR_BAD_NUMBER;
  1739.             else
  1740.             {
  1741.                 Config -> ModemConfig -> DialTimeout = Number;
  1742.  
  1743.                 ConfigChanged = TRUE;
  1744.             }
  1745.  
  1746.             break;
  1747.  
  1748.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  1749.  
  1750.             Config -> ModemConfig -> ConnectAutoBaud = Number;
  1751.  
  1752.             ConfigChanged = TRUE;
  1753.  
  1754.             break;
  1755.  
  1756.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  1757.  
  1758.             Config -> ModemConfig -> DropDTR = Number;
  1759.  
  1760.             ConfigChanged = TRUE;
  1761.  
  1762.             break;
  1763.  
  1764.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  1765.  
  1766.             Config -> ModemConfig -> RedialAfterHangup = Number;
  1767.  
  1768.             ConfigChanged = TRUE;
  1769.  
  1770.             break;
  1771.  
  1772.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  1773.  
  1774.             strcpy(Config -> CommandConfig -> StartupMacro,String);
  1775.  
  1776.             ConfigChanged = TRUE;
  1777.  
  1778.             break;
  1779.  
  1780.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  1781.  
  1782.             strcpy(Config -> CommandConfig -> LogoffMacro,String);
  1783.  
  1784.             ConfigChanged = TRUE;
  1785.  
  1786.             break;
  1787.  
  1788.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  1789.  
  1790.             strcpy(Config -> CommandConfig -> UploadMacro,String);
  1791.  
  1792.             ConfigChanged = TRUE;
  1793.  
  1794.             break;
  1795.  
  1796.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  1797.  
  1798.             strcpy(Config -> CommandConfig -> DownloadMacro,String);
  1799.  
  1800.             ConfigChanged = TRUE;
  1801.  
  1802.             break;
  1803.  
  1804.         case ATTR_PREFS_SCREEN_COLOURMODE:
  1805.  
  1806.             Config -> ScreenConfig -> ColourMode = Number;
  1807.  
  1808.             ConfigChanged = TRUE;
  1809.  
  1810.             break;
  1811.  
  1812.         case ATTR_PREFS_SCREEN_FONTNAME:
  1813.  
  1814.             strcpy(Config -> ScreenConfig -> FontName,String);
  1815.  
  1816.             ConfigChanged = TRUE;
  1817.  
  1818.             break;
  1819.  
  1820.         case ATTR_PREFS_SCREEN_FONTSIZE:
  1821.  
  1822.             if(Number < 1)
  1823.                 Error = ERROR_BAD_NUMBER;
  1824.             else
  1825.             {
  1826.                 Config -> ScreenConfig -> FontHeight = Number;
  1827.  
  1828.                 ConfigChanged = TRUE;
  1829.             }
  1830.  
  1831.             break;
  1832.  
  1833.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  1834.  
  1835.             Config -> ScreenConfig -> MakeScreenPublic = Number;
  1836.  
  1837.             ConfigChanged = TRUE;
  1838.  
  1839.             break;
  1840.  
  1841.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  1842.  
  1843.             Config -> ScreenConfig -> ShanghaiWindows = Number;
  1844.  
  1845.             ConfigChanged = TRUE;
  1846.  
  1847.             break;
  1848.  
  1849.         case ATTR_PREFS_SCREEN_BLINKING:
  1850.  
  1851.             Config -> ScreenConfig -> Blinking = Number;
  1852.  
  1853.             ConfigChanged = TRUE;
  1854.  
  1855.             break;
  1856.  
  1857.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  1858.  
  1859.             Config -> ScreenConfig -> FasterLayout = Number;
  1860.  
  1861.             ConfigChanged = TRUE;
  1862.  
  1863.             break;
  1864.  
  1865.         case ATTR_PREFS_SCREEN_TITLEBAR:
  1866.  
  1867.             Config -> ScreenConfig -> TitleBar = Number;
  1868.  
  1869.             ConfigChanged = TRUE;
  1870.  
  1871.             break;
  1872.  
  1873.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  1874.  
  1875.             Config -> ScreenConfig -> StatusLine = Number;
  1876.  
  1877.             ConfigChanged = TRUE;
  1878.  
  1879.             break;
  1880.  
  1881.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  1882.  
  1883.             Config -> ScreenConfig -> UseWorkbench = Number;
  1884.  
  1885.             ConfigChanged = TRUE;
  1886.  
  1887.             break;
  1888.  
  1889.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  1890.  
  1891.             strcpy(Config -> ScreenConfig -> PubScreenName,String);
  1892.  
  1893.             ConfigChanged = TRUE;
  1894.  
  1895.             break;
  1896.  
  1897.         case ATTR_PREFS_TERMINAL_BELLMODE:
  1898.  
  1899.             Config -> TerminalConfig -> BellMode = Number;
  1900.  
  1901.             ConfigChanged = TRUE;
  1902.  
  1903.             break;
  1904.  
  1905.         case ATTR_PREFS_TERMINAL_ALERTMODE:
  1906.  
  1907.             Config -> TerminalConfig -> AlertMode = Number;
  1908.  
  1909.             ConfigChanged = TRUE;
  1910.  
  1911.             break;
  1912.  
  1913.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  1914.  
  1915.             Config -> TerminalConfig -> EmulationMode = Number;
  1916.  
  1917.             ConfigChanged = TRUE;
  1918.  
  1919.             break;
  1920.  
  1921.         case ATTR_PREFS_TERMINAL_FONTMODE:
  1922.  
  1923.             Config -> TerminalConfig -> FontMode = Number;
  1924.  
  1925.             ConfigChanged = TRUE;
  1926.  
  1927.             break;
  1928.  
  1929.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  1930.  
  1931.             Config -> TerminalConfig -> SendCR = Number;
  1932.  
  1933.             ConfigChanged = TRUE;
  1934.  
  1935.             break;
  1936.  
  1937.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  1938.  
  1939.             Config -> TerminalConfig -> SendLF = Number;
  1940.  
  1941.             ConfigChanged = TRUE;
  1942.  
  1943.             break;
  1944.  
  1945.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  1946.  
  1947.             Config -> TerminalConfig -> ReceiveCR = Number;
  1948.  
  1949.             ConfigChanged = TRUE;
  1950.  
  1951.             break;
  1952.  
  1953.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  1954.  
  1955.             Config -> TerminalConfig -> ReceiveLF = Number;
  1956.  
  1957.             ConfigChanged = TRUE;
  1958.  
  1959.             break;
  1960.  
  1961.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  1962.  
  1963.             if(Number < 0)
  1964.                 Number = 0;
  1965.  
  1966.             Config -> TerminalConfig -> NumColumns = Number;
  1967.  
  1968.             ConfigChanged = TRUE;
  1969.  
  1970.             break;
  1971.  
  1972.         case ATTR_PREFS_TERMINAL_NUMLINES:
  1973.  
  1974.             if(Number < 0)
  1975.                 Number = 0;
  1976.  
  1977.             Config -> TerminalConfig -> NumLines = Number;
  1978.  
  1979.             ConfigChanged = TRUE;
  1980.  
  1981.             break;
  1982.  
  1983.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  1984.  
  1985.             strcpy(Config -> TerminalConfig -> KeyMapFileName,String);
  1986.  
  1987.             ConfigChanged = TRUE;
  1988.  
  1989.             break;
  1990.  
  1991.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  1992.  
  1993.             strcpy(Config -> TerminalConfig -> EmulationFileName,String);
  1994.  
  1995.             ConfigChanged = TRUE;
  1996.  
  1997.             break;
  1998.  
  1999.         case ATTR_PREFS_TERMINAL_BEEPNAME:
  2000.  
  2001.             strcpy(Config -> TerminalConfig -> BeepFileName,String);
  2002.  
  2003.             ConfigChanged = TRUE;
  2004.  
  2005.             break;
  2006.  
  2007.         case ATTR_PREFS_TERMINAL_FONTNAME:
  2008.  
  2009.             strcpy(Config -> TerminalConfig -> TextFontName,String);
  2010.  
  2011.             ConfigChanged = TRUE;
  2012.  
  2013.             break;
  2014.  
  2015.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  2016.  
  2017.             if(Number < 1)
  2018.                 Error = ERROR_BAD_NUMBER;
  2019.             else
  2020.             {
  2021.                 Config -> TerminalConfig -> TextFontHeight = Number;
  2022.  
  2023.                 ConfigChanged = TRUE;
  2024.             }
  2025.  
  2026.             break;
  2027.  
  2028.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  2029.  
  2030.             strcpy(Config -> PathConfig -> ASCIIUploadPath,String);
  2031.  
  2032.             ConfigChanged = TRUE;
  2033.  
  2034.             break;
  2035.  
  2036.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  2037.  
  2038.             strcpy(Config -> PathConfig -> ASCIIDownloadPath,String);
  2039.  
  2040.             ConfigChanged = TRUE;
  2041.  
  2042.             break;
  2043.  
  2044.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  2045.  
  2046.             strcpy(Config -> PathConfig -> TextUploadPath,String);
  2047.  
  2048.             ConfigChanged = TRUE;
  2049.  
  2050.             break;
  2051.  
  2052.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  2053.  
  2054.             strcpy(Config -> PathConfig -> TextDownloadPath,String);
  2055.  
  2056.             ConfigChanged = TRUE;
  2057.  
  2058.             break;
  2059.  
  2060.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  2061.  
  2062.             strcpy(Config -> PathConfig -> BinaryUploadPath,String);
  2063.  
  2064.             ConfigChanged = TRUE;
  2065.  
  2066.             break;
  2067.  
  2068.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  2069.  
  2070.             strcpy(Config -> PathConfig -> BinaryDownloadPath,String);
  2071.  
  2072.             ConfigChanged = TRUE;
  2073.  
  2074.             break;
  2075.  
  2076.         case ATTR_PREFS_PATHS_CONFIGPATH:
  2077.  
  2078.             strcpy(Config -> PathConfig -> DefaultStorage,String);
  2079.  
  2080.             ConfigChanged = TRUE;
  2081.  
  2082.             break;
  2083.  
  2084.         case ATTR_PREFS_PATHS_EDITORNAME:
  2085.  
  2086.             strcpy(Config -> PathConfig -> Editor,String);
  2087.  
  2088.             ConfigChanged = TRUE;
  2089.  
  2090.             break;
  2091.  
  2092.         case ATTR_PREFS_PATHS_HELPFILENAME:
  2093.  
  2094.             strcpy(Config -> PathConfig -> HelpFile,String);
  2095.  
  2096.             ConfigChanged = TRUE;
  2097.  
  2098.             break;
  2099.  
  2100.         case ATTR_PREFS_MISC_PRIORITY:
  2101.  
  2102.             if(Number < -128)
  2103.                 Number = -128;
  2104.  
  2105.             if(Number > 127)
  2106.                 Number = 127;
  2107.  
  2108.             Config -> MiscConfig -> Priority = Number;
  2109.  
  2110.             ConfigChanged = TRUE;
  2111.  
  2112.             break;
  2113.  
  2114.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  2115.  
  2116.             Config -> MiscConfig -> BackupConfig = Number;
  2117.  
  2118.             ConfigChanged = TRUE;
  2119.  
  2120.             break;
  2121.  
  2122.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  2123.  
  2124.             Config -> MiscConfig -> OpenFastMacroPanel = Number;
  2125.  
  2126.             ConfigChanged = TRUE;
  2127.  
  2128.             break;
  2129.  
  2130.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  2131.  
  2132.             Config -> MiscConfig -> ReleaseDevice = Number;
  2133.  
  2134.             ConfigChanged = TRUE;
  2135.  
  2136.             break;
  2137.  
  2138.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  2139.  
  2140.             Config -> MiscConfig -> OverridePath = Number;
  2141.  
  2142.             ConfigChanged = TRUE;
  2143.  
  2144.             break;
  2145.  
  2146.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  2147.  
  2148.             Config -> MiscConfig -> AutoUpload = Number;
  2149.  
  2150.             ConfigChanged = TRUE;
  2151.  
  2152.             break;
  2153.  
  2154.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  2155.  
  2156.             Config -> MiscConfig -> SetArchivedBit = Number;
  2157.  
  2158.             ConfigChanged = TRUE;
  2159.  
  2160.             break;
  2161.  
  2162.         case ATTR_PREFS_MISC_COMMENTMODE:
  2163.  
  2164.             Config -> MiscConfig -> IdentifyFiles = Number;
  2165.  
  2166.             ConfigChanged = TRUE;
  2167.  
  2168.             break;
  2169.  
  2170.         case ATTR_PREFS_MISC_TRANSFERICONS:
  2171.  
  2172.             Config -> MiscConfig -> TransferIcons = Number;
  2173.  
  2174.             ConfigChanged = TRUE;
  2175.  
  2176.             break;
  2177.  
  2178.         case ATTR_PREFS_CLIPBOARD_UNIT:
  2179.  
  2180.             if(Number < 0)
  2181.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  2182.             else
  2183.             {
  2184.                 Config -> ClipConfig -> ClipboardUnit = Number;
  2185.  
  2186.                 ConfigChanged = TRUE;
  2187.             }
  2188.  
  2189.             break;
  2190.  
  2191.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  2192.  
  2193.             if(Number < 0)
  2194.                 Error = ERROR_BAD_NUMBER;
  2195.             else
  2196.             {
  2197.                 Config -> ClipConfig -> LineDelay = Number;
  2198.  
  2199.                 ConfigChanged = TRUE;
  2200.             }
  2201.  
  2202.             break;
  2203.  
  2204.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  2205.  
  2206.             if(Number < 0)
  2207.                 Error = ERROR_BAD_NUMBER;
  2208.             else
  2209.             {
  2210.                 Config -> ClipConfig -> CharDelay = Number;
  2211.  
  2212.                 ConfigChanged = TRUE;
  2213.             }
  2214.  
  2215.             break;
  2216.  
  2217.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  2218.  
  2219.             strcpy(Config -> ClipConfig -> InsertPrefix,String);
  2220.  
  2221.             ConfigChanged = TRUE;
  2222.  
  2223.             break;
  2224.  
  2225.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  2226.  
  2227.             strcpy(Config -> ClipConfig -> InsertSuffix,String);
  2228.  
  2229.             ConfigChanged = TRUE;
  2230.  
  2231.             break;
  2232.  
  2233.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  2234.  
  2235.             Config -> CaptureConfig -> LogActions = Number;
  2236.  
  2237.             ConfigChanged = TRUE;
  2238.  
  2239.             break;
  2240.  
  2241.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  2242.  
  2243.             Config -> CaptureConfig -> LogCall = Number;
  2244.  
  2245.             ConfigChanged = TRUE;
  2246.  
  2247.             break;
  2248.  
  2249.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  2250.  
  2251.             strcpy(Config -> CaptureConfig -> LogFileName,String);
  2252.  
  2253.             ConfigChanged = TRUE;
  2254.  
  2255.             break;
  2256.  
  2257.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  2258.  
  2259.             if(Number < 0)
  2260.                 Number = 0;
  2261.  
  2262.             Config -> CaptureConfig -> MaxBufferSize = Number;
  2263.  
  2264.             ConfigChanged = TRUE;
  2265.  
  2266.             break;
  2267.  
  2268.         case ATTR_PREFS_CAPTURE_BUFFER:
  2269.  
  2270.             Config -> CaptureConfig -> BufferEnabled = Number;
  2271.  
  2272.             ConfigChanged = TRUE;
  2273.  
  2274.             break;
  2275.  
  2276.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  2277.  
  2278.             Config -> CaptureConfig -> ConnectAutoCapture = Number;
  2279.  
  2280.             ConfigChanged = TRUE;
  2281.  
  2282.             break;
  2283.  
  2284.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  2285.  
  2286.             Config -> CaptureConfig -> CaptureFilterMode = Number;
  2287.  
  2288.             ConfigChanged = TRUE;
  2289.  
  2290.             break;
  2291.  
  2292.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  2293.  
  2294.             strcpy(Config -> CaptureConfig -> CapturePath,String);
  2295.  
  2296.             ConfigChanged = TRUE;
  2297.  
  2298.             break;
  2299.  
  2300.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  2301.  
  2302.             strcpy(Config -> CaptureConfig -> CallLogFileName,String);
  2303.  
  2304.             ConfigChanged = TRUE;
  2305.  
  2306.             break;
  2307.  
  2308.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  2309.  
  2310.             strcpy(Config -> CaptureConfig -> BufferPath,String);
  2311.  
  2312.             ConfigChanged = TRUE;
  2313.  
  2314.             break;
  2315.  
  2316.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  2317.  
  2318.             strcpy(Config -> FileConfig -> ProtocolFileName,String);
  2319.  
  2320.             ConfigChanged = TRUE;
  2321.  
  2322.             break;
  2323.  
  2324.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  2325.  
  2326.             strcpy(Config -> FileConfig -> TranslationFileName,String);
  2327.  
  2328.             ConfigChanged = TRUE;
  2329.  
  2330.             break;
  2331.  
  2332.         case ATTR_PREFS_FILE_MACROFILENAME:
  2333.  
  2334.             strcpy(Config -> FileConfig -> MacroFileName,String);
  2335.  
  2336.             ConfigChanged = TRUE;
  2337.  
  2338.             break;
  2339.  
  2340.         case ATTR_PREFS_FILE_CURSORFILENAME:
  2341.  
  2342.             strcpy(Config -> FileConfig -> CursorFileName,String);
  2343.  
  2344.             ConfigChanged = TRUE;
  2345.  
  2346.             break;
  2347.  
  2348.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  2349.  
  2350.             strcpy(Config -> FileConfig -> FastMacroFileName,String);
  2351.  
  2352.             ConfigChanged = TRUE;
  2353.  
  2354.             break;
  2355.  
  2356.         case ATTR_PREFS_EMULATION_CURSORMODE:
  2357.  
  2358.             Config -> EmulationConfig -> CursorMode = Number;
  2359.  
  2360.             ConfigChanged = TRUE;
  2361.  
  2362.             break;
  2363.  
  2364.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  2365.  
  2366.             Config -> EmulationConfig -> NumericMode = Number;
  2367.  
  2368.             ConfigChanged = TRUE;
  2369.  
  2370.             break;
  2371.  
  2372.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  2373.  
  2374.             Config -> EmulationConfig -> CursorWrap = Number;
  2375.  
  2376.             ConfigChanged = TRUE;
  2377.  
  2378.             break;
  2379.  
  2380.         case ATTR_PREFS_EMULATION_LINEWRAP:
  2381.  
  2382.             Config -> EmulationConfig -> LineWrap = Number;
  2383.  
  2384.             ConfigChanged = TRUE;
  2385.  
  2386.             break;
  2387.  
  2388.         case ATTR_PREFS_EMULATION_INSERTMODE:
  2389.  
  2390.             Config -> EmulationConfig -> InsertMode = Number;
  2391.  
  2392.             ConfigChanged = TRUE;
  2393.  
  2394.             break;
  2395.  
  2396.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  2397.  
  2398.             Config -> EmulationConfig -> NewLineMode = Number;
  2399.  
  2400.             ConfigChanged = TRUE;
  2401.  
  2402.             break;
  2403.  
  2404.         case ATTR_PREFS_EMULATION_FONTSCALEMODE:
  2405.  
  2406.             Config -> EmulationConfig -> FontScale = Number;
  2407.  
  2408.             ConFontScaleUpdate();
  2409.  
  2410.             ConfigChanged = TRUE;
  2411.  
  2412.             break;
  2413.  
  2414.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  2415.  
  2416.             Config -> EmulationConfig -> ScrollMode = Number;
  2417.  
  2418.             ConfigChanged = TRUE;
  2419.  
  2420.             break;
  2421.  
  2422.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  2423.  
  2424.             Config -> EmulationConfig -> DestructiveBackspace = Number;
  2425.  
  2426.             ConfigChanged = TRUE;
  2427.  
  2428.             break;
  2429.  
  2430.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  2431.  
  2432.             Config -> EmulationConfig -> SwapBSDelete = Number;
  2433.  
  2434.             ConfigChanged = TRUE;
  2435.  
  2436.             break;
  2437.  
  2438.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  2439.  
  2440.             Config -> EmulationConfig -> PrinterEnabled = Number;
  2441.  
  2442.             ConfigChanged = TRUE;
  2443.  
  2444.             break;
  2445.  
  2446.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  2447.  
  2448.             strcpy(Config -> EmulationConfig -> AnswerBack,String);
  2449.  
  2450.             ConfigChanged = TRUE;
  2451.  
  2452.             break;
  2453.  
  2454.         case ATTR_PREFS_SPEECH_RATE:
  2455.  
  2456.             if(Number < MINRATE)
  2457.                 Number = MINRATE;
  2458.  
  2459.             if(Number > MAXRATE)
  2460.                 Number = MAXRATE;
  2461.  
  2462.             SpeechConfig . Rate = Number;
  2463.  
  2464.             SpeechChanged = TRUE;
  2465.  
  2466.             break;
  2467.  
  2468.         case ATTR_PREFS_SPEECH_PITCH:
  2469.  
  2470.             if(Number < MINPITCH)
  2471.                 Number = MINPITCH;
  2472.  
  2473.             if(Number > MAXPITCH)
  2474.                 Number = MAXPITCH;
  2475.  
  2476.             SpeechConfig . Pitch = Number;
  2477.  
  2478.             SpeechChanged = TRUE;
  2479.  
  2480.             break;
  2481.  
  2482.         case ATTR_PREFS_SPEECH_FREQUENCY:
  2483.  
  2484.             if(Number < MINFREQ)
  2485.                 Number = MINFREQ;
  2486.  
  2487.             if(Number > MAXFREQ)
  2488.                 Number = MAXFREQ;
  2489.  
  2490.             SpeechConfig . Frequency = Number;
  2491.  
  2492.             SpeechChanged = TRUE;
  2493.  
  2494.             break;
  2495.  
  2496.         case ATTR_PREFS_SPEECH_SEXMODE:
  2497.  
  2498.             SpeechConfig . Sex = Number;
  2499.  
  2500.             SpeechChanged = TRUE;
  2501.  
  2502.             break;
  2503.  
  2504.         case ATTR_PREFS_SPEECH_VOLUME:
  2505.  
  2506.             if(Number < 0)
  2507.                 Number = 0;
  2508.  
  2509.             if(Number > 64)
  2510.                 Number = 64;
  2511.  
  2512.             SpeechConfig . Volume = Number;
  2513.  
  2514.             SpeechChanged = TRUE;
  2515.  
  2516.             break;
  2517.  
  2518.         case ATTR_PREFS_SPEECH_SPEECH:
  2519.  
  2520.             SpeechConfig . Enabled = Number;
  2521.  
  2522.             SpeechChanged = TRUE;
  2523.  
  2524.             break;
  2525.  
  2526.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  2527.  
  2528.             if(Count1 < 0 || Count1 > 255)
  2529.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2530.             else
  2531.             {
  2532.                 if(SendTable && *String)
  2533.                 {
  2534.                     struct TranslationEntry *Entry = AllocTranslationEntry(String);
  2535.     
  2536.                     if(Entry)
  2537.                     {
  2538.                         if(SendTable[Count1])
  2539.                             FreeTranslationEntry(SendTable[Count1]);
  2540.     
  2541.                         SendTable[Count1] = Entry;
  2542.  
  2543.                         TranslationChanged = TRUE;
  2544.                     }
  2545.                     else
  2546.                         Error = ERROR_NO_FREE_STORE;
  2547.                 }
  2548.                 else
  2549.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  2550.             }
  2551.  
  2552.             UpdateRequired = FALSE;
  2553.  
  2554.             break;
  2555.  
  2556.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  2557.  
  2558.             if(Count1 < 0 || Count1 > 255)
  2559.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2560.             else
  2561.             {
  2562.                 if(ReceiveTable && *String)
  2563.                 {
  2564.                     struct TranslationEntry *Entry = AllocTranslationEntry(String);
  2565.     
  2566.                     if(Entry)
  2567.                     {
  2568.                         if(ReceiveTable[Count1])
  2569.                             FreeTranslationEntry(ReceiveTable[Count1]);
  2570.     
  2571.                         ReceiveTable[Count1] = Entry;
  2572.  
  2573.                         TranslationChanged = TRUE;
  2574.                     }
  2575.                     else
  2576.                         Error = ERROR_NO_FREE_STORE;
  2577.                 }
  2578.                 else
  2579.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  2580.             }
  2581.  
  2582.             UpdateRequired = FALSE;
  2583.  
  2584.             break;
  2585.  
  2586.         case ATTR_PREFS_FASTMACROS_X_NAME:
  2587.  
  2588.             if(Count1 < FastMacroCount && Count1 >= 0)
  2589.             {
  2590.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  2591.  
  2592.                 strcpy(Node -> mn_Macro,String);
  2593.  
  2594.                 FastMacrosChanged = TRUE;
  2595.             }
  2596.             else
  2597.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2598.  
  2599.             UpdateRequired = FALSE;
  2600.  
  2601.             break;
  2602.  
  2603.         case ATTR_PREFS_FASTMACROS_X_CODE:
  2604.  
  2605.             if(Count1 < FastMacroCount && Count1 >= 0)
  2606.             {
  2607.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  2608.  
  2609.                 strcpy(Node -> mn_Code,String);
  2610.  
  2611.                 FastMacrosChanged = TRUE;
  2612.             }
  2613.             else
  2614.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2615.  
  2616.             UpdateRequired = FALSE;
  2617.  
  2618.             break;
  2619.  
  2620.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  2621.  
  2622.             strcpy(Hotkeys . termScreenToFront,String);
  2623.  
  2624.             HotkeysChanged = TRUE;
  2625.  
  2626.             break;
  2627.  
  2628.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  2629.  
  2630.             strcpy(Hotkeys . BufferScreenToFront,String);
  2631.  
  2632.             HotkeysChanged = TRUE;
  2633.  
  2634.             break;
  2635.  
  2636.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  2637.  
  2638.             strcpy(Hotkeys . SkipDialEntry,String);
  2639.  
  2640.             HotkeysChanged = TRUE;
  2641.  
  2642.             break;
  2643.  
  2644.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  2645.  
  2646.             strcpy(Hotkeys . AbortARexx,String);
  2647.  
  2648.             HotkeysChanged = TRUE;
  2649.  
  2650.             break;
  2651.  
  2652.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  2653.  
  2654.             if(Number < -128)
  2655.                 Number = -128;
  2656.  
  2657.             if(Number > 127)
  2658.                 Number = 127;
  2659.  
  2660.             Hotkeys . CommodityPriority = Number;
  2661.  
  2662.             HotkeysChanged = TRUE;
  2663.  
  2664.             break;
  2665.  
  2666.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  2667.  
  2668.             Hotkeys . HotkeysEnabled = Number;
  2669.  
  2670.             HotkeysChanged = TRUE;
  2671.  
  2672.             break;
  2673.  
  2674.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  2675.  
  2676.             strcpy(CursorKeys -> Keys[0][0],String);
  2677.  
  2678.             CursorKeysChanged = TRUE;
  2679.  
  2680.             UpdateRequired = FALSE;
  2681.  
  2682.             break;
  2683.  
  2684.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  2685.  
  2686.             strcpy(CursorKeys -> Keys[0][1],String);
  2687.  
  2688.             CursorKeysChanged = TRUE;
  2689.  
  2690.             UpdateRequired = FALSE;
  2691.  
  2692.             break;
  2693.  
  2694.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  2695.  
  2696.             strcpy(CursorKeys -> Keys[0][2],String);
  2697.  
  2698.             CursorKeysChanged = TRUE;
  2699.  
  2700.             UpdateRequired = FALSE;
  2701.  
  2702.             break;
  2703.  
  2704.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  2705.  
  2706.             strcpy(CursorKeys -> Keys[0][3],String);
  2707.  
  2708.             CursorKeysChanged = TRUE;
  2709.  
  2710.             UpdateRequired = FALSE;
  2711.  
  2712.             break;
  2713.  
  2714.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  2715.  
  2716.             strcpy(CursorKeys -> Keys[1][0],String);
  2717.  
  2718.             CursorKeysChanged = TRUE;
  2719.  
  2720.             UpdateRequired = FALSE;
  2721.  
  2722.             break;
  2723.  
  2724.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  2725.  
  2726.             strcpy(CursorKeys -> Keys[1][1],String);
  2727.  
  2728.             CursorKeysChanged = TRUE;
  2729.  
  2730.             UpdateRequired = FALSE;
  2731.  
  2732.             break;
  2733.  
  2734.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  2735.  
  2736.             strcpy(CursorKeys -> Keys[1][2],String);
  2737.  
  2738.             CursorKeysChanged = TRUE;
  2739.  
  2740.             UpdateRequired = FALSE;
  2741.  
  2742.             break;
  2743.  
  2744.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  2745.  
  2746.             strcpy(CursorKeys -> Keys[1][3],String);
  2747.  
  2748.             CursorKeysChanged = TRUE;
  2749.  
  2750.             UpdateRequired = FALSE;
  2751.  
  2752.             break;
  2753.  
  2754.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  2755.  
  2756.             strcpy(CursorKeys -> Keys[2][0],String);
  2757.  
  2758.             CursorKeysChanged = TRUE;
  2759.  
  2760.             UpdateRequired = FALSE;
  2761.  
  2762.             break;
  2763.  
  2764.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  2765.  
  2766.             strcpy(CursorKeys -> Keys[2][1],String);
  2767.  
  2768.             CursorKeysChanged = TRUE;
  2769.  
  2770.             UpdateRequired = FALSE;
  2771.  
  2772.             break;
  2773.  
  2774.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  2775.  
  2776.             strcpy(CursorKeys -> Keys[2][2],String);
  2777.  
  2778.             CursorKeysChanged = TRUE;
  2779.  
  2780.             UpdateRequired = FALSE;
  2781.  
  2782.             break;
  2783.  
  2784.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  2785.  
  2786.             strcpy(CursorKeys -> Keys[2][3],String);
  2787.  
  2788.             CursorKeysChanged = TRUE;
  2789.  
  2790.             UpdateRequired = FALSE;
  2791.  
  2792.             break;
  2793.  
  2794.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  2795.  
  2796.             strcpy(CursorKeys -> Keys[3][0],String);
  2797.  
  2798.             CursorKeysChanged = TRUE;
  2799.  
  2800.             UpdateRequired = FALSE;
  2801.  
  2802.             break;
  2803.  
  2804.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  2805.  
  2806.             strcpy(CursorKeys -> Keys[3][1],String);
  2807.  
  2808.             CursorKeysChanged = TRUE;
  2809.  
  2810.             UpdateRequired = FALSE;
  2811.  
  2812.             break;
  2813.  
  2814.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  2815.  
  2816.             strcpy(CursorKeys -> Keys[3][2],String);
  2817.  
  2818.             CursorKeysChanged = TRUE;
  2819.  
  2820.             UpdateRequired = FALSE;
  2821.  
  2822.             break;
  2823.  
  2824.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  2825.  
  2826.             strcpy(CursorKeys -> Keys[3][3],String);
  2827.  
  2828.             CursorKeysChanged = TRUE;
  2829.  
  2830.             UpdateRequired = FALSE;
  2831.  
  2832.             break;
  2833.  
  2834.         case ATTR_PREFS_FUNCTIONKEYS_X:
  2835.  
  2836.             if(Count1 >= 1 && Count1 <= 10)
  2837.             {
  2838.                 strcpy(MacroKeys -> Keys[0][Count1 - 1],String);
  2839.  
  2840.                 MacroChanged = TRUE;
  2841.             }
  2842.             else
  2843.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2844.  
  2845.             UpdateRequired = FALSE;
  2846.  
  2847.             break;
  2848.  
  2849.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  2850.  
  2851.             if(Count1 >= 1 && Count1 <= 10)
  2852.             {
  2853.                 strcpy(MacroKeys -> Keys[1][Count1 - 1],String);
  2854.  
  2855.                 MacroChanged = TRUE;
  2856.             }
  2857.             else
  2858.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2859.  
  2860.             UpdateRequired = FALSE;
  2861.  
  2862.             break;
  2863.  
  2864.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  2865.  
  2866.             if(Count1 >= 1 && Count1 <= 10)
  2867.             {
  2868.                 strcpy(MacroKeys -> Keys[2][Count1 - 1],String);
  2869.  
  2870.                 MacroChanged = TRUE;
  2871.             }
  2872.             else
  2873.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2874.  
  2875.             UpdateRequired = FALSE;
  2876.  
  2877.             break;
  2878.  
  2879.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  2880.  
  2881.             if(Count1 >= 1 && Count1 <= 10)
  2882.             {
  2883.                 strcpy(MacroKeys -> Keys[3][Count1 - 1],String);
  2884.  
  2885.                 MacroChanged = TRUE;
  2886.             }
  2887.             else
  2888.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  2889.  
  2890.             UpdateRequired = FALSE;
  2891.  
  2892.             break;
  2893.  
  2894.         case ATTR_PREFS_PROTOCOL:
  2895.  
  2896.             strcpy(ProtocolOptsBuffer,String);
  2897.             break;
  2898.  
  2899.         case ATTR_PREFS_CONSOLE:
  2900.  
  2901.             strcpy(WindowName,String);
  2902.  
  2903.             UpdateRequired = FALSE;
  2904.  
  2905.             break;
  2906.     }
  2907.  
  2908.     if(Error)
  2909.         UpdateRequired = FALSE;
  2910.  
  2911.     return(Error);
  2912. }
  2913.  
  2914.     /* Cheap shortcut :-) */
  2915.  
  2916. #define Args    Pkt -> Array
  2917. #define Results    Pkt -> Results
  2918.  
  2919.     /* RexxGetAttr(struct RexxPkt *Pkt):
  2920.      *
  2921.      *    Get some global variable(s). Care to rewrite this beastie to
  2922.      *    work recursively?
  2923.      */
  2924.  
  2925. STRPTR __regargs
  2926. RexxGetAttr(struct RexxPkt *Pkt)
  2927. {
  2928.     enum    {    ARG_GETATTR_OBJECT,ARG_GETATTR_FIELD,ARG_GETATTR_STEM,
  2929.             ARG_GETATTR_VAR };
  2930.  
  2931.     UBYTE SrcName[160];
  2932.     WORD Index,Count1,Count2;
  2933.  
  2934.     if(Args[ARG_GETATTR_FIELD])
  2935.         SPrintf(SrcName,"%s.%s",Args[ARG_GETATTR_OBJECT],Args[ARG_GETATTR_FIELD]);
  2936.     else
  2937.         strcpy(SrcName,Args[ARG_GETATTR_OBJECT]);
  2938.  
  2939.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  2940.     {
  2941.         Results[0] = RC_ERROR;
  2942.         Results[1] = TERMERROR_UNKNOWN_OBJECT;
  2943.     }
  2944.     else
  2945.     {
  2946.         UBYTE DstName[160];
  2947.  
  2948.         if(AttributeTable[Index] . Type == INFO_STEM)
  2949.         {
  2950.             if(!Args[ARG_GETATTR_STEM])
  2951.             {
  2952.                 Results[0] = RC_ERROR;
  2953.                 Results[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  2954.             }
  2955.             else
  2956.             {
  2957.                 STRPTR    Result;
  2958.                 LONG    Level,Max,Min = 0;
  2959.  
  2960.                 strcpy(DstName,Args[ARG_GETATTR_STEM]);
  2961.  
  2962.                 Level = AttributeTable[Index] . Level;
  2963.  
  2964.                 do
  2965.                 {
  2966.                     if(AttributeTable[Index] . Name)
  2967.                     {
  2968.                         if(AttributeTable[Index] . Type != INFO_STEM)
  2969.                         {
  2970.                             if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  2971.                             {
  2972.                                 Results[0] = RC_ERROR;
  2973.  
  2974.                                 break;
  2975.                             }
  2976.                             else
  2977.                             {
  2978.                                 if(!AttributeTable[Index + 1] . Name)
  2979.                                     Max = Atol(Result);
  2980.  
  2981.                                 if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE)))
  2982.                                     break;
  2983.                             }
  2984.                         }
  2985.                         else
  2986.                         {
  2987.                             if(!AttributeTable[Index + 1] . Name)
  2988.                             {
  2989.                                     /* Special cases! */
  2990.  
  2991.                                 switch(AttributeTable[Index] . NodeID)
  2992.                                 {
  2993.                                     case ATTR_PREFS_TRANSLATIONS:
  2994.  
  2995.                                         Max = 256;
  2996.                                         break;
  2997.  
  2998.                                     case ATTR_PREFS_FUNCTIONKEYS:
  2999.                                     case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  3000.                                     case ATTR_PREFS_FUNCTIONKEYS_ALT:
  3001.                                     case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  3002.  
  3003.                                         Max = 11;
  3004.                                         Min = 1;
  3005.                                         break;
  3006.  
  3007.                                     default:
  3008.  
  3009.                                         if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  3010.                                         {
  3011.                                             Results[0] = RC_ERROR;
  3012.  
  3013.                                             break;
  3014.                                         }
  3015.                                         else
  3016.                                             Max = Atol(Result);
  3017.  
  3018.                                         break;
  3019.                                 }
  3020.                             }
  3021.                         }
  3022.                     }
  3023.                     else
  3024.                     {
  3025.                         LONG i,j;
  3026.  
  3027.                         for(i = Min ; i < Max ; i++)
  3028.                         {
  3029.                             j = 0;
  3030.  
  3031.                             do
  3032.                             {
  3033.                                 if(AttributeTable[Index + j] . Type != INFO_STEM)
  3034.                                 {
  3035.                                     if(Results[1] = GetSingleAttribute(AttributeTable[Index + j] . NodeID,Index + j,i,&Result))
  3036.                                     {
  3037.                                         Results[0] = RC_ERROR;
  3038.  
  3039.                                         break;
  3040.                                     }
  3041.                                     else
  3042.                                     {
  3043.                                         if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE)))
  3044.                                             break;
  3045.                                     }
  3046.                                 }
  3047.  
  3048.                                 j++;
  3049.                             }
  3050.                             while(AttributeTable[Index + j] . Level > Level && !Results[0]);
  3051.                         }
  3052.  
  3053.                         while(AttributeTable[Index + 1] . Level > Level)
  3054.                             Index++;
  3055.  
  3056.                         Min = 0;
  3057.  
  3058.                         if(Results[0])
  3059.                             break;
  3060.                     }
  3061.  
  3062.                     Index++;
  3063.                 }
  3064.                 while(Index < AttributeTableSize && AttributeTable[Index] . Level > Level);
  3065.             }
  3066.         }
  3067.         else
  3068.         {
  3069.             STRPTR Result;
  3070.  
  3071.             if(Args[ARG_GETATTR_STEM])
  3072.                 SPrintf(DstName,"%s.%s",Args[ARG_GETATTR_STEM],SrcName);
  3073.             else
  3074.             {
  3075.                 if(Args[ARG_GETATTR_VAR])
  3076.                     strcpy(DstName,Args[ARG_GETATTR_VAR]);
  3077.                 else
  3078.                     DstName[0] = 0;
  3079.             }
  3080.  
  3081.             if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  3082.                 Results[0] = RC_ERROR;
  3083.             else
  3084.             {
  3085.                 if(DstName[0])
  3086.                     CreateVar(Result,Pkt,DstName);
  3087.                 else
  3088.                     return(CreateResult(Result,Results));
  3089.             }
  3090.         }
  3091.     }
  3092.  
  3093.     return(NULL);
  3094. }
  3095.  
  3096.     /* RexxSetAttr(struct RexxPkt *Pkt):
  3097.      *
  3098.      *    Set some global variable(s). Care to rewrite this beastie to
  3099.      *    work recursively?
  3100.      */
  3101.  
  3102. STRPTR __regargs
  3103. RexxSetAttr(struct RexxPkt *Pkt)
  3104. {
  3105.     enum    {    ARG_SETATTR_OBJECT,ARG_SETATTR_FIELD,ARG_SETATTR_STEM,
  3106.             ARG_SETATTR_VAR };
  3107.  
  3108.     UBYTE SrcName[160];
  3109.     WORD Index,Count1,Count2;
  3110.  
  3111.     if(Args[ARG_SETATTR_FIELD])
  3112.         SPrintf(SrcName,"%s.%s",Args[ARG_SETATTR_OBJECT],Args[ARG_SETATTR_FIELD]);
  3113.     else
  3114.         strcpy(SrcName,Args[ARG_SETATTR_OBJECT]);
  3115.  
  3116.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  3117.     {
  3118.         Results[0] = RC_ERROR;
  3119.         Results[1] = TERMERROR_UNKNOWN_OBJECT;
  3120.     }
  3121.     else
  3122.     {
  3123.         if(AttributeTable[Index] . ReadOnly)
  3124.         {
  3125.             Results[0] = RC_ERROR;
  3126.             Results[1] = TERMERROR_INFORMATION_IS_READ_ONLY;
  3127.         }
  3128.         else
  3129.         {
  3130.             UBYTE DstName[160];
  3131.  
  3132.             if(AttributeTable[Index] . Type == INFO_STEM)
  3133.             {
  3134.                 if(!Args[ARG_SETATTR_STEM])
  3135.                 {
  3136.                     Results[0] = RC_ERROR;
  3137.                     Results[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  3138.                 }
  3139.                 else
  3140.                 {
  3141.                     UBYTE    FullName[160];
  3142.                     STRPTR    Result;
  3143.                     LONG    Level,Max,Min = 0;
  3144.  
  3145.                     strcpy(DstName,Args[ARG_SETATTR_STEM]);
  3146.  
  3147.                     Level = AttributeTable[Index] . Level;
  3148.  
  3149.                     do
  3150.                     {
  3151.                         if(AttributeTable[Index] . Name)
  3152.                         {
  3153.                             if(!AttributeTable[Index + 1] . Name)
  3154.                             {
  3155.                                 if(AttributeTable[Index] . Type == INFO_STEM)
  3156.                                 {
  3157.                                         /* Special cases! */
  3158.     
  3159.                                     switch(AttributeTable[Index] . NodeID)
  3160.                                     {
  3161.                                         case ATTR_PREFS_TRANSLATIONS:
  3162.  
  3163.                                             Max = 256;
  3164.                                             break;
  3165.     
  3166.                                         case ATTR_PREFS_FUNCTIONKEYS:    
  3167.                                         case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  3168.                                         case ATTR_PREFS_FUNCTIONKEYS_ALT:
  3169.                                         case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  3170.     
  3171.                                             Max = 11;
  3172.                                             Min = 1;
  3173.                                             break;
  3174.     
  3175.                                         default:
  3176.  
  3177.                                             Max = 0;
  3178.                                             break;
  3179.                                     }
  3180.                                 }
  3181.  
  3182.                                 if(!Max)
  3183.                                 {
  3184.                                     if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  3185.                                     {
  3186.                                         Results[0] = RC_ERROR;
  3187.  
  3188.                                         break;
  3189.                                     }
  3190.                                     else
  3191.                                         Max = Atol(Result);
  3192.                                 }
  3193.                             }
  3194.  
  3195.                             if(AttributeTable[Index] . Type != INFO_STEM)
  3196.                             {
  3197.                                 SPrintf(FullName,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE));
  3198.  
  3199.                                 if(!GetRexxVar(Pkt -> RexxMsg,FullName,&Result))
  3200.                                 {
  3201.                                     if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Result))
  3202.                                     {
  3203.                                         Results[0] = RC_ERROR;
  3204.  
  3205.                                         break;
  3206.                                     }
  3207.                                 }
  3208.                                 else
  3209.                                     Results[0] = RC_ERROR;
  3210.                             }
  3211.                         }
  3212.                         else
  3213.                         {
  3214.                             LONG i,j;
  3215.  
  3216.                             for(i = Min ; i < Max ; i++)
  3217.                             {
  3218.                                 j = 0;
  3219.     
  3220.                                 do
  3221.                                 {
  3222.                                     if(AttributeTable[Index + j] . Type != INFO_STEM)
  3223.                                     {
  3224.                                         SPrintf(FullName,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE));
  3225.  
  3226.                                         if(!GetRexxVar(Pkt -> RexxMsg,FullName,&Result))
  3227.                                         {
  3228.                                             if(Results[1] = SetSingleAttribute(AttributeTable[Index + j] . NodeID,Index + j,i,Result))
  3229.                                             {
  3230.                                                 Results[0] = RC_ERROR;
  3231.  
  3232.                                                 break;
  3233.                                             }
  3234.                                         }
  3235.                                         else
  3236.                                             Results[0] = RC_ERROR;
  3237.                                     }
  3238.  
  3239.                                     j++;
  3240.                                 }
  3241.                                 while(AttributeTable[Index + j] . Level > Level && !Results[0]);
  3242.                             }
  3243.  
  3244.                             while(AttributeTable[Index + 1] . Level > Level)
  3245.                                 Index++;
  3246.  
  3247.                             Min = 0;
  3248.  
  3249.                             if(Results[0])
  3250.                                 break;
  3251.                         }
  3252.  
  3253.                         Index++;
  3254.                     }
  3255.                     while(Index < AttributeTableSize && AttributeTable[Index] . Level > Level);
  3256.                 }
  3257.             }
  3258.             else
  3259.             {
  3260.                 STRPTR Result;
  3261.  
  3262.                 if(Args[ARG_SETATTR_STEM])
  3263.                 {
  3264.                     SPrintf(DstName,"%s.%s",Args[ARG_SETATTR_STEM],SrcName);
  3265.  
  3266.                     if(!GetRexxVar(Pkt -> RexxMsg,DstName,&Result))
  3267.                     {
  3268.                         if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Result))
  3269.                             Results[0] = RC_ERROR;
  3270.                     }
  3271.                     else
  3272.                         Results[0] = RC_ERROR;
  3273.                 }
  3274.                 else
  3275.                 {
  3276.                     if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Args[ARG_SETATTR_VAR]))
  3277.                         Results[0] = RC_ERROR;
  3278.                 }
  3279.             }
  3280.         }
  3281.     }
  3282.  
  3283.     return(NULL);
  3284. }
  3285.