- /* 
-         CCONFIG2.C: Second primary source file for the CCONFIG 
-                     utility. See CCONFIG.C for essential information 
- */ 
-   
- #include <stdio.h> 
- #include "cconfig.h" 
-   
- dooptim() 
- { 
-         char c; 
-         int i; 
-   
-         p("CODE OPTIMIZATION CONTROL:\n") 
-         p("Compiled BDS C code can be optimized for either speed or space,") 
-         p("through the use of several unique 'tuning' controls. The") 
-         p("configuration you are about to perform sets only the default") 
-         p("optimization mode; any") 
-         p("compilation may be individually tailored by using the -o and -z") 
-         p("CC command-line options.\n\n") 
-         p("There are three code optimization modes for BDS C: ") 
-         p("'fast', 'short' and 'extended-short'.\n\n") 
-         p("FAST mode causes all code sequences to run") 
-         p("as fast as possible; this can be achieved by using the \"-o\" and") 
-         p("\"-e <xxxx>\" CC command-line options while making all variables") 
-         p("in the program external.\n") 
-         p("SHORT mode replaces several common code sequences by") 
-         p("calls to equivalent subroutines in the run-time package.") 
-         p("This slows execution down a bit, due to the subroutine overhead,") 
-         p("but saves considerable space. This is the default") 
-         p("mode set in the distribution package.\n") 
-   
-         p ("(Press RETURN to continue)"); getch();
-   
-         p("EXTENDED-SHORT mode does everything that simple-short mode does,") 
-         p("but") 
-         p("also takes advantage of any unused system restart vectors that") 
-         p("may be available on a SPECIFIC target computer system.") 
-         p("This is accomplished by collapsing") 
-         p("certain very common, short (3-6 byte) code sequences into") 
-         p("1-byte RST instructions. To use this mode you must first know") 
-         p("which RST vectors") 
-         p("are available on the target system. Then you change the") 
-         p("appropriate symbols (ZOPT1-ZOPT7)") 
-         p("in the run-time package source file and re-assemble the run-time") 
-         p("package. Finally, the \"-z\" CC command-line option is") 
-         p("used to tell CC which RST vectors are available.\n") 
-   
-   go:   p("\nPlease choose the default optimization mode:\n") 
-         p("Fast (F), Short (S), or Extended-Short (E): ") 
-   
-         { 
-           case 'F': optim = 0; 
-                     break; 
-   
-           case 'S': optim = 0x80; 
-                     break; 
-   
-           case 'E': optim = 0x80; 
-                     p("For extended mode, you need to specifiy those restart") 
-                     p("vectors that are guaranteed to be unused by any other") 
-                     p("software on the target system. Any restart vector") 
-                     p("except RST 0 may be used, i.e., RST 1 through RST 7.\n") 
-                     p("Answer 'y' or 'n' to each query to specify if the") 
-                     p("respective RST vector is available") 
-                     p("for extended-short RST optimization:\n") 
-                     for (i = 1; i < 8; i++) 
-                     { 
-                         p("RST ") 
-                         p(" ? ") 
-                         optim |= yesp() << (i - 1); 
-                     } 
-                     break; 
-   
-           default:  p("Invalid selection. Try again:\n"); 
-                     goto go; 
-         }  
- } 
-   
- char *gets0(str)        /* Accept text input, ^Z aborts back to menu level */ 
- char *str; 
- { 
-         if (igsp(str) == 'Z'-0x40) 
-         return str; 
- } 
-   
-   
- int yesp() 
- { 
-         char c; 
-         while (1) 
-         { 
-                 column = 1;             /* prevent spurious newlines */ 
-   
-                 if ((- c  = toupper(- igsp (- gets0 (- strbuf )))) == 'Y')
 
-                         return TRUE; 
-                 else if (c == 'N') 
-                         return FALSE; 
-                 p("Please answer 'yes' or 'no'... ? ") 
-         } 
- } 
-   
-   
- display() 
- { 
-         int i; 
-   
-         p("\nThe configuration options are currently set as follows:\n\n") 
-   
-         p(" Code#       Option                   Current Setting\n") 
-         p(" -----       ------                   ---------------") 
-         p("\n  0:       Default Drive           ") 
-         if (defdsk == 0xff) 
-                 p("Currently logged drive") 
-         else 
-                 printf("Drive %c:",-  defdsk  + 'A');
 
-   
-         p("\n  1:       Default User Area       ") 
-         if (defusr == 0xff) 
-                 p("Currently logged user area") 
-         else 
-   
-         p("\n  2:       Submit File Drive       ") 
-         if (defsub == 0xff) 
-                 p("Currently logged drive") 
-         else 
-                 printf("Drive %c:",-  defsub  + 'A');
 
-   
-         p("\n  3:       Console Interrupts      ") 
-         if (conpol) p("Enabled") else p("Disabled") 
-   
-         p("\n  4:       Suppress Warm Boot?     ") 
-         if (wboote) p("No") else p("Yes") 
-   
-         p("\n  5:       Strip Source Parity?    ") 
-         if (pstrip) p("Yes") else p("No") 
-   
-         p("\n  6:       Recognize User Areas?   ") 
-         if (nouser) p("No") else p("Yes") 
-   
-         p("\n  7:       Write RED Error File?   ") 
-         if (werrs) p("Yes") else p("No") 
-   
-         p("\n  8:       Optimization Mode       ") 
-         if (optim == 0) 
-                 p("Fast Execution, Long Code Sequences") 
-         else 
-         { 
-                 p("Short Code, ") 
-                 if (optim == 0x80) 
-                         p("No Restarts") 
-                 else 
-                 { 
-                         p("Use RST vectors: ") 
-                         for (i = 1; i < 8; i++) 
-                         if (optim & (1 << (i - 1))) 
-                 } 
-         } 
-   
-         p("\n  9:       Default CDB RST Vector  ") 
-   
-         p("\n\n") 
- } 
-   
- read_block() 
- { 
-         if ((fd_cc = open("CC.COM", 2)) == ERROR || 
-             (fd_clink = open("CLINK.COM", 2)) == ERROR) 
-         { 
-            p("\nCCONFIG requires copies of both CC.COM and CLINK.COM") 
-            p("to be present in the currently logged directory. Please copy") 
-            p("them to this directory now, then run CCONFIG again.\n") 
-         } 
-         if (read(fd_cc, secbuf, 1) != 1) 
-         { 
-                 p("Disk error reading CC.COM.") 
-         } 
-         movmem(&secbuf[0x55], cblock, NBYTES); 
- } 
-   
- write_block() 
- { 
-         movmem(cblock, &secbuf[0x55], NBYTES); 
-         seek(fd_cc, 0, 0); 
-         if (write(fd_cc, secbuf, 1) == 1) 
-                 close(fd_cc); 
-         else 
-         { 
-                 p("\nError writing CC.COM.") 
-          foo:   p("Please place fresh copies of CC.COM and") 
-                 p("CLINK.COM in the current directory, and run CCONFIG") 
-                 p("again. Sorry, but I don't know why this happened.\n") 
-         } 
-   
-         read(fd_clink, secbuf, 1); 
-         movmem(cblock, &secbuf[0x03], NBYTES); 
-         seek(fd_clink, 0, 0); 
-         if (write(fd_clink, secbuf, 1) == 1) 
-                 close(fd_clink); 
-         else 
-         { 
-                 p("\nError writing CLINK.COM.") 
-                 goto foo; 
-         } 
-   
-         p("\nCC.COM and CLINK.COM successfully updated.\n"); 
- } 
-   
- prnt(str)       /* print given text, automatically filling to length of line */ 
- char *str; 
- { 
-         char c; 
-   
-         while (c = *str++) 
-         { 
-                 if (c != '\n' && (wdlen(str) + column++) < (MAXCOL - 3)) 
-                 { 
-                         if (!*str) 
-                         continue; 
-                 } 
-   
-   
-   
-                 column = 1; 
-         } 
- } 
-   
-   
- int getch()     /* get a char of text */ 
- { 
-         int c; 
-         p("\n") 
-         return c; 
- } 
-   
-   
- int wdlen(txt)  /* return length of text word */ 
- char *txt; 
- { 
-         int i; 
-         for (- i  = 0; *- txt  && !isspace(*- txt ++);-  i ++)
 
-                 ; 
-         return i; 
- } 
-   
-   
- int ask(txt) 
- char *txt; 
- { 
-         char strbuf[30]; 
-   
-         if (txt) 
-                 p(txt) 
-   
-   
-         column = 0; 
-   
-                 return TRUE; 
-         else 
-                 return FALSE; 
- } 
-   
- char igsp(txt)          /* return first non-space character */ 
- char *txt; 
- { 
-         char c; 
-                 ; 
-         return c; 
- } 
-   
- init() 
- { 
-   
-         int dodefdsk(), dodefusr(), dodefsub(), doconpol(), dowboote(); 
-         int dopstrip(), donouser(), dowerrs(), dooptim(), docdbrst(); 
-   
-         initptr(&funcs, &dodefdsk, &dodefusr, &dodefsub, &doconpol, &dowboote, 
-                  &dopstrip, &donouser, &dowerrs, &dooptim, &docdbrst, NULL); 
-   
-         made_changes = column = 0; 
- }