#
# stringlisttest
#
@PROBLEM stringlisttest
@LANGUAGE C
@MAJOR COL
@PATH /Testing/
@DESCRIPTION
String list test
@INPUT 1
@OBJECT STRINGLIST x
string list in input
@OUTPUT 1
@OBJECT SCALAR I count
Character count
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG I0
@ARG mI0
@ARG O0

@CODE
  int i;
  int wc = 0;

  for (i=0;i<*@mI0@;i++)
    wc += strlen(@I0@[i]);

  @O0@ = (int *)calloc(1,sizeof(int));
  *@O0@ = wc;

@END_CODE

#
# doubletest
#
@PROBLEM doubletest
@INCLUDE <unistd.h>
@LANGUAGE C
@MAJOR COL
@PATH /Testing/
@DESCRIPTION
Basic test
Adds 1 to an integer
@INPUT 1
@OBJECT SCALAR D x
integer in input
@OUTPUT 1
@OBJECT SCALAR D OUTPUT
integer in output
@COMPLEXITY 1000000,20000

@CALLINGSEQUENCE
@ARG I0, O0

@CODE
  *(@I0@) = *(@I0@) + 1.0;
  @O0@ = @I0@;
  sleep(5);
@END_CODE

#
# inttest
#
@PROBLEM inttest
@LANGUAGE C
@MAJOR COL
@PATH /Testing/
@DESCRIPTION
Basic test
Adds 1 to an integer
@INPUT 1
@OBJECT SCALAR I X
integer in input
@OUTPUT 1
@OBJECT SCALAR I O
integer in output
@COMPLEXITY 1,1
@CALLINGSEQUENCE
@ARG I0,O0

@CODE
  *(@I0@) = *(@I0@) + 1;
  @O0@ = @I0@;
  fprintf(stdout,"(The server has slept for 3 seconds for this test)");
  sleep(3);
@END_CODE

#
# packedfiletest
#
@PROBLEM packedfiletest
@LANGUAGE C
@MAJOR COL
@PATH /Testing/
@DESCRIPTION
Basiv test,
receives packed files, and
return them packed (with "DONE" appended to
each of them)
@INPUT 1
@OBJECT PACKEDFILES packed
n packed files
@OUTPUT 1
@OBJECT PACKEDFILES packed
n packed files
@COMPLEXITY 1,1
@CALLINGSEQUENCE
@ARG mI0
@ARG I0
@ARG O0

@CODE
char command[256];
int i,n;
char buffer[256];

n = *@mI0@;

@O0@ = (char **)calloc(n,sizeof(char*));
for (i=0;i<n;i++)
{
  sprintf(buffer,"test%d",i);
  @O0@[i] =strdup(buffer);
  sprintf(command,"cp %s %s",@I0@[i],@O0@[i]);
  system(command);
  sprintf(command,"echo DONE >> %s",@O0@[i]);
  system(command);
}
*@mO0@ = n;

@END_CODE

#
# stringtest
#
@PROBLEM stringtest
@LANGUAGE C
@MAJOR COL
@PATH /Testing/
@DESCRIPTION
Basic test
@INPUT 1
@OBJECT STRING string
A string
@OUTPUT 1
@OBJECT STRING newstring
the same string with
another first charcter
@COMPLEXITY 1,1
@CALLINGSEQUENCE
@ARG I0,O0

@CODE
  @O0@ = @I0@;
  @O0@[0] = 'X';
  
@END_CODE


#
# chartest
#
@PROBLEM chartest
@LANGUAGE C
@MAJOR COL
@PATH /Testing/
@DESCRIPTION
Basic test
Returns a matrix of chars
@INPUT 1
@OBJECT SCALAR I x
Any integer

@OUTPUT 1
@OBJECT MATRIX CHAR output
A matrix of chars
@COMPLEXITY 1,1
@CALLINGSEQUENCE
@ARG I0,O0

