From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/FDISK/C_MENUS.C | 1067 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1067 insertions(+) create mode 100644 v4.0/src/CMD/FDISK/C_MENUS.C (limited to 'v4.0/src/CMD/FDISK/C_MENUS.C') diff --git a/v4.0/src/CMD/FDISK/C_MENUS.C b/v4.0/src/CMD/FDISK/C_MENUS.C new file mode 100644 index 0000000..7516ce1 --- /dev/null +++ b/v4.0/src/CMD/FDISK/C_MENUS.C @@ -0,0 +1,1067 @@ + +#include "dos.h" /* AN000 */ +#include "fdisk.h" /* AN000 */ +#include "extern.h" /* AN000 */ +#include "subtype.h" /* AN000 */ +#include "fdiskmsg.h" /* AN000 */ +#include "stdio.h" + +/* */ +/******************* START OF SPECIFICATIONS *******************/ +/* */ +/* SUBROUTINE NAME: CREATE_PARTITION */ +/* */ +/* DESCRIPTIVE NAME: Create DOS related partition(s) */ +/* */ +/* FUNCTION: */ +/* This routine verifies if there are free partitions, */ +/* posts an status message if there is not, otherwise */ +/* prints a screen asking what type of partition to */ +/* be created, and passes control to the requested */ +/* function. */ +/* */ +/* NOTES: This is a screen control module only, no data is */ +/* modified. Routine also will only allow 1 DOS and */ +/* 1 Ext DOS partitions per disk, if one already exists,*/ +/* then status message is displayed when the create */ +/* option for that type partition is selected */ +/* */ +/* The following screen in managed */ +/* */ +/* ³0000000000111111111122222222223333333333³ */ +/* ³0123456789012345678901234567890123456789³ */ +/* ÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ */ +/* 00³ ³ */ +/* 01³ ³ */ +/* 02³ ³ */ +/* 03³ ³ */ +/* 04³Create DOS Partition ³ */ +/* 05³ ³ */ +/* 06³Current Fixed Disk Drive: # ³ */ +/* 07³ ³ */ +/* 08³Choose one of the following: ³ */ +/* 09³ ³ */ +/* 10³ 1. Create Primary DOS partition ³ */ +/* 11³ 2. Create EXTENDED DOS partition ³ */ +/* 12³ 3. Create logical DOS drive(s) in ³ */ +/* 13³ the EXTENDED DOS partition ³ */ +/* 14³ ³ */ +/* 15³ ³ */ +/* 16³ ³ */ +/* 17³ ³ */ +/* 18³Enter choice: [ ] ³ */ +/* 19³ ³ */ +/* 20³ ³ */ +/* 21³ ³ */ +/* 22³ ³ */ +/* 23³Press ESC to return to FDISK Options ³ */ +/* ÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */ +/* */ +/* ENTRY POINTS: create_partition */ +/* LINKAGE: create_partition(); */ +/* */ +/* INPUT: None */ +/* */ +/* EXIT-NORMAL: ERROR=FALSE */ +/* */ +/* EXIT-ERROR: ERROR=TRUE */ +/* GOTO internal_program_error if case statement */ +/* failure when branching to requested function */ +/* */ +/* EFFECTS: No data directly modified by this routine, but */ +/* child routines will modify data. */ +/* */ +/* INTERNAL REFERENCES: */ +/* ROUTINES: */ +/* find_free_partition */ +/* dos_create_partition */ +/* ext_create_partition */ +/* volume_create */ +/* internal_program_error */ +/* find_partition_type */ +/* get_num_input */ +/* display */ +/* wait_for_ESC */ +/* clear_screen */ +/* */ +/* EXTERNAL REFERENCES: */ +/* ROUTINES: */ +/* */ +/******************** END OF SPECIFICATIONS ********************/ + +/* */ +void create_partition() + +BEGIN + +char input; +char default_value; +char max_input; + + + + + input = c(NUL); /* AC000 */ + clear_screen(u(0),u(0),u(24),u(79)); /* AC000 */ + /* put up heading and ESC */ + display(menu_8); + display(menu_11); + + /* Setup current drive msg */ + insert[0]=cur_disk+1+'0'; + display(menu_5); + + /* See if there are free partitions */ + if (find_free_partition() != ((char)(NOT_FOUND))) /* AC000 */ + BEGIN + /* display menu */ + display(menu_3); /* AN000 */ + display(menu_9); + + /* ############# ADD CODE HERE FOR THIS FUNCTION ############## */ + /* Do something about highlighting the available options and */ + /* setting up defaults */ + default_value = c(1); /* AC000 */ + /* ############################################################ */ + /* setup default for prompt */ + insert[0] = c('1'); /* AC000 */ + display(menu_7); + display(menu_10); + + max_input = c(3); /* AC000 */ + + input = get_num_input(default_value,max_input,input_row,input_col); + + /* Go branch to the requested function */ + switch(input) + BEGIN + case '1': dos_create_partition(); + break; + + case '2': + if ((cur_disk == c(1)) || (find_partition_type(uc(DOS12))) || (find_partition_type(uc(DOS16))) || + (find_partition_type(uc(DOSNEW)))) /* AN000 */ /* AC000 */ + ext_create_partition(); + else + BEGIN /* AN000 */ + /* don't have a primary partition yet, can't create an ext */ + display(error_19); /* AN000 */ + clear_screen(u(17),u(0),u(17),u(79)); /* AN000 */ + wait_for_ESC(); /* AN000 */ + END /* AN000 */ + break; + + case '3': + BEGIN + if (find_partition_type(uc(EXTENDED))) /* AC000 */ + volume_create(); + else /* AN000 */ + BEGIN /* AN000 */ + display(error_35); /* AN000 */ + clear_screen(u(17),u(0),u(17),u(79)); /* AN000 */ + wait_for_ESC(); /* AN000 */ + END /* AN000 */ + break; + END + + case ESC: break; + + default: internal_program_error(); + END + END + else + BEGIN + + /* Display prompt telling there is no avail partition */ + display(error_10); + input = wait_for_ESC(); + END + /* clear the screen before going back to main menu */ + clear_screen(u(0),u(0),u(24),u(79)); /* AC000 */ + return; +END + + +/* */ +/******************* START OF SPECIFICATIONS *******************/ +/* */ +/* SUBROUTINE NAME: DOS_CREATE_PARTITION */ +/* */ +/* DESCRIPTIVE NAME: Create default DOS partition on disk */ +/* */ +/* FUNCTION: User is prompted to see if he wishes to use to */ +/* set up a DOS partition in the maximum available */ +/* size (limited to 32mb). If option is selected */ +/* than partition is created and marked active. The */ +/* partition is scanned to insure there are enough */ +/* contiguous good sectors for DOS. */ +/* */ +/* NOTES: Screen can be exited via the ESC command before */ +/* partition is created and nothing will change */ +/* */ +/* The following screen is managed: */ +/* */ +/* ³0000000000111111111122222222223333333333³ */ +/* ³0123456789012345678901234567890123456789³ */ +/* ÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ */ +/* 00³ ³ */ +/* 01³ ³ */ +/* 02³ ³ */ +/* 03³ ³ */ +/* 04³Create DOS Partition ³ */ +/* 05³ ³ */ +/* 06³Current Fixed Disk Drive: # ³ */ +/* 07³ ³ */ +/* 08³Do you wish to use the maximum size ³ */ +/* 09³for a DOS partition and make the DOS ³ */ +/* 10³partition active (Y/N).........? [Y] ³ */ +/* 11³ ³ */ +/* 12³ ³ */ +/* 13³ ³ */ +/* 14³ ³ */ +/* 15³ ³ */ +/* 16³ ³ */ +/* 17³ ³ */ +/* 18³ ³ */ +/* 19³ ³ */ +/* 20³ ³ */ +/* 21³ ³ */ +/* 22³ ³ */ +/* 23³Press ESC to return to FDISK Options ³ */ +/* ÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */ +/* */ +/* ENTRY POINTS: dos_create_partition */ +/* LINKAGE: dos_create_partition(); */ +/* NEAR CALL */ +/* */ +/* INPUT: None */ +/* */ +/* EXIT-NORMAL: ERROR=FALSE */ +/* */ +/* EXIT-ERROR: ERROR=TRUE */ +/* GOTO internal_program_error if case statement */ +/* failure when branching to requested function */ +/* */ +/* EFFECTS: No data directly modified by this routine, but */ +/* child routines will modify data. */ +/* */ +/* INTERNAL REFERENCES: */ +/* ROUTINES: */ +/* clear_screen */ +/* display */ +/* get_yn_input */ +/* wait_for_ESC */ +/* input_dos_create */ +/* make_partition */ +/* check_bad_tracks */ +/* */ +/* */ +/* EXTERNAL REFERENCES: */ +/* ROUTINES: */ +/* */ +/******************** END OF SPECIFICATIONS ********************/ + +/* */ +void dos_create_partition() + + +BEGIN + + char input; + char temp; + char second_disk_flag; /* AN000 */ + + + + second_disk_flag = (FLAG)FALSE; /* AN000 */ + input = c(NUL); /* AC000 */ + /* clear off screen */ + clear_screen(u(0),u(0),u(24),u(79)); /* AC000 */ + + /* Put up header */ + display(menu_12); + + /* Set up current disk message */ + insert[0] = cur_disk+1+'0'; + display(menu_5); + + /* Display ESC prompt */ + display(menu_11); + + /* See if already exists */ + if ((!find_partition_type(uc(DOS12))) && (!find_partition_type(uc(DOS16))) && (!find_partition_type(uc(DOSNEW)))) /* AC000 */ + + BEGIN + /* Display prompt, depending on what disk */ + if (cur_disk == c(0)) /* AC000 */ + /* Put up make active partition message */ + display(menu_13); + else + BEGIN + /* Second disk, so don;t put up prompt mentioning active partition */ + second_disk_flag = (FLAG)TRUE; /* AN000 */ + display(menu_45); /* AC000 */ + END + /* Get Y/N input */ + input = get_yn_input(c(Yes),input_row,input_col); /* AC000 AC011 */ + + /* Go handle input */ + switch(input) + BEGIN + case 1: /* AC000 */ + if ( second_disk_flag == (FLAG)FALSE) + BEGIN + /* Go get the biggest area left */ + temp = find_part_free_space(c(PRIMARY)); /* AC000 */ + make_partition(free_space[temp].space,temp,uc(ACTIVE),c(PRIMARY)); /* AC000 */ + reboot_flag = (FLAG)TRUE; /* AC000 */ + if (number_of_drives == uc(1)) /* AN000 */ + BEGIN /* AN000 */ + write_info_to_disk(); + reboot_system(); /* AC000 */ + END /* AN000 */ + clear_screen(u(16),u(0),u(23),u(79)); /* AN000 */ + display(status_12); /* AN000 */ + wait_for_ESC(); + break; + END + else + BEGIN /* AN000 */ + /* Go get the biggest area left */ /* AN000 */ + temp = find_part_free_space(c(PRIMARY)); /* AN000 */ + make_partition(free_space[temp].space,temp,uc(NUL),c(PRIMARY)); /* AN000 */ + reboot_flag = (FLAG)TRUE; /* AN000 */ + clear_screen(u(16),u(0),u(23),u(79)); /* AN000 */ + display(status_12); /* AN000 */ + wait_for_ESC(); + break; + END + + case 0: input_dos_create(); /* AC000 */ + break; + + case ESC: break; /* take no action */ + + default : internal_program_error(); + END + END + else + BEGIN + /* Display partition table-it will return if no partitions there */ + table_display(); + + /* Primary partition already exists message */ + display(error_8); + wait_for_ESC(); + END + return; +END + + +/* */ +/******************* START OF SPECIFICATIONS *******************/ +/* */ +/* SUBROUTINE NAME: INPUT_DOS_CREATE */ +/* */ +/* DESCRIPTIVE NAME: Create DOS partition on disk */ +/* */ +/* FUNCTION: Gets user specified size for partition (maximum */ +/* is 32mb or largest contiguous freespace, which- */ +/* ever is smaller). Default is largest avail free */ +/* space. Partition is created to default size,unless*/ +/* user enters different size, but is not marked */ +/* active. User specified size must be smaller or */ +/* equal to the default size */ +/* */ +/* NOTES: Screen can be exited via the ESC command before */ +/* partition is created and nothing will change */ +/* */ +/* The following screen is managed */ +/* */ +/* ³0000000000111111111122222222223333333333³ */ +/* ³0123456789012345678901234567890123456789³ */ +/* ÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ */ +/* 00³ ³ */ +/* 01³ ³ */ +/* 02³ ³ */ +/* 03³ ³ */ +/* 04³Create DOS partition ³ */ +/* 05³ ³ */ +/* 06³Current Fixed Disk Drive: # ³ */ +/* 07³ ³ */ +/* 08³Partition Status Type Start End Size³ */ +/* 09³ ³ */ +/* 10³ ³ */ +/* 11³ ³ */ +/* 12³ ³ */ +/* 13³ ³ */ +/* 14³Total disk space is #### cylinders. ³ */ +/* 15³Maximum space available for partition ³ */ +/* 16³is #### cylinders. ³ */ +/* 17³ ³ */ +/* 18³Enter partition size............: [####]³ */ +/* 19³ ³ */ +/* 20³ ³ */ +/* 21³ ³ */ +/* 22³ ³ */ +/* 23³Press ESC to return to FDISK Options ³ */ +/* ÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */ +/* */ +/* ENTRY POINTS: input_dos_create */ +/* LINKAGE: input_dos_create(); */ +/* NEAR CALL */ +/* */ +/* INPUT: None */ +/* */ +/* EXIT-NORMAL: ERROR=FALSE */ +/* */ +/* EXIT-ERROR: ERROR=TRUE */ +/* GOTO internal_program_error if case statement */ +/* failure when branching to requested function */ +/* */ +/* EFFECTS: No data directly modified by this routine, but */ +/* child routines will modify data. */ +/* */ +/* INTERNAL REFERENCES: */ +/* ROUTINES: */ +/* clear_screen */ +/* table_display */ +/* get_num_input */ +/* display */ +/* wait_for_ESC */ +/* make_partition */ +/* check_bad_tracks */ +/* */ +/* EXTERNAL REFERENCES: */ +/* ROUTINES: */ +/* */ +/******************** END OF SPECIFICATIONS ********************/ + +/* */ +void input_dos_create() + +BEGIN + + unsigned input; + unsigned default_entry; + char temp; + char location; + + input = u(NUL); /* AC000 */ + /* clear off screen */ + clear_screen(u(0),u(0),u(24),u(79)); /* AC000 */ + + /* Put up heading */ + display(menu_12); + + /* Setup and print current disk */ + insert[0] = cur_disk+1+'0'; + display(menu_5); + + /* Print ESC prompt */ + display(menu_11); + + /* Display partition table-it will return if no partitions there */ + table_display(); + + sprintf(insert,"%4.0d",total_mbytes[cur_disk]); + display(menu_15); + + /* Get the free space */ + temp = find_part_free_space(c(PRIMARY)); /* AC000 */ + + /* Is there any ?*/ + if (free_space[temp].mbytes_unused != u(0)) /* AC000 */ + + BEGIN + /* Display disk space */ + sprintf(insert,"%4.0d",total_mbytes[cur_disk]); + display(menu_15); + + /* Setup and print max partition size */ + + sprintf(insert,"%4.0d%3.0d%%", + free_space[temp].mbytes_unused, + free_space[temp].percent_unused); + display(menu_16); + + /* Force repeats on the input until something valid (Non-Zero return) */ + default_entry = (unsigned)free_space[temp].mbytes_unused; /* AC000 */ + valid_input = (FLAG)FALSE; /* AC000 */ + + while (!valid_input) + + BEGIN + /* Display prompt */ + sprintf(insert,"%4.0d",default_entry); + display(menu_39); + + input = get_large_num_input(default_entry,free_space[temp].mbytes_unused,free_space[temp].percent_unused,menu_39,u(0),error_13); /* AC000 */ + + /* Update default in case of error, so it gets displayed and used */ + /* if user presses CR only */ + + default_entry = input; + clear_screen(u(19),u(0),u(23),u(79)); /* AC000 */ + END + + if (input != ((unsigned)(ESC_FLAG))) /* AC000 */ + + BEGIN + /* Change input to cylinders */ + /* check to see if input was in percent or mbytes */ + + if (PercentFlag) /* AN000 */ + BEGIN /* AN000 */ + if (input == free_space[temp].percent_unused) + input = free_space[temp].space; /* AN000 */ + else /* AN000 */ + input = percent_to_cylinders(input,total_disk[cur_disk]); + END /* AN000 */ + else /* AN000 */ + BEGIN /* AN000 */ + if (input == free_space[temp].mbytes_unused) + input = free_space[temp].space; /* AN000 */ + else /* AN000 */ + input = (unsigned)mbytes_to_cylinders(input, + cur_disk); /* AN004 */ + END /* AN000 */ + + /* Initialize PecentFlag back to FALSE */ + PercentFlag = (FLAG)FALSE; /* AN000 */ + + /* Go create the partition */ + make_partition(input,temp,uc(NUL),c(PRIMARY)); /* AC000 */ + + /* clear off the old prompt */ + clear_screen(u(13),u(0),u(19),u(79)); /* AC000 */ + + /* Reissue the partition info */ + table_display(); + + /* display the "okay, we did it" msg */ + if (number_of_drives == uc(1)) /* AN000 */ + display(status_5); + else + BEGIN /* AN000 */ + clear_screen(u(16),u(0),u(23),u(79)); /* AN000 */ + display(status_12); /* AN000 */ + END /* AN000 */ + + wait_for_ESC(); + + reboot_flag = TRUE; + + END + END + return; +END + + +/* */ +/******************* START OF SPECIFICATIONS *******************/ +/* */ +/* SUBROUTINE NAME: EXT_CREATE_PARTITION */ +/* */ +/* DESCRIPTIVE NAME: Create EXTENDED DOS partition */ +/* */ +/* FUNCTION: Gets user specified size for EXTENDED partition */ +/* (Maximum is largest contiguous freespace). The */ +/* default is the largest available freespace. */ +/* space. Partition is created to default size, */ +/* unless user enters different size, but is not */ +/* marked as active. User specified size must be */ +/* smaller or equal to default size */ +/* */ +/* NOTES: Screen can be exited via the ESC command before */ +/* partition is created and nothing will change */ +/* */ +/* The following screen is managed */ +/* */ +/* ³0000000000111111111122222222223333333333³ */ +/* ³0123456789012345678901234567890123456789³ */ +/* ÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ */ +/* 00³ ³ */ +/* 01³ ³ */ +/* 02³ ³ */ +/* 03³ ³ */ +/* 04³Create EXTENDED DOS partition ³ */ +/* 05³ ³ */ +/* 06³Current Fixed Disk Drive: # ³ */ +/* 07³ ³ */ +/* 08³Partition Status Type Start End Size³ */ +/* 09³ ³ */ +/* 10³ ³ */ +/* 11³ ³ */ +/* 12³ ³ */ +/* 13³ ³ */ +/* 14³Total disk space is #### cylinders. ³ */ +/* 15³Maximum space available for partition ³ */ +/* 16³is #### cylinders. ³ */ +/* 17³ ³ */ +/* 18³Enter partition size............: [####]³ */ +/* 19³ ³ */ +/* 20³ ³ */ +/* 21³ ³ */ +/* 22³ ³ */ +/* 23³Press ESC to return to FDISK Options ³ */ +/* ÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */ +/* */ +/* ENTRY POINTS: EXTENDED_create_partition */ +/* LINKAGE: EXTENDED_create_partition(); */ +/* NEAR CALL */ +/* */ +/* INPUT: None */ +/* */ +/* EXIT-NORMAL: ERROR=FALSE */ +/* */ +/* EXIT-ERROR: ERROR=TRUE */ +/* GOTO internal_program_error if case statement */ +/* failure when branching to requested function */ +/* */ +/* EFFECTS: No data directly modified by this routine, but */ +/* child routines will modify data. */ +/* */ +/* INTERNAL REFERENCES: */ +/* ROUTINES: */ +/* clear_screen */ +/* table_display */ +/* get_num_input */ +/* display */ +/* find_partition_type */ +/* wait_for_ESC */ +/* make_partition */ +/* */ +/* EXTERNAL REFERENCES: */ +/* ROUTINES: */ +/* */ +/******************** END OF SPECIFICATIONS ********************/ + +/* */ +void ext_create_partition() + + +BEGIN + + unsigned input; + unsigned default_entry; + char temp; + + + input = u(NUL); /* AC000 */ + /* clear off screen */ + clear_screen(u(0),u(0),u(24),u(79)); /* AC000 */ + + /* Put up heading */ + display(menu_17); + + /* Setup and print current disk */ + insert[0] = cur_disk+1+'0'; + display(menu_5); + + /* print ESC prompt */ + display(menu_11); + + /* Display partition table-it will return if no partitions there */ + table_display(); + + /* Go see if primary already exists and ext doesn't */ + if ((cur_disk == c(1)) || (find_partition_type(uc(DOS12))) || (find_partition_type(uc(DOS16))) || + (find_partition_type(uc(DOSNEW)))) /* AC000 */ + BEGIN + if (!find_partition_type(uc(EXTENDED))) /* AC000 */ + /* We can go create one now */ + BEGIN + + /* Get the free space */ + temp = find_part_free_space(c(EXTENDED)); /* AC000 */ + + /* Is there any ?*/ + if (free_space[temp].percent_unused != u(0)) /* AC000 */ + BEGIN + + /* Display disk space */ + sprintf(insert,"%4.0d",total_mbytes[cur_disk]); + display(menu_15); + + /* Setup and print max partition size */ + + sprintf(insert,"%4.0d%3.0d%%", + free_space[temp].mbytes_unused, + free_space[temp].percent_unused); + display(menu_16); + + /* Force repeats on the input until something valid (Non-Zero return) */ + /* Display MBytes unless MBytes == 0, then display percent */ + if (free_space[temp].mbytes_unused == u(0)) /* AN000 */ + BEGIN /* AN000 */ + default_entry = (unsigned)free_space[temp].percent_unused; /* AC000 */ + PercentFlag = (FLAG)TRUE; /* AN000 */ + END /* AN000 */ + else /* AN000 */ + BEGIN + default_entry = (unsigned)free_space[temp].mbytes_unused; /* AC000 */ + PercentFlag = (FLAG)FALSE; /* AN000 */ + END + + valid_input = (FLAG)FALSE; /* AC000 */ + + while (!valid_input) + BEGIN + /* Display prompt */ + if (!PercentFlag) /* AN000 */ + sprintf(insert,"%4.0d",default_entry); + else /* AN000 */ + sprintf(insert,"%3.0d%%",default_entry); /* AN000 */ + display(menu_42); /* AC000 */ + + input = get_large_num_input(default_entry,free_space[temp].mbytes_unused,free_space[temp].percent_unused,menu_42,u(0),error_13); /* AC000 */ + + /* Update default in case of error, so it gets displayed and used */ + /* if user presses CR only */ + + default_entry = input; + clear_screen(u(19),u(0),u(23),u(79)); /* AC000 */ + END + + if (input != ((unsigned)(ESC_FLAG))) /* AC000 */ + BEGIN + + /* Change input to cylinders */ + if (PercentFlag) /* AN000 */ + BEGIN /* AN000 */ + if (input == free_space[temp].percent_unused) + input = free_space[temp].space; /* AN000 */ + else /* AN000 */ + input = percent_to_cylinders(input,total_disk[cur_disk]); + END /* AN000 */ + else /* AN000 */ + BEGIN /* AN000 */ + if (input == free_space[temp].mbytes_unused) + input = free_space[temp].space; /* AN000 */ + else /* AN000 */ + input = (unsigned)mbytes_to_cylinders(input, + cur_disk); /* AN004 */ + END /* AN000 */ + + + /* Initialize PecentFlag back to FALSE */ + PercentFlag = (FLAG)FALSE; /* AN000 */ + + /* Go create the partition */ + make_partition(input,temp,uc(NUL),c(EXTENDED)); /* AC000 */ + + /* clear off the old prompt */ + clear_screen(u(13),u(0),u(19),u(79)); /* AC000 */ + + /* Display the updated partition information */ + table_display(); + + /* Hit esc to continue line */ + clear_screen(u(24),u(0),u(24),u(79)); /* AN000 */ + display(menu_46); /* AN000 */ + + /* Tell user we created it */ + display(status_6); + wait_for_ESC(); + + reboot_flag = (FLAG)TRUE; /* AC000 */ + + /* Go allow him to create disk volumes */ + volume_create(); + END + END + else + BEGIN + /* No room */ + display(error_10); + wait_for_ESC(); + END + END + else + BEGIN + /* Already have ext partition, tell user and bow out */ + display(error_9); + wait_for_ESC(); + END + END + else + BEGIN + /* don't have a primary partition yet, can't create an ext */ + display(error_19); + wait_for_ESC(); + END + + return; +END + + +/* */ +/******************* START OF SPECIFICATIONS *******************/ +/* */ +/* SUBROUTINE NAME: VOLUME_CREATE */ +/* */ +/* DESCRIPTIVE NAME: Create DOS disk volumes */ +/* */ +/* FUNCTION: Create the boot record/partition table structure */ +/* needed to support the DOS disk volume arch in */ +/* the EXTENDED partition. Volume is created to the */ +/* the default size (largest contiguous freespace or */ +/* 32mb, whichever smaller) or to the user specified */ +/* size (must be smaller or equal to default size). */ +/* The volume boot record is created, and the appro- */ +/* priate pointers in other volume partition tables */ +/* are generated. */ +/* */ +/* */ +/* NOTES: Screen can be exited via the ESC command before */ +/* partition is created and nothing will change */ +/* */ +/* The following screen is managed */ +/* */ +/* ³0000000000111111111122222222223333333333³ */ +/* ³0123456789012345678901234567890123456789³ */ +/* ÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ */ +/* 00³Create DOS Disk Volume ³ */ +/* 01³ ³ */ +/* 02³Vol Start End Size ³ */ +/* 03³ # #### #### #### ³ */ +/* 04³ ³ */ +/* 05³ ³ */ +/* 06³ ³ */ +/* 07³ ³ */ +/* 08³ ³ */ +/* 09³ ³ */ +/* 10³ ³ */ +/* 11³ ³ */ +/* 12³ ³ */ +/* 13³ ³ */ +/* 14³ ³ */ +/* 15³ ³ */ +/* 16³Total partition size is #### cylinders. ³ */ +/* 17³Maximum space available for disk ³ */ +/* 18³volume is #### cylinders. ³ */ +/* 19³ ³ */ +/* 20³Enter disk volume size..........: [####]³ */ +/* 21³ ³ */ +/* 22³ ³ */ +/* 23³Press ESC to return to FDISK Options ³ */ +/* ÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ */ +/* */ +/* ENTRY POINTS: Volume_Create */ +/* LINKAGE: Volume_Create () */ +/* NEAR CALL */ +/* */ +/* INPUT: None */ +/* */ +/* EXIT-NORMAL: ERROR=FALSE */ +/* */ +/* EXIT-ERROR: ERROR=TRUE */ +/* GOTO internal_program_error if case statement */ +/* failure when branching to requested function */ +/* */ +/* EFFECTS: No data directly modified by this routine, but */ +/* child routines will modify data. */ +/* */ +/* INTERNAL REFERENCES: */ +/* ROUTINES: */ +/* clear_screen */ +/* display */ +/* volume_display */ +/* get_num_input */ +/* wait_for_ESC */ +/* make_partition */ +/* */ +/* EXTERNAL REFERENCES: */ +/* ROUTINES: */ +/* */ +/******************** END OF SPECIFICATIONS ********************/ + +/* */ +void volume_create() + +BEGIN + + unsigned input; + unsigned default_entry; + char temp; + char drive_letter; + char default_value; + char location; + char previous_location; + char ext_location; + unsigned char i; + char defined_drives; + char temp_cur_disk; + unsigned ext_part_percent_unused; /* AN000 */ + unsigned ext_part_num; /* AN000 */ + + input = u(NUL); /* AC000 */ + + /* clear off screen */ + clear_screen(u(0),u(0),u(24),u(79)); /* AC000 */ + + /* Display header */ + display (menu_18); + + /* print ESC prompt */ + display(menu_11); + + /* Display volume info */ + drive_letter = volume_display(); + + /* Loop until done */ + input = u(NUL); /* AC000 */ + while (input != ((unsigned)(ESC_FLAG))) /* AC000 */ + + BEGIN + /* See if we have hit the max number of drives */ + defined_drives = c(0); /* AC000 */ + temp_cur_disk = cur_disk; + + /* Search both drives for defined drives */ + for (i = uc(0); i < number_of_drives; i++) /* AC000 */ + + BEGIN + cur_disk = ((char)(i)); + + /* See if there is a primary drive letter */ + if ((find_partition_type(uc(DOS12))) || (find_partition_type(uc(DOS16))) || (find_partition_type(uc(DOSNEW)))) /*AC000*/ + defined_drives++; + + /* See if extended partition on disk */ + if (find_partition_type(uc(EXTENDED))) /* AC000 */ + BEGIN + /* Get number of logical drives */ + defined_drives = defined_drives + get_num_logical_dos_drives(); + END + END + /* Restore cur_disk to original */ + cur_disk = temp_cur_disk; + + /* See if 26 or less drives total */ + if (defined_drives < c(24)) /* AC000 */ + BEGIN + location = find_ext_free_space(); + + /* find the number of the extended partiton to figure out percent */ + ext_part_num = find_partition_location(uc(EXTENDED)); /* AN000 */ + + /* Set the percent used */ + ext_part_percent_unused = + cylinders_to_percent(free_space[location].space, + ((part_table[cur_disk][ext_part_num].end_cyl-part_table[cur_disk][ext_part_num].start_cyl)+1)); /* AN000 */ + + /* Is there any ?*/ + if (ext_part_percent_unused != u(0)) /* AC000 */ + BEGIN + + /* Display disk space */ + sprintf(insert,"%4.0d",get_partition_size(uc(EXTENDED)) ); + display(menu_21); + + /* Setup and print max partition size */ + + sprintf(insert,"%4.0d%3.0d%%", + free_space[location].mbytes_unused, + ext_part_percent_unused); + display(menu_22); + + /* Force repeats on the input until something valid (Non-Zero return) */ + /* If MBytes unused is equel to zero, display percent unused */ + if (free_space[location].mbytes_unused == u(0)) /* AN000 */ + BEGIN /* AN000 */ + default_entry = (unsigned)ext_part_percent_unused; /* AN000 */ + PercentFlag = (FLAG)TRUE; /* AN000 */ + END /* AN000 */ + else /* AN000 */ + BEGIN /* AN000 */ + default_entry = (unsigned)free_space[location].mbytes_unused; /* AC000 */ + PercentFlag = (FLAG)FALSE; /* AN000 */ + END /* AN000 */ + + valid_input = (FLAG)FALSE; /* AC000 */ + + while (!valid_input) + BEGIN + /* Display prompt */ + if (!PercentFlag) /* AN000 */ + sprintf(insert,"%4.0d",default_entry); + else /* AN000 */ + sprintf(insert,"%3.0d%%",default_entry); /* AN000 */ + + display(menu_40); + + input = get_large_num_input(default_entry,free_space[location].mbytes_unused,ext_part_percent_unused,menu_40,u(0),error_12); /* AC000*/ + + /* Update default in case of error, so it gets displayed and used */ + /* if user presses CR only */ + + default_entry = input; + clear_screen(u(19),u(0),u(23),u(79)); /* AC000 */ + END + + if (input != ((unsigned)(ESC_FLAG))) /* AC000 */ + BEGIN + + /* Change input to cylinders */ + if (PercentFlag) /* AN000 */ + BEGIN /* AN000 */ + if (input == ext_part_percent_unused) + input = free_space[location].space; /* AN000 */ + else /* AN000 */ + input = percent_to_cylinders(input,((part_table[cur_disk][ext_part_num].end_cyl-part_table[cur_disk][ext_part_num].start_cyl)+1)); + END /* AN000 */ + else /* AN000 */ + BEGIN /* AN000 */ + if (input == free_space[location].mbytes_unused) + input = free_space[location].space; /* AN000 */ + else /* AN000 */ + input = (unsigned)mbytes_to_cylinders(input, + cur_disk); /* AN004 */ + END /* AN000 */ + + /* Initialize PecentFlag back to FALSE */ + PercentFlag = (FLAG)FALSE; /* AN000 */ + + /* go create the entry and find out where it put it */ + ext_location = make_volume(input,location); + + /* clear off the old prompt */ + clear_screen(u(15),u(0),u(19),u(79)); /* AC000 */ + + reboot_flag = (FLAG)TRUE; /* AC000 */ + + /* Display the updated partition information */ + drive_letter = volume_display(); + + /* Tell user we created it */ + display(status_7); + END + END + else + BEGIN + /* No space left or already max'd on the devices */ + /* Get rid of the size prompts */ + clear_screen(u(17),u(0),u(21),u(79)); /* AC000 */ + display(error_20); + volume_display(); + wait_for_ESC(); /* KWC, 11-01-87 */ + input = u(ESC_FLAG); /* KWC, 11-01-87 */ + END + END + else + BEGIN + /* Reached the maximum */ + /* Get rid of the size prompts */ + clear_screen(u(17),u(0),u(21),u(79)); /* AC000 */ + display(error_27); + /* Force an exit with ESC */ + wait_for_ESC(); /* KWC, 11-01-87 */ + input = u(ESC_FLAG); /* KWC, 11-01-87 */ + END + END + clear_screen(u(0),u(0),u(24),u(79)); /* AC000 */ + return; +END + -- cgit v1.2.3