home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 281_01 / lib_demo.c < prev    next >
C/C++ Source or Header  |  1988-10-06  |  26KB  |  852 lines

  1. /*  lib_demo.c
  2.  *
  3.  *  UCLIB 5.00 Demo program
  4.  *
  5.  */
  6.  
  7. #include <stdio.h>
  8.  
  9. #include "uc_defs.h"
  10. #include "uc_glob.h"
  11. #include "uc_proto.h"
  12. #include "uc_key.h"
  13.  
  14. #include "wn_defs.h"
  15. #include "wn_glob.h"    /* used for declaration of sound_on  */
  16.  
  17.  
  18. /*
  19.  *  There are not many comments in this program since the comments
  20.  *  for each function are effect located in the reference guide.
  21.  *  Please refer to that file as you go through this code.  It
  22.  *  should provide you with a complete overview of each function
  23.  *  and how it may be called and used.    Sorry but no complete
  24.  *  manual exists for this version.  Registered users will receive
  25.  *  a disk containing the test programs used by the author in
  26.  *  developing the library.  If you feel a full manual would be
  27.  *  of help drop a line to the author.    If enough such requests
  28.  *  are received a complete manual will be considered for future
  29.  *  versions of the library.
  30.  *
  31.  */
  32.  
  33.  
  34. char   test_str[] = "     This is a test string     ";
  35.  
  36. char   tmp_str[ 100 ];
  37.  
  38.  
  39. void main( int argc, char argv[]  )
  40. {
  41.    int    i;
  42.    long il;
  43.    char in_str[ 81 ];
  44.    int    cstart;
  45.    int    cstop;
  46.    char *str_mon();
  47.    int    back;
  48.    int    fore;
  49.  
  50.  
  51.    uc_init();        /* Inititalize various system variables */
  52.    if ( mouse_exist )
  53.       m_flagdec();
  54.  
  55.    if ( argc > 2 )
  56.       sound_on = 0;
  57.  
  58.    cls_clr( mk_att( BLUE, WHITE + BRIGHT ) );
  59.  
  60.  
  61.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  62.    "\n\n                          ┌──────────────────────┐\n" );
  63.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  64.    "                          │   Unicorn Software   │\n" );
  65.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  66.    "                          │     P.O. Box 3214    │\n" );
  67.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  68.    "                          │      Kirkland Wa     │\n" );
  69.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  70.    "                          │      98083-3214      │\n" );
  71.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  72.    "                          │    (206) 823-4656    │\n" );
  73.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  74.    "                          └──────────────────────┘\n\n" );
  75.  
  76.    c_printf( mk_att( BLUE, MAGENTA + BRIGHT ),
  77.    "             ════════════════════════════════════════════════════\n\n" );
  78.  
  79.    c_printf( mk_att( BLUE, RED ),
  80.    "                Welcome to version 5.00 of the Unicorn Library\n\n" );
  81.  
  82.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  83.  "\t\t   This demo program will illustrate " );
  84.  
  85.  
  86.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  87.    "some " );
  88.  
  89.  
  90.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  91.    "of the new library's\n" );
  92.  
  93.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  94.  "\t\t   capabilities.  It is impossible to show everyone of the " );
  95.  
  96.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  97.    "over\n\t\t   300 functions " );
  98.  
  99.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  100.  "contained in the library.  You might also try\n" );
  101.  
  102.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  103.  "\t\t   the programs `" );
  104.  
  105.    c_printf( mk_att( BLUE, GREEN ),
  106.    "WINDOW.EXE" );
  107.  
  108.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  109.    "' and `" );
  110.  
  111.    c_printf( mk_att( BLUE, GREEN ),
  112.    "TDATA.EXE" );
  113.  
  114.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  115.    "' which demonstrate\n" );
  116.  
  117.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  118.  "\t\t   the windowing and data entry portions of the library.      \n" );
  119.  
  120.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  121.  "\t\t   At several points during the demo the program will stop and\n" );
  122.  
  123.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  124.  "\t\t   wait.  Whenever this occurs simply press a key to continue.\n" );
  125.  
  126.    uc_key();
  127.  
  128.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  129.  "\n\t\t   There now that wasn't so hard!  Just remember to press a\n" );
  130.  
  131.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  132.  "\t\t   key whenever the program has stopped.\n" );
  133.  
  134.    uc_key();
  135.  
  136.    cls_clr( mk_att( RED, WHITE + BRIGHT ) );
  137.  
  138.    c_printf( mk_att( RED, MAGENTA + BRIGHT ),
  139.  "\n\t\tFirst we will look at the three primary screen control functions.\n\n" );
  140.  
  141.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  142.  "\t1. " );
  143.  
  144.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  145.  "A full color version of the standard printf function.  This\n" );
  146.  
  147.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  148.  "\t\thas been used to provide all the screen output you have seen up\n" );
  149.  
  150.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  151.  "\t\ttill now.  It works the same as the normal printf, accepting all\n" );
  152.  
  153.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  154.  "\t\tthe usual printf formatting parameters with two exceptions.  It\n" );
  155.  
  156.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  157.  "\t\trequires a first parameter that is the attribute desired and\n" );
  158.  
  159.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  160.  "\t\tsecondly will not scroll the screen when the bottom line is\n" );
  161.  
  162.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  163.  "\t\treached.  Other than this it works the same including a variable\n" );
  164.  
  165.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  166.  "\t\tnumber of arguments.                                            \n" );
  167.  
  168.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  169.  "\n\t2. " );
  170.  
  171.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  172.  "A Clear screen function that allows clearing the screen to a\n" );
  173.  
  174.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  175.  "\t\tparticular attribute.  It has been used to clear the screen in this\n" );
  176.  
  177.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  178.  "\t\tdemo.                                                           \n" );
  179.  
  180.  
  181.  
  182.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  183.  "\n\t3. " );
  184.  
  185.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  186.  "A full color version of gets which allows the use of user input\n" );
  187.  
  188.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  189.  "\t\tusing a desired attribute or at least not destroying the current\n" );
  190.  
  191.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  192.  "\t\tscreen attibute.                                                \n" );
  193.  
  194.    uc_key();
  195.  
  196.  
  197.    cls_clr( mk_att( CYAN, BROWN + BRIGHT ) );
  198.  
  199.    c_printf( mk_att( CYAN, BROWN + BRIGHT ),
  200.    "\n\n\t\tNow try typing in a string with the c_gets function.\n\n" );
  201.  
  202.    i = c_gets( mk_att( CYAN, BLACK ), in_str );
  203.  
  204.    c_printf( mk_att( CYAN, BROWN + BRIGHT ),
  205.    "\n\n\tThe string you typed had " );
  206.  
  207.    c_printf( mk_att( CYAN, RED + BRIGHT ),
  208.     "%d", i );
  209.  
  210.    c_printf( mk_att( CYAN, BROWN + BRIGHT ),
  211.     " characters and was\n\t" );
  212.  
  213.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  214.     "<%s>", in_str );
  215.  
  216.    c_printf( mk_att( CYAN, BROWN + BRIGHT ), "\n\n" );
  217.  
  218.    c_printf( mk_att( CYAN, BROWN + BRIGHT ),
  219.    "\n\n\tDid you try to edit your string?  If not why not try again.\n\n" );
  220.  
  221.    i = c_gets( mk_att( CYAN, BLACK ), in_str );
  222.  
  223.  
  224.    c_printf( mk_att( CYAN, BROWN + BRIGHT ),
  225.    "\n\n\tThe string you typed had " );
  226.  
  227.    c_printf( mk_att( CYAN, RED + BRIGHT ),
  228.     "%d", i );
  229.  
  230.    c_printf( mk_att( CYAN, BROWN + BRIGHT ),
  231.     " characters and was\n\t" );
  232.  
  233.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  234.     "<%s>", in_str );
  235.  
  236.    c_printf( mk_att( CYAN, BROWN + BRIGHT ), "\n\n" );
  237.  
  238.    uc_key();
  239.    if ( sound_on )
  240.       uc_error();
  241.  
  242.    cls_clr( mk_att( GREEN, BLUE + BRIGHT ) );
  243.  
  244.    c_printf( mk_att( GREEN, BLUE + BRIGHT ),
  245.    "\n\n\n\t\tAs you can see these three functions provide considerable\n" );
  246.  
  247.    c_printf( mk_att( GREEN, BLUE + BRIGHT ),
  248.    "\t\tcontrol over how the screen appears and this degree of\n" );
  249.  
  250.    c_printf( mk_att( GREEN, BLUE + BRIGHT ),
  251.    "\t\tcontrol is easy to achieve as you will see when you\n" );
  252.  
  253.    c_printf( mk_att( GREEN, BLUE + BRIGHT ),
  254.    "\t\tlook at the source code for this demo.\n" );
  255.  
  256.    uc_key();
  257.    if ( sound_on )
  258.       uc_ok();
  259.  
  260.    c_printf( mk_att( GREEN, WHITE + BRIGHT ),
  261.    "\n\n\t\tNext we will look at some of the functions designed\n" );
  262.  
  263.    c_printf( mk_att( GREEN, WHITE + BRIGHT ),
  264.    "\t\tfor general string handling and manipulation.\n" );
  265.  
  266.    c_printf( mk_att( GREEN, WHITE + BRIGHT ),
  267.    "\t\tThe source code for all of the demo programs is provided\n" );
  268.  
  269.    c_printf( mk_att( GREEN, WHITE + BRIGHT ),
  270.    "\t\tto aid you in using the library functions.\n" );
  271.  
  272.  
  273.    uc_key();
  274.    if ( sound_on )
  275.       uc_tone( 1000, .25 );
  276.  
  277.    cls_clr( mk_att( MAGENTA, BROWN + BRIGHT ) );
  278.  
  279.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ),
  280.    "\n\tNow we will take a look at some of the string handling functions.\n\n" );
  281.  
  282.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ),
  283.    "\tFor the purpose of this demo we will use the following string\n\t" );
  284.  
  285.    c_printf( mk_att( RED, BLUE + BRIGHT ),
  286.    "%s", test_str );
  287.  
  288.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ),
  289.    " complete with the leading and\n" );
  290.  
  291.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ),
  292.    "\ttrailing spaces.\n\n" );
  293.  
  294.    uc_key();
  295.    if ( sound_on )
  296.       siren( 3 );
  297.  
  298.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  299.    "\tFirst you might wish to strip the leading white space which would\n" );
  300.  
  301.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  302.    "\tproduce the string '" );
  303.  
  304.    strcpy( tmp_str, test_str );
  305.    i = del_lwh( tmp_str );
  306.  
  307.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ), "%s", tmp_str );
  308.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), "'" );
  309.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), "  The original\n" );
  310.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  311.    "\tstring had a length of " );
  312.  
  313.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ), "%d", strlen( test_str ) );
  314.  
  315.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  316.    " while the new string has a length of " );
  317.  
  318.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ),
  319.    "%d", i );
  320.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), ".\n\n" );
  321.  
  322.    strcpy( tmp_str, test_str );
  323.    i = del_twh( tmp_str );
  324.  
  325.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  326.    "\tYou might wish to strip the trailing white space instead which\n" );
  327.  
  328.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  329.    "\twould produce the string '" );
  330.  
  331.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ), "%s", tmp_str );
  332.  
  333.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  334.    "' with a length\n\tof " );
  335.  
  336.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ), "%d", i );
  337.  
  338.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), ".\n\n" );
  339.  
  340.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  341.    "\tIt is also posible to remove ALL spaces in the string resulting in\n\t'" );
  342.  
  343.    strcpy( tmp_str, test_str );
  344.    i = del_blnks( tmp_str );
  345.  
  346.    c_printf( mk_att( MAGENTA, BROWN + BRIGHT ), "%s", tmp_str );
  347.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), "'.\n" );
  348.  
  349.  
  350.  
  351.    uc_key();
  352.  
  353.    cls_clr( mk_att( BLUE, WHITE + BRIGHT ) );
  354.  
  355.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  356.    "\n\n\tLet's use the same test string for some further operations.\n" );
  357.  
  358.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  359.    "\tFirst we could change the case of every character in\n" );
  360.  
  361.    strcpy( tmp_str, test_str );
  362.    i = chng_case( tmp_str );
  363.  
  364.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  365.    "\t%s", test_str );
  366.  
  367.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  368.    " Which would produce\n\t" );
  369.  
  370.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  371.    "%s", tmp_str );
  372.  
  373.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  374.    ".  We could also convert\n\t" );
  375.  
  376.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  377.    "the entire string to upper case\n\t" );
  378.  
  379.    strcpy( tmp_str, test_str );
  380.    strtoup( tmp_str );
  381.  
  382.    c_printf( mk_att( GREEN, WHITE + BRIGHT ),
  383.    "%s", tmp_str );
  384.  
  385.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  386.    " or we could convert the\n\t" );
  387.  
  388.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  389.    "entire string to lower case like this\n\t" );
  390.  
  391.    strcpy( tmp_str, test_str );
  392.    strtolow( tmp_str );
  393.  
  394.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  395.    "%s", tmp_str );
  396.  
  397.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  398.    ".\n\n\t" );
  399.  
  400.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  401.    "We could also shift the string to the right\n\t" );
  402.  
  403.    strcpy( tmp_str, test_str );
  404.    shr_str( tmp_str );
  405.  
  406.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  407.    "%s", tmp_str );
  408.  
  409.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  410.    ".\n\t" );
  411.  
  412.  
  413.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  414.    "It is also possible to right justify the string\n\t" );
  415.  
  416.    strcpy( tmp_str, test_str );
  417.    str_rjst( tmp_str );
  418.  
  419.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  420.    "%s", tmp_str );
  421.  
  422.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  423.    ".\n\t" );
  424.  
  425.  
  426.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  427.    "Or we could left justify the string like this\n\t" );
  428.  
  429.    strcpy( tmp_str, test_str );
  430.    str_ljst( tmp_str );
  431.  
  432.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  433.    "%s", tmp_str );
  434.  
  435.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  436.    ".\n\n\t" );
  437.  
  438.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  439.    "We can also reverse the order of a string like this\n\t" );
  440.  
  441.    strcpy( tmp_str, test_str );
  442.    str_rev( tmp_str );
  443.  
  444.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  445.    "%s", tmp_str );
  446.  
  447.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  448.    ".\n\n\t" );
  449.  
  450.  
  451.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  452.    "There are a variety of other string handling functions in the\n\t" );
  453.  
  454.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  455.    "library.  Look at the reference guide for further details.\n\t" );
  456.  
  457.  
  458.    uc_key();
  459.  
  460.    cls_clr( mk_att( RED, WHITE + BRIGHT ) );
  461.  
  462.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  463.    "\n\n\tNext we will look at some of the date and time formatting\n" );
  464.  
  465.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  466.    "\troutines.  First we will take the date Saturday 10 Sept. 88 and find\n" );
  467.  
  468.  
  469.    il = day2jul( 880910L );
  470.  
  471.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  472.    "\tthat it is julian day number %ld and ", il );
  473.  
  474.    i = dayofwk( il );
  475.  
  476.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  477.    "it is day number %d in the week.\n", i );
  478.  
  479.    i = day_of_yr( 88, 9, 10 );
  480.  
  481.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  482.    "\tThis same day is also day number %d in the year.\n", i );
  483.  
  484.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  485.    "\tWe can also take the julian date and convert it \n", i );
  486.  
  487.    il = gregorian( il );
  488.  
  489.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  490.    "\tback to a gregorian date like --> '%ld'.\n", il );
  491.  
  492.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  493.    "\n\tThe current day is %s according to the internal clock\n", str_date() );
  494.  
  495.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  496.    "\tand the current time is %s while the week day is '%s'.\n",
  497.         str_time(), wkday_str()  );
  498.  
  499.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  500.    "\tIf we use the date 880910 ( Sept. 10, 1988 ) we may easily.\n" );
  501.  
  502.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  503.    "\tprint the month like this '%s'.\n", str_mon( 880910L ) );
  504.  
  505.  
  506.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  507.    "\n\tThe dates are stored internally as YYYYMMDD or YYMMDD to\n" );
  508.  
  509.    c_printf( mk_att( RED, WHITE + BRIGHT ),
  510.    "\tallow for easier sorting.\n" );
  511.  
  512.    uc_key();
  513.  
  514.    cls_clr( mk_att( BLUE, WHITE + BRIGHT ) );
  515.  
  516.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  517.    "\n\n\tWe can also change the cursor, even in response to a user key.\n" );
  518.  
  519.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  520.    "\tTry pressing the insert key.\n" );
  521.  
  522.    cstart = cur_start();
  523.    cstop  = cur_stop();
  524.  
  525.    while ( uc_key() != K_INS )
  526.    {
  527.       c_printf( mk_att( RED, BLACK ),
  528.       "\tPlease press the insert key.\n" );
  529.       if ( sound_on )
  530.      uc_beep();
  531.    }
  532.  
  533.    setcursh( 0, 6 );
  534.  
  535.    uc_key();
  536.  
  537.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  538.    "\tThe cursor shape may be set to any desired shape.\n" );
  539.  
  540.    setcursh( 0, 3 );
  541.    uc_key();
  542.  
  543.    setcursh( 3, 6 );
  544.    uc_key();
  545.  
  546.    setcursh( 3, 4 );
  547.    uc_key();
  548.  
  549.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  550.    "\tThese shapes may be set by the program or in response to a user\n" );
  551.  
  552.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  553.    "\tor a condition within your progam.\n" );
  554.  
  555.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  556.    "\tThere are functions designed to detect virtually any key on the\n" );
  557.  
  558.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  559.    "\tbeyboard.  Most are defined in the keys header although actual\n" );
  560.  
  561.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  562.    "\tfunctions are used for some of the special keys.\n" );
  563.  
  564.  
  565.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  566.    "\tNow press any key to return the cursor to normal.\n" );
  567.  
  568.    setcursh( cstart, cstop );
  569.  
  570.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  571.    "\tIn addition the cursor may be moved anywhere on the screen.\n" );
  572.  
  573.    gotorc( 10, 20, 0 );
  574.    uc_key();
  575.  
  576.    gotorc( 12, 30, 0 );
  577.    uc_key();
  578.  
  579.    gotorc( 14, 40, 0 );
  580.    uc_key();
  581.  
  582.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  583.    "\n\tThe cursor movement function includes a page parameter so\n" );
  584.  
  585.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  586.    "\tyou may move the cursor on a video page other than the one\n" );
  587.  
  588.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  589.    "\tcurrently being viewed.\n" );
  590.  
  591.  
  592.    uc_key();
  593.  
  594.  
  595.    cls_clr( mk_att( CYAN, BLUE + BRIGHT ) );
  596.  
  597.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  598.    "\n\n\tOther groups of functions include a full set of printer control\n" );
  599.  
  600.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  601.    "\tfunctions for both the epson style and the Diablo style Daisy\n" );
  602.  
  603.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  604.    "\twheel printers.  These functions allow almost total control\n" );
  605.  
  606.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  607.    "\tof output including character pitch on the dot matrix type.\n" );
  608.  
  609.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  610.    "\tIn addition there is a complete set of mouse control functions\n" );
  611.  
  612.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  613.    "\tnot included in this demo.  A later release will include mouse\n" );
  614.  
  615.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  616.    "\tcontrol for the menu functions to be found in version 2.00.\n" );
  617.  
  618.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  619.    "\n\tThere are over 300 functions and a long list of macros included\n" );
  620.  
  621.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  622.    "\tin this library.  It is anticipated that the list will grow much\n" );
  623.  
  624.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  625.    "\tlonger by the time version 2.00 is released.\n" );
  626.  
  627.  
  628.    uc_key();
  629.  
  630.  
  631.    cls_clr( mk_att( RED, BROWN + BRIGHT ) );
  632.  
  633.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  634.    "\n\n\tFor the mathematical crowd we find a wide variety of math\n" );
  635.  
  636.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  637.    "\tfunctions that will grow larger in future versions of the library.\n" );
  638.  
  639.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  640.    "\tLet's look at the greatest common divisor function first.\n" );
  641.  
  642.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  643.    "\tThe greatest common divisor of 45 and 18 is %ld.\n", gcd( 45L, 18L ) );
  644.  
  645.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  646.    "\tThe greatest common divisor of 237451 and 557187 is %ld.\n",
  647.                 gcd( 237451L, 557187L ) );
  648.  
  649.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  650.    "\tThe greatest common divisor of 5840931 and 28510683 is %ld.\n",
  651.                 gcd( 5840931L, 28510683L ) );
  652.  
  653.  
  654.    blk_str( "G C D", 15, 15, mk_att( RED, WHITE + BRIGHT ), 0 );
  655.  
  656.    uc_key();
  657.  
  658.    cls_clr( mk_att( MAGENTA, WHITE + BRIGHT ) );
  659.  
  660.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  661.    "\n\n\tThe are also a wide variety or area and volume functions\n\n\n" );
  662.  
  663.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  664.    "\tThe area of a circle of radius 5 is %.14f\n", a_circle( 5.0 ) );
  665.  
  666.  
  667.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  668.    "\tThe area of an ellipse with major and minor radii of 3 and 5\n" );
  669.  
  670.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), "\tis %.14f\n",
  671.                     a_ellipse( 3.0, 5.0 ) );
  672.  
  673.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  674.    "\tThe lateral surface area of a cone of radius 5 and height 7\n" );
  675.  
  676.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), "\tis %.14f\n",
  677.                         al_cone( 5.0, 7.0 ) );
  678.  
  679.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  680.    "\tThe volume of a sphere of radius 3\n" );
  681.  
  682.  
  683.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), "\tis %.14f\n",
  684.                              v_sphere( 3.0 ) );
  685.  
  686.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ),
  687.    "\tThe volume of a cone of radius 4 and height 9 is\n" );
  688.  
  689.    c_printf( mk_att( MAGENTA, WHITE + BRIGHT ), "\tis %.14f\n",
  690.                         v_cone( 4.0, 9.0 ) );
  691.  
  692.    uc_key();
  693.  
  694.    cls_clr( mk_att( CYAN, BLUE + BRIGHT ) );
  695.  
  696.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  697.    "\n\n\tFor those who need to handle check writing we have $245.67 =\n" );
  698.  
  699.    nbr2wrds( 245.67, tmp_str );
  700.  
  701.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  702.    "\t%s dollars.\n\n", tmp_str );
  703.  
  704.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  705.    "\tBy the way the attribute used for this screen is %d or %x Hex.\n",
  706.             read_att( 0 ), read_att( 0 ) );
  707.  
  708.    unmk_att( read_att( 0 ), &back, &fore );
  709.  
  710.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  711.    "\tThe current foreground color is %d and the background is %d.\n",
  712.                   fore, back );
  713.  
  714.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  715.    "\n\tWe can also replace characters in a string; For example using\n" );
  716.  
  717.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  718.    "\tThe string 'This is a test' let's replace 's' with 'S'\n" );
  719.  
  720.    strcpy( tmp_str, "This is a test" );
  721.  
  722.    replacech( tmp_str, 's', 'S' );
  723.  
  724.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  725.    "\twhich gives us '%s'\n", tmp_str );
  726.  
  727.    c_printf( mk_att( CYAN, BLUE + BRIGHT ),
  728.    "\tThe letter 'S' occurs %d times in the above string.\n",
  729.                         countch( tmp_str, 'S' ) );
  730.  
  731.    uc_key();
  732.  
  733.    cls_clr( mk_att( RED, BROWN + BRIGHT ) );
  734.  
  735.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  736.    "\n\n\tFor the mundane task of unit conversion a variety of predefined\n" );
  737.  
  738.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  739.    "\tconversions are built into the library.\n\n\n" );
  740.  
  741.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  742.    "\t\t\t\t\t5 inches   = %14.10f cm.\n", inch_cm( 5.0 ) );
  743.  
  744.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  745.    "\t\t\t\t\t5 cm       = %14.10f inches.\n", cm_inch( 5.0 ) );
  746.  
  747.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  748.    "\t\t\t\t\t5 degrees  = %14.10f radians.\n", deg_rad( 5.0 ) );
  749.  
  750.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  751.    "\t\t\t\t\t5 radians  = %14.10f degrees.\n", rad_deg( 5.0 ) );
  752.  
  753.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  754.    "\t\t\t\t\t5 ounces   = %14.10f grams.\n", oz_gm( 5.0 ) );
  755.  
  756.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  757.    "\t\t\t\t\t5 grams    = %14.10f ounces. \n", gm_oz( 5.0 ) );
  758.  
  759.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  760.    "\t\t\t\t\t5 gallons  = %14.10f liters. \n", gal_lt( 5.0 ) );
  761.  
  762.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  763.    "\t\t\t\t\t5 liters   = %14.10f gallons.\n", lt_gal( 5.0 ) );
  764.  
  765.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  766.    "\t\t\t\t\t5 lb       = %14.10f kg.     \n", lb_kg( 5.0 ) );
  767.  
  768.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  769.    "\t\t\t\t\t5 kg       = %14.10f lb.     \n", kg_lb( 5.0 ) );
  770.  
  771.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  772.    "\t\t\t\t\t5 mi       = %14.10f km.     \n", mi_km( 5.0 ) );
  773.  
  774.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  775.    "\t\t\t\t\t5 km       = %14.10f mi.     \n", km_mi( 5.0 ) );
  776.  
  777.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  778.    "\t\t\t\t\t5 meters   = %14.10f yards.  \n", m_yd( 5.0 ) );
  779.  
  780.    c_printf( mk_att( RED, BROWN + BRIGHT ),
  781.    "\t\t\t\t\t5 yards    = %14.10f meters. \n", yd_m( 5.0 ) );
  782.  
  783.  
  784.    uc_key();
  785.  
  786.    cls_clr( mk_att( BLUE, WHITE + BRIGHT ) );
  787.  
  788.    c_printf( mk_att( BLUE, BROWN + BRIGHT ),
  789.    "\n\n\t\t\t\t\t\t\t\t\tGeneral Information\n\n\n" );
  790.  
  791.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  792.    "\t\tYou have seen some of the over 300 functions contained in the\n" );
  793.  
  794.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  795.    "\t\tlibrary in this demonstration program.  There are two other\n" );
  796.  
  797.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  798.    "\t\tdemo programs which you are encouraged to try 'WINDOW.EXE and\n" );
  799.  
  800.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  801.    "\t\tTDATA.EXE.  They demonstrate the Window and data entry packages\n" );
  802.  
  803.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  804.    "\t\tincluded in the library.  This library represents the work of\n" );
  805.  
  806.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  807.    "\t\ta single author over a period of more than a year.  It is not\n" );
  808.  
  809.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  810.    "\t\tfinished and will be updated in the future.  The problem with\n" );
  811.  
  812.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  813.    "\t\tany software project is deciding when to quit.  In the case of\n" );
  814.  
  815.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  816.    "\t\tthis library an arbitrary decision was made to release this\n" );
  817.  
  818.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  819.    "\t\tversion in its present state and continue on to new versions\n" );
  820.  
  821.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  822.    "\t\tin the comming months.  We hope you find this library useful\n" );
  823.  
  824.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  825.    "\t\tin your programming efforts and if so you are encouraged to\n" );
  826.  
  827.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  828.    "\t\tregister your copy.  See the file register.doc for information\n" );
  829.  
  830.    c_printf( mk_att( BLUE, WHITE + BRIGHT ),
  831.    "\t\tconcerning registration.\n" );
  832.  
  833.    c_printf( mk_att( BLUE, BLACK + BRIGHT ),
  834.    "\n\t\t  Unicorn Software  P.O. Box 3214 Kirkland, WA 98083-3214.\n" );
  835.  
  836.    c_printf( mk_att( BLUE, BLACK + BRIGHT ),
  837.    "\t\t                     David A. Miller\n" );
  838.  
  839.    c_printf( mk_att( BLUE, BLACK + BRIGHT ),
  840.    "\t\t                     (206) 823-4656\n" );
  841.  
  842.    c_printf( mk_att( BLUE, BLACK + BRIGHT ),
  843.    "\t\t                 No Collect calls Please\n" );
  844.  
  845.  
  846.    uc_key();
  847.    if ( sound_on )
  848.       phasor( 2 );
  849.  
  850.    cls();
  851. }
  852.