@CODE

  @O0@ = (char*)calloc(4,sizeof(char));

  @O0@[0] = 'a';
  @O0@[1] = 'b';
  @O0@[2] = 'c';
  @O0@[3] = 'd';
  *@mO0@ = 2;
  *@nO0@ = 2;
@END_CODE


#
# totaltest
#
@PROBLEM totaltest
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
Tests all the data types and structures.

@INPUT 22
@OBJECT SCALAR I SI
si
@OBJECT VECTOR I VI
vi
@OBJECT MATRIX I MI
mi
@OBJECT SCALAR CHAR SCHAR
schar
@OBJECT VECTOR CHAR VCHAR
vchar
@OBJECT MATRIX CHAR MCHAR
mchar
@OBJECT SCALAR S SS
ss
@OBJECT VECTOR S VS
vs
@OBJECT MATRIX S MS
ms
@OBJECT SCALAR D SD
sd
@OBJECT VECTOR D VD
vd
@OBJECT MATRIX D MD
md
@OBJECT SCALAR C SC
sc
@OBJECT VECTOR C VC
vc
@OBJECT MATRIX C MC
mc
@OBJECT SCALAR Z SZ
sz
@OBJECT VECTOR Z VZ
vz
@OBJECT MATRIX Z MZ
mz
@OBJECT SCALAR B SB
sb
@OBJECT VECTOR B VB
vb
@OBJECT MATRIX B MB
mb
@OBJECT STRING ST
st

@OUTPUT 22
@OBJECT SCALAR I SI
si
@OBJECT VECTOR I VI
vi
@OBJECT MATRIX I MI
mi
@OBJECT SCALAR CHAR SCHAR
schar
@OBJECT VECTOR CHAR VCHAR
vchar
@OBJECT MATRIX CHAR MCHAR
mchar
@OBJECT SCALAR S SS
ss
@OBJECT VECTOR S VS
vs
@OBJECT MATRIX S MS
ms
@OBJECT SCALAR D SD
sd
@OBJECT VECTOR D VD
vd
@OBJECT MATRIX D MD
md
@OBJECT SCALAR C SC
sc
@OBJECT VECTOR C VC
vc
@OBJECT MATRIX C MC
mc
@OBJECT SCALAR Z SZ
sz
@OBJECT VECTOR Z VZ
vz
@OBJECT MATRIX Z MZ
mz
@OBJECT SCALAR B SB
sb
@OBJECT VECTOR B VB
vb
@OBJECT MATRIX B MB
mb
@OBJECT STRING ST
st

@COMPLEXITY 15,2
@CALLINGSEQUENCE
@ARG I0,O0
@ARG I1,O1
@ARG mI1
@ARG I2,O2
@ARG mI2
@ARG nI2
@ARG lI2,lO2
@ARG I3,O3
@ARG I4,O4
@ARG mI4
@ARG I5,O5
@ARG mI5
@ARG nI5
@ARG lI5,lO5
@ARG I6,O6
@ARG I7,O7
@ARG mI7
@ARG I8,O8
@ARG mI8
@ARG nI8
@ARG lI8,lO8
@ARG I9,O9
@ARG I10,O10
@ARG mI10
@ARG I11,O11
@ARG mI11
@ARG nI11
@ARG lI11,lO11
@ARG I12,O12
@ARG I13,O13
@ARG mI13
@ARG I14,O14
@ARG mI14
@ARG nI14
@ARG lI14,lO14
@ARG I15,O15
@ARG I16,O16
@ARG mI16
@ARG I17,O17
@ARG mI17
@ARG nI17
@ARG lI17,lO17
@ARG I18,O18
@ARG I19,O19
@ARG mI19
@ARG I20,O20
@ARG mI20
@ARG nI20
@ARG lI20,lO20
@ARG I21,O21

@CODE
int i;


# Doing the loops

# Integers 

@I0@[0]+=1;
for (i=0;i<*@mI1@;i++)
  @I1@[i]+=1;
