/*
 * Copyright (c) 1996, 1997 The University of Utah and
 * the Computer Systems Laboratory at the University of Utah (CSL).
 *
 * This file is part of Flick, the Flexible IDL Compiler Kit.
 *
 * Flick is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Flick is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Flick; see the file COPYING.  If not, write to
 * the Free Software Foundation, 59 Temple Place #330, Boston, MA 02111, USA.
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <mach/message.h>
#include <mach/port.h>
#include <mach/mig_errors.h>
#include "interface_-client.h"
#include "interface_-server.h"

int call_server(mach_msg_header_t *request_ptr, mach_msg_header_t *reply_ptr) {
  return math_server(request_ptr, reply_ptr);
}

int call_client(mach_port_t right) {
  static short int a = 50, b = 50;
  static int c = 500, d = 500;
  static int which = 1;
  int vals[10];
  CORBA_sequence_integer lst;
  short int res_short;
  int reslong;
  int fail;
  lst._buffer = &vals[0];
  
  switch (which) {
  case 1:
    res_short = math_addshort(right,a,b);
    fail = res_short!=(a+b);
    break;
  case 2:
    res_short = math_subshort(right,a,b);
    fail = res_short!=(a-b);
    break;
  case 3:
    res_short = math_multshort(right,a,b);
    fail = res_short!=(a*b);
    break;
  case 4:
    reslong = math_addlong(right,c,d);
    fail = reslong!=(c+d);
    break;
  case 5:
    reslong = math_sublong(right,c,d);
    fail = reslong!=(c-d);
    break;
  case 6:
    reslong = math_multlong(right,c,d);
    fail = reslong!=(c*d);
    break;
  case 7:
    lst._length = a%10;
    if (a%10 < 0)
      lst._length = -lst._length;
    for(res_short = 0; res_short < lst._length; res_short++) {
      lst._buffer[res_short] = (c+res_short)%127;
    }
    reslong = math_addlonglist(right,&lst);
    for(res_short = 0; res_short < lst._length; res_short++)
      reslong -= ((c+res_short)%127);
    fail = reslong;
    break;
  case 8:
    lst._length = a%10;
    if (a%10 < 0)
      lst._length = -lst._length;
    for(res_short = 0; res_short < lst._length; res_short++) {
      lst._buffer[res_short] = (c + res_short) % 13;
      if (!lst._buffer[res_short])
	lst._buffer[res_short] = 1;
    }
    reslong = math_multlonglist(right,&lst);
    for(res_short = 0; res_short < lst._length; res_short++)
      if ((c + res_short) % 13)
	reslong /= ((c + res_short) % 13);
    fail = (reslong != 1);
    break;
  }

  which =  which % 8 + 1;
  
  a = (a > -100) ? a - 1 : 100;
  b = (b < 100) ? b + 1 : -100;
  c = (c > -10000) ? c - 6 : 10000;
  d = (d < 10000) ? d + 6 : -10000;
  if (fail)
    printf("result: %d\n",(which > 3)?reslong:res_short);
  return fail;
}

short int math_server_addshort(mom_ref_t o, short int a, short int b) {
  return (a+b);
}

short int math_server_subshort(mom_ref_t o, short int a, short int b) {
  return (a-b);
}

short int math_server_multshort(mom_ref_t o, short int a, short int b) {
  return (a*b);
}

int math_server_addlong(mom_ref_t o, int a, int b) {
  return (a+b);
}

int math_server_sublong(mom_ref_t o, int a, int b) {
  return (a-b);
}

int math_server_multlong(mom_ref_t o, int a, int b) {
  return (a*b);
}

int math_server_addlonglist(mom_ref_t o, CORBA_sequence_integer *a) {
  int res = 0;
  int temp;
  for (temp = 0; temp < a->_length; temp++) {
    res += a->_buffer[temp];
  }
  return res;
}
int math_server_multlonglist(mom_ref_t o, CORBA_sequence_integer *a) {
  int res = 1;
  int temp;
  for (temp = 0; temp < a->_length; temp++) {
    res *= a->_buffer[temp];
  }
  return res;
}

/* End of file. */



syntax highlighted by Code2HTML, v. 0.9.1