home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Collection - Online Library - January 1996 / CKITOS2196.ISO / diskette / gg244090.dsk / unc.dsk / CHAPTER.07 / MATHO_M.C < prev    next >
C/C++ Source or Header  |  1993-10-28  |  5KB  |  124 lines

  1. /******************************************************************************/
  2. /* Module  : matho_m.c                                                        */
  3. /* Purpose : Server manager code. Implements the add procedures that will be  */
  4. /*           called from the client matho_c.                                  */
  5. /******************************************************************************/
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <dce/rpc.h>
  12. #include "errchk.h"
  13. #include "matho.h"
  14.  
  15. #define OBJ_UUID_STR_LEN 36
  16.  
  17. extern char **argv_global;
  18.  
  19. /******************************************************************************/
  20. /* Procedure  : add_int                                                       */
  21. /* Purpose    : Add numv integer values passed in number string array value_a */
  22. /*              placing the sum in total. Uses object UUID and explicit       */
  23. /*              binding.                                                      */
  24. /******************************************************************************/
  25.  
  26. void add_int (
  27.    handle_t bh,
  28.    value_s_t value_a[],
  29.    long numv,
  30.    value_s_t total )
  31. {
  32.    char **argv;
  33.    unsigned32 status;
  34.    char *str_bind_p, obj_uuid_str[ OBJ_UUID_STR_LEN + 1 ];
  35.    int i, aux;
  36.  
  37.    /* Get argv from a global variable to be used in the errchk macro.         */
  38.    argv = argv_global;
  39.  
  40.    /* Print the object UUID coming from the client.                           */
  41.    rpc_binding_to_string_binding ( bh, &str_bind_p, &status );
  42.    ERRCHK ( status );
  43.    strncpy ( obj_uuid_str, str_bind_p, OBJ_UUID_STR_LEN );
  44.    obj_uuid_str[ OBJ_UUID_STR_LEN ] = '\0';
  45.    printf( "Incoming object UUID : %s\n", obj_uuid_str );
  46.    rpc_string_free ( &str_bind_p, &status );
  47.    ERRCHK ( status );
  48.  
  49.    /* Display the parameters that have been passed.                           */
  50.    printf ( "Add_int has been called with numv = %d\n", numv );
  51.    for ( i = 0; i < numv; i++ )
  52.       printf ( "Value_a[ %d ] = %s\n", i, value_a[ i ] );
  53.  
  54.    /* Zero the accumulator.                                                   */
  55.    aux = 0;
  56.  
  57.    /* Add the values in the array of size numv accumulating the results.      */
  58.    for ( i = 0; i < MAX_VALUES && i < numv; i++ )
  59.       aux += atoi ( value_a[ i ] );
  60.  
  61.    /* Convert the result into a string placing it in an output variable.      */
  62.    sprintf ( total, "%d", aux );
  63. }
  64.  
  65. /* Declare and initialize the integer manager EPV table.                      */
  66. matho_v1_0_epv_t epv_int = { add_int };
  67.  
  68. /******************************************************************************/
  69. /* Procedure  : add_float                                                     */
  70. /* Purpose    : Add numv float values passed in number string array value_a   */
  71. /*              placing the sum in total. Uses object UUID and explicit       */
  72. /*              binding.                                                      */
  73. /******************************************************************************/
  74.  
  75. void add_float (
  76.    handle_t bh,
  77.    value_s_t value_a[],
  78.    long numv,
  79.    value_s_t total )
  80. {
  81.    char **argv;
  82.    char *pstring;
  83.    unsigned32 status;
  84.    char *str_bind_p, obj_uuid_str[ 37 ];
  85.    int i;
  86.    float aux;
  87.  
  88.    /* Get argv from a global variable to be used in the errchk macro.         */
  89.    argv = argv_global;
  90.  
  91.    /* Print the object UUID coming from the client.                           */
  92.    rpc_binding_to_string_binding ( bh, &str_bind_p, &status );
  93.    ERRCHK ( status );
  94.    strncpy ( obj_uuid_str, str_bind_p, OBJ_UUID_STR_LEN );
  95.    obj_uuid_str[ OBJ_UUID_STR_LEN ] = '\0';
  96.    printf( "Incoming object UUID : %s\n", obj_uuid_str );
  97.    rpc_string_free ( &str_bind_p, &status );
  98.    ERRCHK ( status );
  99.  
  100.    /* Display the parameters that have been passed.                           */
  101.    printf ( "Add_float has been called with numv = %d\n", numv );
  102.    for ( i = 0; i < numv; i++ )
  103.       printf ( "Value_a[ %d ] = %s\n", i, value_a[ i ] );
  104.  
  105.    /* Zero the accumulator.                                                   */
  106.    aux = 0.0;
  107.  
  108.    /* Add the values in the array of size numv accumulating the results.      */
  109.    for ( i = 0; i < MAX_VALUES && i < numv; i++ )
  110.       aux += atof ( value_a[ i ] );
  111.  
  112.    pstring = obj_uuid_str;
  113.    while ( (*pstring = toupper(*pstring) ) ) 
  114.         pstring++;
  115.    /* Determine the precision desired for the total based on the object UUID. */
  116.    if ( strcmp ( obj_uuid_str, OBJ_UUID_FLOAT ) == 0 ) 
  117.       sprintf ( total, "%8.3f", aux );
  118.    else 
  119.       sprintf ( total, "%11.6f", aux );
  120. }
  121.  
  122. /* Declare and initialize the float manager EPV table.                        */
  123. matho_v1_0_epv_t epv_float = { add_float };
  124.