for (i=0;i<(*@mI2@) * (*@nI2@);i++)
  @I2@[i]+=1;

# Chars

@I3@[0]+=1;
for (i=0;i<*@mI4@;i++)
  @I4@[i]+=1;
for (i=0;i<(*@mI5@) * (*@nI5@);i++)
  @I5@[i]+=1;

# Floats

@I6@[0]+=1.0;
for (i=0;i<*@mI7@;i++)
  @I7@[i]+=1.0;
for (i=0;i<(*@mI8@)*(*@nI8@);i++)
  @I8@[i]+=1.0;

# Double

@I9@[0]+=1.0;
for (i=0;i<*@mI10@;i++)
  @I10@[i]+=1.0;
for (i=0;i<(*@mI11@)*(*@nI11@);i++)
  @I11@[i]+=1.0;

# Single Complex

@I12@[0].i+=1.0;
@I12@[0].r+=1.0;
for (i=0;i<*@mI13@;i++)
{
  @I13@[i].i+=1.0;
  @I13@[i].r+=1.0;
}
for (i=0;i<(*@mI14@)*(*@nI14@);i++)
{
  @I14@[i].i+=1.0;
  @I14@[i].r+=1.0;
}

# Double Complex

@I15@[0].i+=1.0;
@I15@[0].r+=1.0;
for (i=0;i<*@mI16@;i++)
{
  @I16@[i].i+=1.0;
  @I16@[i].r+=1.0;
}
for (i=0;i<(*@mI17@)*(*@nI17@);i++)
{
  @I17@[i].i+=1.0;
  @I17@[i].r+=1.0;
}

# Byte

@I18@[0]+=1;
for (i=0;i<*@mI19@;i++)
{
  @I19@[i]+=1;
}
for (i=0;i<(*@mI20@)*(*@nI20@);i++)
{
  @I20@[i]+=1;
}

# String
@I21@[0] = 'B';

# Setting the output

# Integers

@O0@ = @I0@;
@O1@ = @I1@;
*@mO1@ = *@mI1@;
@O2@ = @I2@;
*@mO2@ = *@mI2@;
*@nO2@ = *@nI2@;

# Chars

@O3@ = @I3@;
@O4@ = @I4@;
*@mO4@ = *@mI4@;
@O5@ = @I5@;
*@mO5@ = *@mI5@;
*@nO5@ = *@nI5@;

# Floats

@O6@ = @I6@;
@O7@ = @I7@;
*@mO7@ = *@mI7@;
@O8@ = @I8@;
*@mO8@ = *@mI8@;
*@nO8@ = *@nI8@;

# Double

@O9@ = @I9@;
@O10@ = @I10@;
*@mO10@ = *@mI10@;
@O11@ = @I11@;
*@mO11@ = *@mI11@;
*@nO11@ = *@nI11@;

# Single Complex

@O12@ = @I12@;
@O13@ = @I13@;
*@mO13@ = *@mI13@;
@O14@ = @I14@;
*@mO14@ = *@mI14@;
*@nO14@ = *@nI14@;

# Double Complex

@O15@ = @I15@;
@O16@ = @I16@;
*@mO16@ = *@mI16@;
@O17@ = @I17@;
*@mO17@ = *@mI17@;
*@nO17@ = *@nI17@;

# Bytes

@O18@ = @I18@;
@O19@ = @I19@;
*@mO19@ = *@mI19@;
@O20@ = @I20@;
*@mO20@ = *@mI20@;
*@nO20@ = *@nI20@;

# String
@O21@ = @I21@;

@END_CODE


#
# upftest
#
@PROBLEM upftest
@LANGUAGE FORTRAN
@MAJOR  COL
@PATH /Testing/upftest/
@DESCRIPTION
This is a test for the UPF mechanism

