home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
High Voltage Shareware
/
high1.zip
/
high1
/
DIR21
/
DOUGM.ZIP
/
DM168SRC.ZIP
/
EXECUTE.C
< prev
next >
Wrap
Text File
|
1992-07-30
|
23KB
|
862 lines
/***************************************************************************/
byte Do_Query_Window(query)
Menu *query;
{
byte return_value;
if ( !Windowfy_Menu( query ) ){
event.action = ESCAPE;
event.data = 1;
return(0);
}
Display_Menu(NULL);
Select(current_item);
for (;;){
Wait_For_Event();
if (event.action == KEY_PRESS)
Scan_For_Letter(event.data);
switch ( event.action ){
case GOTO_ITEM:
Select( Number_To_Item( event.data ) );
break;
case MOVE_UP:
Select( Previous_Item());
break;
case MOVE_DOWN:
Select( Next_Item());
break;
case GOTO_BOTTOM:
Select( End_Item());
break;
case GOTO_TOP:
Select( Home_Item());
break;
case SPECIAL:
case ESCAPE:
case DO_ITEM:
/* this is done this way because Remove window canges current_item */
return_value = current_item->item_number;
Remove_Window();
return( return_value );
}
}
}
/***************************************************************************/
void Exit_Query()
{
Item *no,*yes;
Menu *exit_query;
l_len = 12;
exit_query = Allocate_Menu();
strcpy(exit_query->title,"Exit Menu?");
no = Allocate_Item();
strcpy(no->title,"No");
yes = Allocate_Item();
strcpy(yes->title,"Yes");
exit_query->first_item=no;
no->next_item=yes;
no->last_item=NULL;
no->title_length=2;
yes->last_item=no;
yes->next_item=NULL;
yes->title_length=3;
/* make items choosable */
no->first_line= current_item->first_line;
yes->first_line= current_item->first_line;
no->item_number=1;
yes->item_number=2;
exit_query->number_of_items = 2;
exit_query->title_length = 10;
exit_query->offset_x = CENTER;
exit_query->offset_y = CENTER;
exit_query->palette = message_palette;
if ( Do_Query_Window(exit_query) == 2 && event.action == DO_ITEM){
Clean_Up();
exit(LEAVE_MENU);
}
free(exit_query);
free(no);
free(yes);
}
/**************************************************************************/
void Choice_Query(place,temp)
char *place,temp[];
{
Menu *choice_query;
Item *item=NULL;
Linked_Text *line = current_text;
byte i, value;
l_len = MAX_LINE;
choice_query = Allocate_Menu();
for (i = 0; *place != ',' && *place!= '\0';i++)
choice_query->title[i] = *(place++);
choice_query->title[i] = '\0';
choice_query->title_length = strlen(choice_query->title);
if (*place != '\0') place++;
choice_query->offset_x = Get_Value(place,default_x);
place = After_Comma(place);
choice_query->offset_y = Get_Value(place,default_y);
place = After_Comma(place);
choice_query->palette = Get_Palette(place,current_menu->palette);
line = line->next_line;
choice_query->number_of_items = 0;
while (line != NULL && line->text_line[0] == '"'){
if (item == NULL){
item = Allocate_Item();
choice_query->first_item = item;
item->last_item = NULL;
item->next_item = NULL;
}
else{
item->next_item = Allocate_Item();
item->next_item->last_item = item;
item = item->next_item;
item->next_item = NULL;
}
/* read option from quotes */
for (i=0; line->text_line[i+1] != '"' && line->text_line[i+1] != '\0'; i++)
item->title[i] = line->text_line[i+1];
item->title[i] = '\0';
item->title_length = i;
item->item_number = ++choice_query->number_of_items;
/* make it a chooseable option if it should be done */
item->first_line = NULL;
while ( line->text_line[++i] != '\0' )
if ( line->text_line[i] == '=' )
item->first_line = line;
line = line->next_line;
}
value = Do_Query_Window(choice_query);
while (item->last_item != NULL){
item = item->last_item;
free (item->next_item);
}
free(item);
free(choice_query);
if ( event.action != DO_ITEM ){
return;
}
line = current_text; /* find chosen line */
for (;value>0;value--){
line = line->next_line;
}
strcpy( temp, After_Equals(line->text_line) );
}
/**************************************************************************/
void String_Query(place,string, show_it)
char *place,string[];
boolean show_it;
{
Menu *string_query;
Item *space_holder;
byte x,y,length=0,i=0,max_length,color;
boolean holder = quick_select;
quick_select = NO;
if (show_it)
max_length = 56;
else
max_length = 36;
l_len = 10;
space_holder = Allocate_Item();
space_holder->first_line = current_item->first_line;
space_holder->title_length = max_length;
space_holder->next_item = NULL;
strcpy(space_holder->title," ");
l_len = 60;
string_query = Allocate_Menu();
for (i = 0; *place != ',' && *place!= '\0';i++){
string_query->title[i] = *(place++);
if ( i >= 58 )
break;
}
string_query->title[i] = '\0';
place = After_Comma(place);
string_query->offset_x = Get_Value(place, CENTER );
place = After_Comma(place);
string_query->offset_y = Get_Value(place,(byte)( (max_screen_y/2) +4) );
place = After_Comma(place);
string_query->palette = Get_Palette(place,current_menu->palette);
string_query->title_length = i;
string_query->number_of_items = 1;
string_query->first_item = space_holder;
if (!Windowfy_Menu(string_query)){
free(space_holder);
free(string_query);
quick_select = holder;
return;
}
Display_Menu(NULL);
x = (byte)(left+2);
y = (byte)(top+3);
color = (byte)(palette[string_query->palette][TEXT] | palette[string_query->palette][BACK]<<4);
string[0] = '\0';
Show_Cursor();
for(;;){
Put_Cursor( (byte) (x+length) ,y);
Wait_For_Event();
switch (event.action){
case KEY_PRESS:
if (length < max_length && event.data ){
string[length] = event.data;
if (show_it)
Draw( (byte)(x+length),y,event.data,color);
else
Draw( (byte)(x+length),y,'X',color);
length++;
string[length] = '\0';
}
break;
case BACK_SPACE:
if (length){
length--;
string[length] = '\0';
Draw( (byte)(x+length),y,' ',color);
}
break;
case ESCAPE:
case DO_ITEM:
case SPECIAL:
Hide_Cursor();
Remove_Window();
free(space_holder);
free(string_query);
quick_select = holder;
return;
}
}
}
/**************************************************************************/
void Ask_For_Var(place)
char *place;
{
char temp_string[MAX_LINE];
byte i;
/* find var.name and record it */
place = After_Space(place);
for (i=1; *place != ' ' && *place != ',' && *place != '\0'; i++ )
temp_string[i] = *(place++);
temp_string[0] = '%';
temp_string[i] = '%';
temp_string[++i] = '\0';
vars[var_number].name = strdup(temp_string);
place = After_Comma(place);
/* get value in temp_string[] */
if (current_text->next_line->text_line[0] == '"')
Choice_Query(place,temp_string);
else
String_Query(place,temp_string,YES);
/* copy it into var.value */
vars[var_number].value = strdup(temp_string);
var_number++;
}
/**************************************************************************/
void Ask_For_Pass(place)
char *place;
{
Menu *pass_query;
char user_input[MAX_LINE];
char title[] = "Please enter password:";
place = After_Space(place);
String_Query(title,user_input,NO);
if ( event.action == DO_ITEM && stricmp(place,user_input) ) {
Error_Box("This password is not authorized.","Action aborted.");
if (event.action != SPECIAL){
event.action = ESCAPE;
event.data = 1;
}
}
}
/**************************************************************************/
void Create_Text_Box(place)
char *place;
{
char *line[25];
char temp[MAX_LINE], *checker;
Linked_Text *l_line = current_text;
byte x,y,color,i=0;
place = After_Comma(place);
x = Get_Value(place, CENTER );
place = After_Comma(place);
y = Get_Value(place, CENTER );
place = After_Comma(place);
color = Get_Palette(place,message_palette);
l_line = l_line->next_line;
while ( l_line != NULL && *(place=l_line->text_line) == '"'){
if (i <25){
place++;
Transcribe_String(place,temp);
checker=temp;
while (*checker != '\0'){
if (*checker == '"')
*checker = '\0';
checker++;
}
line[i] = strdup(temp);
i++;
}
l_line = l_line->next_line;
}
line[i] = NULL;
Display_Text_Box(line,x,y, color);
Pause_Until_Serious_Action();
Remove_Window();
for (i=0;line[i] != NULL;i++)
free(line[i]);
}
/**************************************************************************/
void Get_Disk_Space(place)
char *place;
{
long int minimum = 0;
byte drive = 0;
char line1[MAX_LINE],line2[MAX_LINE];
place = After_Space(place);
if (*(place+1)==':' && *(place+2) == ' ')
drive = *place & 31;
else{
Error_Box("Now that's a wierd drive lable.","I can't look there.");
event.action = ESCAPE;
event.data = 1;
return;
}
place = After_Space(place);
while ( (*place >= '0' && *place <= '9') || *place == ',' || *place == '.'){
if ( *place != ',' && *place != '.')
minimum = ( minimum * 10 ) + *place - 48;
place++;
}
if ( Disk_Space_Check(drive) < minimum*1000 ){
sprintf( line1 , "This option requires %lu K bytes",minimum);
sprintf( line2 , "of free disk space on drive %c:.",drive+64);
Error_Box( line1, line2 );
event.action = ESCAPE;
event.data = 1;
}
}
/**************************************************************************/
void Find_Floppy(place)
char *place;
{
char temp[MAX_LINE];
byte f_drives,i;
char *lines1[] = {"This Application Requires a User's Diskette.","",
"** Please Insert a Formatted Diskette. **",
"","Press Any Key When Ready,","or Escape to Exit.",NULL};
char *lines2[] = {"Looking for a Formatted Diskette.","",
"Please wait.",NULL};
Display_Text_Box(lines1,CENTER,CENTER,current_menu->palette);
Pause_Until_Serious_Action();
Remove_Window();
if (event.action == ESCAPE || event.action == SPECIAL)
return;
place = After_Space(place);
for (i=1; *place != ' ' && *place != ',' && *place != '\0'; i++ )
temp[i] = *(place++);
temp[0] = '%';
temp[i] = '%';
temp[++i] = '\0';
/* find number of floppies */
f_drives = *((byte far *) 0x00400010L);
f_drives = (f_drives & 1 ) + (f_drives >> 6);
/* check for floppy */
Display_Text_Box(lines2,CENTER,CENTER,current_menu->palette);
for (i = 1; i <= f_drives; i++){
if ( Disk_Space_Check(i) != -1 )
break;
}
Remove_Window();
if (i > f_drives){
Error_Box("No Formated Floppy Diskette Was Found.","Action Aborted.");
if (event.action != SPECIAL){
event.action = ESCAPE;
event.data = 1;
}
return;
}
/* store var name */
vars[var_number].name = strdup(temp);
/* copy drive name into var.value */
temp[0] = (char)i+64;
temp[1] = ':';
temp[2] = '\0';
vars[var_number].value = strdup(temp);
var_number++;
}
/**************************************************************************/
void Logout( void )
{
_asm mov ah,0d7h
_asm int 21h
}
/**************************************************************************/
void Reboot( void )
{
typedef void (far *Pointer_to_Bios_Fn)( void );
Pointer_to_Bios_Fn reboot;
Clean_Up();
reboot = (Pointer_to_Bios_Fn)0xFFFF0000;
/* store magic number to cause warm boot */
*(int far *)0x00400072 = 0x1234;
(*reboot)();
}
/**************************************************************************/
void Execute_Item()
{
char temp[MAX_LINE];
if (current_item == NULL){
Screen_Saver();
return;
}
current_text = current_item->first_line;
event.action = NO_ACTION;
while (current_text != NULL && event.action != ESCAPE && event.action != SPECIAL){
Transcribe_String(current_text->text_line,temp);
switch ( What_To_Do(temp) ){
case ASK_FOR_VAR:
Ask_For_Var(temp);
break;
case FIND_FLOPPY:
Find_Floppy(temp);
break;
case GET_DISK_SPACE:
Get_Disk_Space(temp);
break;
case LOGOUT:
Logout();
break;
case MAKE_TEXT_BOX:
Create_Text_Box(temp);
break;
case PASSWORD:
Ask_For_Pass(temp);
break;
case MAKE_BATCH:
Make_Batch();
break;
case NEW_WINDOW:
Windowfy_Menu( Find_Menu( current_text ) );
event.action=ESCAPE;
break;
case IF:
Exec_If(temp);
break;
case IF_MEMBER:
Exec_If_Member(temp);
break;
case IF_USERNAME:
Exec_If_Username(temp);
break;
case ELSE:
Exec_Else(temp);
break;
case ENDIF:
break;
case EXIT:
Clean_Up();
exit(LEAVE_MENU);
case REBOOT:
Reboot();
}
if (var_number > MAX_VARS)
Critical_Error( MEMORY );
do{
current_text = current_text->next_line;
if (current_text == NULL)
break;
}
while (current_text->text_line[0] == '"');
}
while (var_number){
var_number--;
free(vars[var_number].name);
free(vars[var_number].value);
}
return;
}
/**************************************************************************/
execute_option What_To_Do(temp)
char *temp;
{
if ( temp[0] == '%')
return(NEW_WINDOW);
if ( Compare(temp,"#display") )
return(MAKE_TEXT_BOX);
if ( Compare(temp,"#space ") )
return(GET_DISK_SPACE);
if ( Compare(temp,"#floppy ") )
return(FIND_FLOPPY);
if ( Compare(temp,"#ask ") )
return(ASK_FOR_VAR);
if ( Compare(temp,"#password ") )
return(PASSWORD);
if ( Compare(temp,"#logout") )
return(LOGOUT);
if ( Compare(temp,"#reboot") )
return(REBOOT);
if ( Compare(temp,"#exit") )
return(EXIT);
if ( Compare(temp,"#if ") )
return(IF);
if ( Compare(temp,"#endif") )
return(ENDIF);
if ( Compare(temp,"#if_member") )
return(IF_MEMBER);
if ( Compare(temp,"#if_username") )
return(IF_USERNAME);
if ( Compare(temp,"#else") )
return(ELSE);
return(MAKE_BATCH);
}
/**************************************************************************/
void Make_Batch()
{
char temp[MAX_LINE];
char *place;
FILE *Temp_Bat;
byte i;
Clean_Up();
/* open file to write */
Find_Env_Var("%t%",temp,MAX_LINE);
if ( ( Temp_Bat = fopen(temp, "w" ) ) == NULL )
Critical_Error(FILE_OPEN);
/* write file header */
fputs("@REM Temporary file for DougMenu :",Temp_Bat);
for (i=0;i<=win_index;i++){
fputc(Win[i].item->item_number+64,Temp_Bat);
fputc(Win[i].event+64,Temp_Bat);
}
fputc('\n',Temp_Bat);
/* Write the batch file */
while (current_text != NULL){
place = current_text->text_line;
Transcribe_String(place,temp);
switch (What_To_Do(place)){
case IF:
Exec_If(temp);
break;
case IF_MEMBER:
Exec_If_Member(temp);
break;
case IF_USERNAME:
Exec_If_Username(temp);
break;
case ELSE:
Exec_Else(temp);
break;
case ENDIF:
break;
case EXIT:
fputs("set t=",Temp_Bat);
fclose (Temp_Bat);
exit(EXECUTE_N_LEAVE);
default:
/* check for variable names */
while (*place != '\0'){
while (*place == '%'){
if ( !Get_DM_Var(place,temp,MAX_LINE)){
break;
}
fputs (temp,Temp_Bat);
place++;
while (*place != '%')
place++;
place++;
}
if (*place != '\0'){
fputc(*place,Temp_Bat);
place++;
}
}
fputc('\n',Temp_Bat);
}
current_text = current_text->next_line;
}
fclose (Temp_Bat);
exit(EXECUTE_BATCH);
}
/***************************************************************************/
void Exec_If( place )
char *place;
{
char *var1,*var2;
byte i=0;
var2 = var1 = After_Space(place);
while ( *var2 != '!' && *var2 != '=' && *var2 != '\0' ){
var2++;
}
/* trim spaces from end of var1 */
if (*var2 != '\0'){
while (*(var2-1)== ' ')
*(--var2)='\0';
while (*var2== '\0')
var2++;
}
if ( *var2 == '!'){
if ( *(var2+1) != '=' )
Critical_Error(SYNTAX);
*var2 = '\0';
var2 += 2;
while (*var2 == ' ')
var2++;
if (stricmp(var1,var2))
return;
}
else if ( *var2 == '='){
*var2 = '\0';
var2++;
if ( *(var2) == '=' )
var2++;
while (*var2 == ' ')
var2++;
if (!stricmp(var1,var2)){
return;
}
}
else if ( *var1 != '%' && *var1 != '\0' ){
return;
}
for(i=0;;){
current_text = current_text->next_line;
if (current_text == NULL )
return;
place = current_text->text_line;
if (Compare(place,"#endif"))
if (!i--)
return;
if (Compare(place,"#else"))
if (!i)
return;
if (Compare(place,"#if "))
i++;
if (Compare(place,"#if_member"))
i++;
if (Compare(place,"#if_group"))
i++;
}
}
/***************************************************************************/
void Exec_If_Member( place )
char *place;
{
char *var1;
byte i=0;
var1 = After_Space(place);
if (*var1 == '!'){
var1++;
if (!IsMember (var1))
return;
}
else
if (IsMember (var1))
return;
for(i=0;;){
current_text = current_text->next_line;
if (current_text == NULL )
return;
place = current_text->text_line;
if (Compare(place,"#endif"))
if (!i--)
return;
if (Compare(place,"#else"))
if (!i)
return;
if (Compare(place,"#if "))
i++;
if (Compare(place,"#if_member"))
i++;
if (Compare(place,"#if_group"))
i++;
}
}
/***************************************************************************/
void Exec_If_Username( place )
char *place;
{
char *var1;
byte i=0;
var1 = After_Space(place);
if (*var1 == '!'){
var1++;
if (stricmp (var1, UserName()))
return;
}
else
if (!stricmp (var1, UserName()))
return;
for(i=0;;){
current_text = current_text->next_line;
if (current_text == NULL )
return;
place = current_text->text_line;
if (Compare(place,"#endif"))
if (!i--)
return;
if (Compare(place,"#else"))
if (!i)
return;
if (Compare(place,"#if "))
i++;
if (Compare(place,"#if_member"))
i++;
if (Compare(place,"#if_group"))
i++;
}
}
/***************************************************************************/
void Exec_Else( place )
char *place;
{
byte i=0;
for(i=0;;){
current_text = current_text->next_line;
if (current_text == NULL )
return;
place = current_text->text_line;
if (Compare(place,"#endif"))
if (!i--)
return;
if (Compare(place,"#else"))
if (!i)
return;
if (Compare(place,"#if "))
i++;
if (Compare(place,"#if_member"))
i++;
if (Compare(place,"#if_group"))
i++;
}
}