home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR21 / DOUGM.ZIP / DM168SRC.ZIP / EXECUTE.C < prev    next >
Text File  |  1992-07-30  |  23KB  |  862 lines

  1. /***************************************************************************/
  2. byte Do_Query_Window(query)
  3.  
  4. Menu *query;
  5.  
  6. {
  7.     byte return_value;
  8.  
  9.     if ( !Windowfy_Menu( query ) ){
  10.         event.action = ESCAPE;
  11.         event.data = 1;
  12.         return(0);
  13.     }
  14.  
  15.     Display_Menu(NULL);
  16.     Select(current_item);
  17.  
  18.     for (;;){
  19.         Wait_For_Event();
  20.         if (event.action == KEY_PRESS)
  21.             Scan_For_Letter(event.data);            
  22.  
  23.         switch ( event.action ){
  24.             case GOTO_ITEM:
  25.                 Select( Number_To_Item( event.data ) );
  26.                 break;
  27.             case MOVE_UP:
  28.                 Select( Previous_Item());
  29.                 break;
  30.             case MOVE_DOWN:
  31.                 Select( Next_Item());
  32.                 break;
  33.             case GOTO_BOTTOM:
  34.                   Select( End_Item());
  35.                 break;
  36.             case GOTO_TOP:
  37.                   Select( Home_Item());
  38.                 break;
  39.             case SPECIAL:
  40.             case ESCAPE:
  41.             case DO_ITEM:
  42.     /* this is done this way because Remove window canges current_item */
  43.                 return_value = current_item->item_number;
  44.                 Remove_Window();
  45.                 return( return_value );
  46.         }
  47.     }
  48. }
  49.  
  50. /***************************************************************************/
  51. void Exit_Query()
  52.  
  53. {
  54.     Item *no,*yes;
  55.     Menu *exit_query;
  56.  
  57.     l_len = 12;
  58.     exit_query = Allocate_Menu();
  59.     strcpy(exit_query->title,"Exit Menu?");
  60.  
  61.     no = Allocate_Item();
  62.     strcpy(no->title,"No");
  63.     yes = Allocate_Item();
  64.     strcpy(yes->title,"Yes");
  65.  
  66.     exit_query->first_item=no;
  67.     no->next_item=yes;
  68.     no->last_item=NULL;
  69.     no->title_length=2;
  70.     yes->last_item=no;
  71.     yes->next_item=NULL;
  72.     yes->title_length=3;
  73.  
  74.             /* make items choosable */
  75.     no->first_line= current_item->first_line;
  76.     yes->first_line= current_item->first_line;
  77.     no->item_number=1;
  78.     yes->item_number=2;
  79.     
  80.     exit_query->number_of_items = 2;
  81.     exit_query->title_length    = 10;
  82.     exit_query->offset_x = CENTER;
  83.     exit_query->offset_y = CENTER;
  84.     exit_query->palette  = message_palette;
  85.  
  86.     if ( Do_Query_Window(exit_query) == 2 && event.action == DO_ITEM){
  87.         Clean_Up();
  88.         exit(LEAVE_MENU);
  89.     }
  90.  
  91.     free(exit_query);
  92.     free(no);
  93.     free(yes);
  94. }
  95.  
  96. /**************************************************************************/
  97. void Choice_Query(place,temp)
  98.  
  99. char *place,temp[];
  100.  
  101. {
  102.     Menu *choice_query;
  103.     Item *item=NULL;
  104.     Linked_Text *line = current_text;
  105.     byte i, value;
  106.      
  107.     l_len = MAX_LINE;
  108.     choice_query = Allocate_Menu();
  109.  
  110.     for (i = 0; *place != ',' && *place!= '\0';i++)
  111.         choice_query->title[i] = *(place++);
  112.     choice_query->title[i] = '\0';
  113.     choice_query->title_length = strlen(choice_query->title);
  114.  
  115.     if (*place != '\0') place++;
  116.     choice_query->offset_x = Get_Value(place,default_x);
  117.     place = After_Comma(place);
  118.     choice_query->offset_y = Get_Value(place,default_y);
  119.     place = After_Comma(place);
  120.     choice_query->palette = Get_Palette(place,current_menu->palette);
  121.     
  122.     line = line->next_line;
  123.  
  124.     choice_query->number_of_items = 0;
  125.  
  126.     while (line != NULL && line->text_line[0] == '"'){
  127.         if (item == NULL){
  128.             item = Allocate_Item();
  129.             choice_query->first_item = item;
  130.             item->last_item = NULL;
  131.             item->next_item = NULL;
  132.         }
  133.         else{
  134.             item->next_item = Allocate_Item();
  135.             item->next_item->last_item = item;
  136.             item = item->next_item;
  137.             item->next_item = NULL;
  138.         }
  139.  
  140.             /* read option from quotes */
  141.         for (i=0; line->text_line[i+1] != '"' && line->text_line[i+1] != '\0'; i++)
  142.             item->title[i] = line->text_line[i+1];
  143.         item->title[i] = '\0';
  144.         item->title_length = i;
  145.         item->item_number = ++choice_query->number_of_items;
  146.  
  147.             /* make it a chooseable option if it should be done */
  148.         item->first_line = NULL;    
  149.         while ( line->text_line[++i] != '\0' )
  150.             if ( line->text_line[i] == '=' )
  151.                 item->first_line = line;    
  152.  
  153.         line = line->next_line;
  154.     }
  155.  
  156.  
  157.     value = Do_Query_Window(choice_query);
  158.  
  159.     while (item->last_item != NULL){
  160.         item = item->last_item;
  161.         free (item->next_item);
  162.     }
  163.     free(item);
  164.     free(choice_query);
  165.  
  166.     if ( event.action != DO_ITEM ){
  167.         return;
  168.     }
  169.  
  170.     line = current_text;              /* find chosen line */
  171.     for (;value>0;value--){
  172.         line = line->next_line;
  173.     }
  174.  
  175.     strcpy( temp, After_Equals(line->text_line) );
  176. }
  177.  
  178. /**************************************************************************/
  179. void String_Query(place,string, show_it)
  180.  
  181. char *place,string[];
  182. boolean show_it;
  183.  
  184. {
  185.     Menu *string_query;
  186.     Item *space_holder;
  187.     byte x,y,length=0,i=0,max_length,color;
  188.     boolean holder = quick_select;
  189.     quick_select = NO;
  190.  
  191.     if (show_it)
  192.         max_length = 56;
  193.     else 
  194.         max_length = 36;
  195.  
  196.     l_len = 10;
  197.     space_holder = Allocate_Item();
  198.     space_holder->first_line = current_item->first_line;
  199.     space_holder->title_length = max_length;
  200.     space_holder->next_item = NULL;
  201.     strcpy(space_holder->title," ");
  202.  
  203.     l_len = 60;
  204.     string_query = Allocate_Menu();
  205.     for (i = 0; *place != ',' && *place!= '\0';i++){
  206.         string_query->title[i] = *(place++);
  207.         if ( i >= 58 )
  208.             break;
  209.     }
  210.     string_query->title[i] = '\0';
  211.     place = After_Comma(place);
  212.     string_query->offset_x = Get_Value(place, CENTER );
  213.     place = After_Comma(place);
  214.     string_query->offset_y = Get_Value(place,(byte)( (max_screen_y/2) +4) );
  215.     place = After_Comma(place);
  216.     string_query->palette = Get_Palette(place,current_menu->palette);
  217.  
  218.     string_query->title_length = i;
  219.     string_query->number_of_items = 1;
  220.     string_query->first_item = space_holder;
  221.  
  222.     if (!Windowfy_Menu(string_query)){
  223.         free(space_holder);
  224.         free(string_query);
  225.         quick_select = holder;
  226.         return;
  227.     }
  228.  
  229.     Display_Menu(NULL);
  230.  
  231.     x = (byte)(left+2);
  232.     y = (byte)(top+3);
  233.     color = (byte)(palette[string_query->palette][TEXT] | palette[string_query->palette][BACK]<<4);
  234.     string[0] = '\0';
  235.     Show_Cursor();
  236.  
  237.     for(;;){
  238.         Put_Cursor( (byte) (x+length) ,y);
  239.         Wait_For_Event();
  240.  
  241.         switch (event.action){
  242.             case KEY_PRESS:
  243.                 if (length < max_length && event.data ){                
  244.                     string[length] = event.data;
  245.                     if (show_it)
  246.                         Draw( (byte)(x+length),y,event.data,color);
  247.                     else
  248.                         Draw( (byte)(x+length),y,'X',color);
  249.                     length++;
  250.                     string[length] = '\0';
  251.                 }
  252.                 break;
  253.             case BACK_SPACE:
  254.                 if (length){
  255.                     length--;
  256.                     string[length] = '\0';
  257.                     Draw( (byte)(x+length),y,' ',color);
  258.                 }
  259.                 break;
  260.             case ESCAPE:
  261.             case DO_ITEM:
  262.             case SPECIAL:
  263.                  Hide_Cursor();
  264.                 Remove_Window();
  265.                 free(space_holder);
  266.                 free(string_query);
  267.                 quick_select = holder;
  268.                 return;
  269.         }
  270.     }
  271. }
  272.  
  273. /**************************************************************************/
  274. void Ask_For_Var(place)
  275.  
  276. char *place;
  277. {
  278.     char temp_string[MAX_LINE];
  279.     byte i;
  280.  
  281.         /* find var.name and record it */
  282.     place = After_Space(place);
  283.     for (i=1; *place != ' ' && *place != ',' && *place != '\0'; i++ )
  284.         temp_string[i] = *(place++);
  285.     temp_string[0] = '%';
  286.     temp_string[i] = '%';
  287.     temp_string[++i] = '\0';
  288.     vars[var_number].name = strdup(temp_string);
  289.     place = After_Comma(place);
  290.  
  291.                  /* get value in temp_string[] */
  292.     if (current_text->next_line->text_line[0] == '"') 
  293.         Choice_Query(place,temp_string);
  294.     else 
  295.         String_Query(place,temp_string,YES);
  296.  
  297.                  /* copy it into var.value */
  298.     vars[var_number].value = strdup(temp_string);
  299.     var_number++;
  300. }
  301.  
  302. /**************************************************************************/
  303. void Ask_For_Pass(place)
  304.  
  305. char *place;
  306.  
  307. {
  308.     Menu *pass_query;
  309.     char user_input[MAX_LINE];    
  310.     char title[] = "Please enter password:";
  311.  
  312.     place = After_Space(place);
  313.  
  314.     String_Query(title,user_input,NO);
  315.  
  316.     if ( event.action == DO_ITEM && stricmp(place,user_input) ) {
  317.         Error_Box("This password is not authorized.","Action aborted.");
  318.         if (event.action != SPECIAL){
  319.             event.action = ESCAPE;
  320.             event.data = 1;
  321.         }
  322.     }
  323. }
  324.  
  325. /**************************************************************************/
  326. void Create_Text_Box(place)
  327.  
  328. char *place;
  329.  
  330. {
  331.     char *line[25];
  332.     char temp[MAX_LINE], *checker;
  333.     Linked_Text *l_line = current_text;
  334.     byte x,y,color,i=0;
  335.  
  336.     place = After_Comma(place);
  337.     x     = Get_Value(place, CENTER );
  338.     place = After_Comma(place);
  339.     y     = Get_Value(place, CENTER );
  340.     place = After_Comma(place);
  341.     color = Get_Palette(place,message_palette);
  342.  
  343.     l_line = l_line->next_line;
  344.  
  345.     while ( l_line != NULL && *(place=l_line->text_line) == '"'){
  346.         if (i <25){
  347.             place++;
  348.             Transcribe_String(place,temp);
  349.             checker=temp;
  350.             while (*checker != '\0'){
  351.                 if (*checker == '"')
  352.                     *checker = '\0';
  353.                 checker++;
  354.             }
  355.             line[i] = strdup(temp);
  356.             i++;
  357.         }
  358.         l_line = l_line->next_line;
  359.     }
  360.     line[i] = NULL;
  361.  
  362.     Display_Text_Box(line,x,y, color);
  363.     Pause_Until_Serious_Action();
  364.     Remove_Window();
  365.  
  366.     for (i=0;line[i] != NULL;i++)
  367.         free(line[i]);
  368. }    
  369. /**************************************************************************/
  370. void Get_Disk_Space(place)
  371.  
  372. char *place;
  373.  
  374. {
  375.      long int minimum = 0;
  376.     byte drive = 0;
  377.     char line1[MAX_LINE],line2[MAX_LINE];
  378.  
  379.     place = After_Space(place);
  380.  
  381.     if (*(place+1)==':' && *(place+2) == ' ')
  382.         drive = *place & 31;
  383.     else{
  384.         Error_Box("Now that's a wierd drive lable.","I can't look there.");
  385.         event.action = ESCAPE;
  386.         event.data = 1;
  387.         return;
  388.     }
  389.  
  390.     place = After_Space(place);
  391.  
  392.     while ( (*place >= '0' && *place <= '9') || *place == ',' || *place == '.'){
  393.         if ( *place != ',' && *place != '.')
  394.             minimum = ( minimum * 10 ) + *place - 48;
  395.         place++;
  396.     }
  397.  
  398.     if ( Disk_Space_Check(drive) < minimum*1000 ){
  399.         sprintf( line1 , "This option requires %lu K bytes",minimum);
  400.         sprintf( line2 , "of free disk space on drive %c:.",drive+64);
  401.         Error_Box( line1, line2 );
  402.         event.action = ESCAPE;
  403.         event.data = 1;
  404.     }
  405. }
  406.  
  407. /**************************************************************************/
  408. void Find_Floppy(place)
  409.  
  410. char *place;
  411.  
  412. {
  413.     char temp[MAX_LINE];
  414.     byte f_drives,i;
  415.  
  416.     char *lines1[] = {"This Application Requires a User's Diskette.","",
  417.                 "** Please Insert a Formatted Diskette. **",
  418.                 "","Press Any Key When Ready,","or Escape to Exit.",NULL};
  419.  
  420.     char *lines2[] = {"Looking for a Formatted Diskette.","",
  421.                 "Please wait.",NULL};
  422.  
  423.     Display_Text_Box(lines1,CENTER,CENTER,current_menu->palette);
  424.     Pause_Until_Serious_Action();
  425.     Remove_Window();
  426.  
  427.     if (event.action == ESCAPE || event.action == SPECIAL)
  428.         return;
  429.  
  430.     place = After_Space(place);
  431.  
  432.     for (i=1; *place != ' ' && *place != ',' && *place != '\0'; i++ )
  433.         temp[i] = *(place++);
  434.     temp[0] = '%';
  435.     temp[i] = '%';
  436.     temp[++i] = '\0';
  437.  
  438.         /* find number of floppies */
  439.     f_drives = *((byte far *) 0x00400010L);
  440.     f_drives = (f_drives & 1 ) + (f_drives >> 6);
  441.  
  442.         /* check for floppy */
  443.     Display_Text_Box(lines2,CENTER,CENTER,current_menu->palette);
  444.  
  445.     for (i = 1; i <= f_drives; i++){
  446.         if ( Disk_Space_Check(i) != -1 )
  447.             break;
  448.     }
  449.     Remove_Window();
  450.  
  451.     if (i > f_drives){
  452.         Error_Box("No Formated Floppy Diskette Was Found.","Action Aborted.");
  453.         if (event.action != SPECIAL){
  454.             event.action = ESCAPE;
  455.             event.data = 1;
  456.         }
  457.         return;
  458.     }
  459.                 /* store var name */
  460.     vars[var_number].name = strdup(temp);
  461.                  /* copy drive name into var.value */
  462.     temp[0] = (char)i+64;
  463.     temp[1] = ':';
  464.     temp[2] = '\0';
  465.     vars[var_number].value = strdup(temp);
  466.     var_number++;
  467. }
  468.  
  469. /**************************************************************************/
  470. void Logout( void )
  471.  
  472. {
  473.     _asm mov ah,0d7h
  474.     _asm int 21h
  475. }
  476.  
  477. /**************************************************************************/
  478. void Reboot( void )
  479.  
  480. {
  481.     typedef void (far *Pointer_to_Bios_Fn)( void );
  482.     Pointer_to_Bios_Fn reboot;
  483.  
  484.     Clean_Up();
  485.  
  486.     reboot = (Pointer_to_Bios_Fn)0xFFFF0000;
  487.         /* store magic number to cause warm boot */
  488.     *(int far *)0x00400072 = 0x1234;
  489.     (*reboot)();
  490. }
  491.  
  492. /**************************************************************************/
  493. void Execute_Item()
  494.  
  495. {
  496.     char temp[MAX_LINE];
  497.  
  498.     if (current_item == NULL){
  499.         Screen_Saver();
  500.         return;
  501.     }
  502.  
  503.     current_text = current_item->first_line;
  504.     event.action = NO_ACTION;
  505.  
  506.     while (current_text != NULL && event.action != ESCAPE && event.action != SPECIAL){
  507.         Transcribe_String(current_text->text_line,temp);
  508.         switch ( What_To_Do(temp) ){
  509.         case ASK_FOR_VAR:
  510.             Ask_For_Var(temp);
  511.                 break;
  512.             case FIND_FLOPPY:
  513.                 Find_Floppy(temp);
  514.                 break;
  515.             case GET_DISK_SPACE:
  516.                 Get_Disk_Space(temp);
  517.                 break;
  518.             case LOGOUT:
  519.                 Logout();
  520.                 break;
  521.             case MAKE_TEXT_BOX:
  522.                 Create_Text_Box(temp);
  523.                 break;
  524.             case PASSWORD:
  525.                 Ask_For_Pass(temp);
  526.                 break;
  527.             case MAKE_BATCH:
  528.                 Make_Batch();
  529.                 break;
  530.             case NEW_WINDOW:
  531.                 Windowfy_Menu( Find_Menu( current_text ) );
  532.                 event.action=ESCAPE;
  533.                 break;
  534.             case IF:
  535.                 Exec_If(temp);
  536.                 break;
  537.             case IF_MEMBER:
  538.                 Exec_If_Member(temp);
  539.                 break;
  540.             case IF_USERNAME:
  541.                 Exec_If_Username(temp);
  542.                 break;
  543.             case ELSE:
  544.                 Exec_Else(temp);
  545.                 break;
  546.             case ENDIF:
  547.                 break;
  548.             case EXIT:
  549.                 Clean_Up();
  550.                 exit(LEAVE_MENU);
  551.             case REBOOT:
  552.                 Reboot();
  553.         }
  554.         if (var_number > MAX_VARS)
  555.             Critical_Error( MEMORY );
  556.         do{
  557.             current_text = current_text->next_line;
  558.             if (current_text == NULL)
  559.                 break;
  560.         }
  561.         while (current_text->text_line[0] == '"');
  562.     }
  563.     while (var_number){
  564.         var_number--;
  565.         free(vars[var_number].name);
  566.         free(vars[var_number].value);
  567.     }
  568.     return;        
  569. }
  570.                     
  571. /**************************************************************************/
  572. execute_option What_To_Do(temp)
  573.  
  574. char *temp;
  575.  
  576. {
  577.     if ( temp[0] == '%')
  578.         return(NEW_WINDOW);
  579.     if ( Compare(temp,"#display") )
  580.         return(MAKE_TEXT_BOX);
  581.     if ( Compare(temp,"#space ") )
  582.         return(GET_DISK_SPACE);
  583.     if ( Compare(temp,"#floppy ") )
  584.         return(FIND_FLOPPY);
  585.     if ( Compare(temp,"#ask ") )
  586.         return(ASK_FOR_VAR);
  587.     if ( Compare(temp,"#password ") )
  588.         return(PASSWORD);
  589.     if ( Compare(temp,"#logout") )
  590.         return(LOGOUT);
  591.     if ( Compare(temp,"#reboot") )
  592.         return(REBOOT);
  593.     if ( Compare(temp,"#exit") )
  594.         return(EXIT);
  595.     if ( Compare(temp,"#if ") )
  596.         return(IF);
  597.     if ( Compare(temp,"#endif") )
  598.         return(ENDIF);
  599.     if ( Compare(temp,"#if_member") )
  600.         return(IF_MEMBER);
  601.     if ( Compare(temp,"#if_username") )
  602.         return(IF_USERNAME);
  603.     if ( Compare(temp,"#else") )
  604.         return(ELSE);
  605.  
  606.     return(MAKE_BATCH);
  607. }
  608.  
  609. /**************************************************************************/
  610. void Make_Batch()
  611.  
  612. {
  613.     char temp[MAX_LINE];
  614.     char *place;
  615.     FILE *Temp_Bat;    
  616.     byte i;
  617.  
  618.     Clean_Up();
  619.  
  620.             /* open file to write */
  621.     Find_Env_Var("%t%",temp,MAX_LINE);
  622.     if ( ( Temp_Bat = fopen(temp, "w" ) ) == NULL )
  623.         Critical_Error(FILE_OPEN);
  624.             /* write file header */
  625.      fputs("@REM   Temporary file for DougMenu :",Temp_Bat);
  626.     for (i=0;i<=win_index;i++){
  627.         fputc(Win[i].item->item_number+64,Temp_Bat);
  628.         fputc(Win[i].event+64,Temp_Bat);
  629.     }
  630.     fputc('\n',Temp_Bat);
  631.  
  632.             /* Write the batch file */
  633.     while (current_text != NULL){
  634.         place = current_text->text_line;
  635.         Transcribe_String(place,temp);
  636.         switch (What_To_Do(place)){
  637.             case IF:
  638.                 Exec_If(temp);
  639.                 break;
  640.             case IF_MEMBER:
  641.                 Exec_If_Member(temp);
  642.                 break;
  643.             case IF_USERNAME:
  644.                 Exec_If_Username(temp);
  645.                 break;
  646.             case ELSE:
  647.                 Exec_Else(temp);
  648.                 break;
  649.             case ENDIF:
  650.                 break;
  651.             case EXIT:
  652.                 fputs("set t=",Temp_Bat);
  653.                 fclose (Temp_Bat);
  654.                 exit(EXECUTE_N_LEAVE);
  655.             default:
  656.                 /* check for variable names */
  657.                 while (*place != '\0'){
  658.                     while (*place == '%'){
  659.                         if ( !Get_DM_Var(place,temp,MAX_LINE)){
  660.                             break;
  661.                         }
  662.                         fputs (temp,Temp_Bat);
  663.                         place++;
  664.                         while (*place != '%')
  665.                             place++;
  666.                         place++;
  667.                     }
  668.                     if (*place != '\0'){
  669.                         fputc(*place,Temp_Bat);
  670.                         place++;
  671.                     }
  672.                 }
  673.                 fputc('\n',Temp_Bat);
  674.         }
  675.         current_text = current_text->next_line;
  676.     }    
  677.     fclose (Temp_Bat);
  678.     exit(EXECUTE_BATCH);
  679. }
  680.  
  681. /***************************************************************************/
  682. void Exec_If( place )
  683.  
  684. char *place;
  685.  
  686. {
  687.     char *var1,*var2;
  688.     byte i=0;
  689.     
  690.     var2 = var1 = After_Space(place);
  691.  
  692.     
  693.     while ( *var2 != '!' && *var2 != '=' && *var2 != '\0' ){
  694.         var2++;
  695.     }
  696.          /* trim spaces from end of var1 */
  697.     if (*var2 != '\0'){
  698.         while (*(var2-1)== ' ')
  699.             *(--var2)='\0';
  700.         while (*var2== '\0')
  701.             var2++;
  702.     }
  703.  
  704.     if ( *var2 == '!'){
  705.         if ( *(var2+1) != '=' )
  706.             Critical_Error(SYNTAX);
  707.         *var2 = '\0';
  708.         var2 += 2;
  709.         while (*var2 == ' ')
  710.             var2++;
  711.         if (stricmp(var1,var2))
  712.             return;
  713.     }            
  714.     else if ( *var2 == '='){
  715.         *var2 = '\0';
  716.         var2++;
  717.         if ( *(var2) == '=' )
  718.             var2++;
  719.         while (*var2 == ' ')
  720.             var2++;
  721.         if (!stricmp(var1,var2)){
  722.             return;
  723.         }
  724.     }
  725.     else if ( *var1 != '%' && *var1 != '\0' ){
  726.         return;
  727.     }
  728.  
  729.     for(i=0;;){
  730.         current_text = current_text->next_line;
  731.         if (current_text == NULL )
  732.             return;
  733.         place = current_text->text_line;
  734.  
  735.         if (Compare(place,"#endif"))
  736.             if (!i--)
  737.                 return;
  738.         if (Compare(place,"#else"))
  739.             if (!i)
  740.                 return;
  741.         if (Compare(place,"#if "))
  742.             i++;
  743.         if (Compare(place,"#if_member"))
  744.             i++;
  745.         if (Compare(place,"#if_group"))
  746.             i++;
  747.     }
  748. }
  749.  
  750. /***************************************************************************/
  751. void Exec_If_Member( place )
  752.  
  753. char *place;
  754.  
  755. {
  756.     char *var1;
  757.     byte i=0;
  758.     
  759.     var1 = After_Space(place);
  760.  
  761.     if (*var1 == '!'){
  762.         var1++;
  763.         if (!IsMember (var1))
  764.             return;
  765.     }
  766.     else
  767.         if (IsMember (var1))
  768.             return;
  769.  
  770.     for(i=0;;){
  771.         current_text = current_text->next_line;
  772.         if (current_text == NULL )
  773.             return;
  774.         place = current_text->text_line;
  775.  
  776.         if (Compare(place,"#endif"))
  777.             if (!i--)
  778.                 return;
  779.         if (Compare(place,"#else"))
  780.             if (!i)
  781.                 return;
  782.         if (Compare(place,"#if "))
  783.             i++;
  784.         if (Compare(place,"#if_member"))
  785.             i++;
  786.         if (Compare(place,"#if_group"))
  787.             i++;
  788.     }
  789. }
  790.  
  791. /***************************************************************************/
  792. void Exec_If_Username( place )
  793.  
  794. char *place;
  795.  
  796. {
  797.     char *var1;
  798.     byte i=0;
  799.      
  800.     var1 = After_Space(place);
  801.  
  802.     if (*var1 == '!'){
  803.         var1++;
  804.         if (stricmp (var1, UserName()))
  805.             return;
  806.     }
  807.     else
  808.         if (!stricmp (var1, UserName()))
  809.             return;
  810.  
  811.     for(i=0;;){
  812.         current_text = current_text->next_line;
  813.         if (current_text == NULL )
  814.             return;
  815.         place = current_text->text_line;
  816.  
  817.         if (Compare(place,"#endif"))
  818.             if (!i--)
  819.                 return;
  820.         if (Compare(place,"#else"))
  821.             if (!i)
  822.                 return;
  823.         if (Compare(place,"#if "))
  824.             i++;
  825.         if (Compare(place,"#if_member"))
  826.             i++;
  827.         if (Compare(place,"#if_group"))
  828.             i++;
  829.     }
  830. }
  831.  
  832. /***************************************************************************/
  833. void Exec_Else( place )
  834.  
  835. char *place;
  836.  
  837. {
  838.     byte i=0;
  839.     
  840.     for(i=0;;){
  841.         current_text = current_text->next_line;
  842.         if (current_text == NULL )
  843.             return;
  844.         place = current_text->text_line;
  845.  
  846.         if (Compare(place,"#endif"))
  847.             if (!i--)
  848.                 return;
  849.         if (Compare(place,"#else"))
  850.             if (!i)
  851.                 return;
  852.         if (Compare(place,"#if "))
  853.             i++;
  854.         if (Compare(place,"#if_member"))
  855.             i++;
  856.         if (Compare(place,"#if_group"))
  857.             i++;
  858.     }
  859. }
  860.  
  861.  
  862.