Performs B = upf0(upf1((A)).

the prototypes are :

@INPUT 3
@OBJECT UPF f1
Function #1
SUBROUTINE UPF0(A,B)
INTEGER A,B
or
void upf(a,b)
int *a, *b;

@OBJECT UPF f2
Function #2
SUBROUTINE UPF1(A,B)
INTEGER A,B
or
void upf(a,b)
int *a, *b;

@OBJECT SCALAR I x
Scalar A
@OUTPUT 1
@OBJECT SCALAR I y
Scalar B
@COMPLEXITY 15,2

@CALLINGSEQUENCE
@ARG I0
@ARG I1
@ARG I2
@ARG O0

@CODE
extern void upf0(int*, int*);
extern void upf1(int*, int*);

@O0@ = (int *)malloc(sizeof(int));
upf1(@I2@,@O0@);
upf0(@O0@, @O0@);

@END_CODE

#
# filetest
#
@PROBLEM filetest
@LANGUAGE C
@MAJOR  ROW
@PATH /Testing/filetest/
@DESCRIPTION
This is a test for the FILE mechanism
Does nothing on a file :)

@INPUT 1
@OBJECT FILE f
some file

@OUTPUT 1
@OBJECT FILE f
the same file

@COMPLEXITY 1,1

@CALLINGSEQUENCE
@ARG I0
@ARG O0

@CODE
char command[256];

sprintf(command,"cp %s %s",@I0@,@O0@);
system(command);
sprintf(command,"echo DONE >> %s",@O0@);
system(command);
@END_CODE

#----------------------------------------------------------------------
@PROBLEM pass
#----------------------------------------------------------------------

# Just pass inputs to outputs.......

#@FUNCTION PASS
@LANGUAGE C
@MAJOR ROW
@PATH  /test/
@DESCRIPTION
Mass vectors and matrixes
@INPUT 2
@OBJECT VECTOR I I0
Vector 1
@OBJECT MATRIX I I1
Matrix 1
@OUTPUT 2
@OBJECT VECTOR I O0
Vector 1
@OBJECT MATRIX I O1
Matrix 1
@COMPLEXITY 2,2

@CALLINGSEQUENCE
@ARG I0
@ARG mI0
@ARG I1
@ARG mI1
@ARG nI1
@ARG lI1
@ARG O0
@ARG O1

@CODE
{
*@mO0@ = *@mI0@;

*@mO1@ = *@mI1@;
*@nO1@ = *@nI1@;
*@lO1@ = *@lI1@;


@O0@ = @I0@;
@O1@ = @I1@;


} 
@END_CODE

#-------------------------------------------------------------------------
@PROBLEM vpass
#-------------------------------------------------------------------------

# Just pass inputs to outputs.......

#@FUNCTION PASS
@LANGUAGE C
@MAJOR ROW
@PATH  /test/
@DESCRIPTION
Mass vectors and matrixes
@INPUT 1
@OBJECT VECTOR I I0
Vector 1
@OUTPUT 1
@OBJECT VECTOR I O0
Vector 1
@COMPLEXITY 2,2

@CALLINGSEQUENCE
@ARG I0
@ARG mI0
@ARG O0

@CODE
{
*@mO0@ = *@mI0@;


/*fprintf(stderr,"Vector: %d\n", *@mI0@);*/

@O0@ = @I0@;


} 
@END_CODE




#-------------------------------------------------------------------------
@PROBLEM mpass
#-------------------------------------------------------------------------

# Just pass inputs to outputs.......

#@FUNCTION PASS
@LANGUAGE C
@MAJOR ROW
@PATH  /test/
@DESCRIPTION
Mass vectors and matrixes
@INPUT 1
@OBJECT MATRIX I I0
Matrix 1
@OUTPUT 1
@OBJECT MATRIX I O0
Matrix 1
@COMPLEXITY 2,2

@CALLINGSEQUENCE
@ARG I0
@ARG mI0
@ARG nI0
@ARG lI0
@ARG O0

@CODE
{

*@mO0@ = *@mI0@;
*@nO0@ = *@nI0@;
*@lO0@ = *@lI0@;

/* fprintf(stderr,"Matrix: %d * %d\n", *@mI0@,*@nI0@); */

@O0@ = @I0@;


} 
@END_CODE


#-------------------------------------------------------------------------
@PROBLEM multipass
#-------------------------------------------------------------------------

# Just pass inputs to outputs.......

#@FUNCTION PASS
@LANGUAGE C
@MAJOR ROW
@PATH  /test/
@DESCRIPTION
Mass vectors and matrixes
@INPUT 4
@OBJECT VECTOR I I0
Vector 1
@OBJECT MATRIX I I1
Matrix 1
@OBJECT SCALAR I I2
Integer 1
@OBJECT STRING I3
String 1
@OUTPUT 4
@OBJECT VECTOR I O0
Vector 1
@OBJECT MATRIX I O1
Matrix 1
@OBJECT SCALAR I O2
Integer 1
@OBJECT STRING O3
String 1
@COMPLEXITY 2,2

@CALLINGSEQUENCE
@ARG I0
@ARG mI0
@ARG I1
@ARG mI1
@ARG nI1
@ARG lI1
@ARG I2
@ARG I3
@ARG O0
@ARG O1
@ARG O2
@ARG O3

@CODE
{
*@mO0@ = *@mI0@;

*@mO1@ = *@mI1@;
*@nO1@ = *@nI1@;
*@lO1@ = *@lI1@;


@O0@ = @I0@;
@O1@ = @I1@;
@O2@ = @I2@;
@O3@ = @I3@;


} 
@END_CODE

#
# int_vector_add5
#
@PROBLEM int_vector_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
int vector plus 5
@INPUT 1
@OBJECT VECTOR I vec
in_vec
@OUTPUT 1
@OBJECT VECTOR I vec
out_vec
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG mI0
@ARG I0
@ARG O0

@CODE
int i;

  *@mO0@ = *@mI0@;
  @O0@ = (int*)malloc(sizeof(int)*(*@mO0@));

  for (i=0;i<*@mI0@;i++)
    @O0@[i] = @I0@[i] + 5;

@END_CODE

#
# float_vector_add5
#
@PROBLEM float_vector_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
int vector plus 5
@INPUT 1
@OBJECT VECTOR S vec
in_vec
@OUTPUT 1
@OBJECT VECTOR S vec
out_vec
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG mI0
@ARG I0
@ARG O0

@CODE
int i;

  *@mO0@ = *@mI0@;
  @O0@ = (float*)malloc(sizeof(float)*(*@mO0@));

  for (i=0;i<*@mI0@;i++)
    @O0@[i] = @I0@[i] + 5.0;

@END_CODE

#
# double_vector_add5
#
@PROBLEM double_vector_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
int vector plus 5
@INPUT 1
@OBJECT VECTOR D vec
in_vec
@OUTPUT 1
@OBJECT VECTOR D vec
out_vec
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG mI0
@ARG I0
@ARG O0

@CODE
int i;

  *@mO0@ = *@mI0@;
  @O0@ = (double*)malloc(sizeof(double)*(*@mO0@));

  for (i=0;i<*@mI0@;i++)
    @O0@[i] = @I0@[i] + 5.0;

@END_CODE

#
# char_vector_add5
# 
@PROBLEM char_vector_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
int vector plus 5
@INPUT 1
@OBJECT VECTOR CHAR vec
in_vec
@OUTPUT 1
@OBJECT VECTOR CHAR vec
out_vec
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG mI0
@ARG I0
@ARG O0

@CODE
int i;

  *@mO0@ = *@mI0@;
  @O0@ = (char*)malloc(sizeof(char)*(*@mO0@));

  for (i=0;i<*@mI0@;i++)
    @O0@[i] = @I0@[i] + 5;

@END_CODE

#
# int_matrix_add5
#
@PROBLEM int_matrix_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
int matrix plus 5
@INPUT 1
@OBJECT MATRIX I mat
in_mat
@OUTPUT 1
@OBJECT MATRIX I mat
out_mat
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG mI0
@ARG nI0, lI0
@ARG I0
@ARG O0

@CODE
int i,j;

  *@mO0@ = *@mI0@;
  *@nO0@ = *@nI0@;
  @O0@ = (int*)malloc(sizeof(int)*(*@mO0@)*(*@nI0@));

  for (i=0;i<*@mI0@;i++)
    for (j=0;j<*@mI0@;j++)
      @O0@[i*(*@nO0@)+j] = @I0@[i*(*@nI0@)+j] + 5;

@END_CODE

#
# float_matrix_add5
#
@PROBLEM float_matrix_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
float matrix plus 5
@INPUT 1
@OBJECT MATRIX S mat
in_mat
@OUTPUT 1
@OBJECT MATRIX S mat
out_mat
@COMPLEXITY 1,2 
@CALLINGSEQUENCE
@ARG mI0
@ARG nI0, lI0
@ARG I0 
@ARG O0 

@CODE
int i, j;

  *@mO0@ = *@mI0@;
  *@nO0@ = *@nI0@;
  @O0@ = (float*)malloc(sizeof(float)*(*@mO0@)*(*@nI0@));

  for (i=0;i<*@mI0@;i++)
    for (j=0;j<*@mI0@;j++)
      @O0@[i*(*@nO0@)+j] = @I0@[i*(*@nI0@)+j] + 5.0;
  
@END_CODE
  
#
# double_matrix_add5
#   
@PROBLEM double_matrix_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
double matrix plus 5
@INPUT 1
@OBJECT MATRIX D mat
in_mat
@OUTPUT 1
@OBJECT MATRIX D mat
out_mat
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG mI0
@ARG nI0, lI0
@ARG I0
@ARG O0

@CODE
int i, j;

  *@mO0@ = *@mI0@;
  *@nO0@ = *@nI0@;
  @O0@ = (double*)malloc(sizeof(double)*(*@mO0@)*(*@nI0@));

  for (i=0;i<*@mI0@;i++)
    for (j=0;j<*@mI0@;j++)
      @O0@[i*(*@nO0@)+j] = @I0@[i*(*@nI0@)+j] + 5.0;

@END_CODE

#
# char_matrix_add5
#
@PROBLEM char_matrix_add5
@LANGUAGE C
@MAJOR ROW
@PATH /Testing/
@DESCRIPTION
char matrix plus 5
@INPUT 1
@OBJECT MATRIX CHAR mat
in_mat
@OUTPUT 1
@OBJECT MATRIX CHAR mat
out_mat
@COMPLEXITY 1,2
@CALLINGSEQUENCE
@ARG mI0
@ARG nI0, lI0
@ARG I0
@ARG O0

@CODE
int i, j;

  *@mO0@ = *@mI0@;
  *@nO0@ = *@nI0@;
  @O0@ = (char*)malloc(sizeof(char)*(*@mO0@)*(*@nI0@));

  for (i=0;i<*@mI0@;i++)
    for (j=0;j<*@mI0@;j++)
      @O0@[i*(*@nO0@)+j] = @I0@[i*(*@nI0@)+j] + 5;
  
@END_CODE

#
# abort
#
@PROBLEM abort
@LANGUAGE C
@INCLUDE <stdlib.h>
@MAJOR ROW
@PATH  /Testing/
@DESCRIPTION
This function simply causes the service to abort
for testing purposes
@INPUT 1
@OBJECT SCALAR I x
dummy
@OUTPUT 1
@OBJECT SCALAR I y
dummy
@COMPLEXITY 1,1

@CALLINGSEQUENCE
@ARG I0
@ARG O0

@CODE

abort();

@END_CODE
