testagent.c

来自「SRI international 发布的OAA框架软件」· C语言 代码 · 共 177 行

C
177
字号
// $Id: TestAgent.c,v 1.2 2005/03/30 18:49:07 agno Exp $

#include <stdio.h>
#include <string.h>
#include <libicl.h>
#include <liboaa.h>

static ICLTerm *stringSoln0  = NULL;
static ICLTerm *stringSoln1  = NULL;
static ICLTerm *stringSoln2  = NULL;
static ICLTerm *stringSoln5  = NULL;
static ICLTerm *stringSoln10 = NULL;
static ICLTerm *stringSoln20 = NULL;
static ICLTerm *stringSoln50 = NULL;
static ICLTerm *doNothingSoln = NULL;

static char big[1024*50];
static char buf[1024*50 + 1];

static int add_callback(ICLTerm* goal, ICLTerm* params, ICLTerm* solutions);
static void buildMakeStringSolution(int size, ICLTerm **solution);
static int doNothing_callback(ICLTerm* goal, ICLTerm* params, ICLTerm* solutions);
static void init_callback_results(void);
static int makeString_callback(ICLTerm* goal, ICLTerm* params, ICLTerm* solutions);
static int setup_oaa_connection(int argc, char *argv[]);

int main(int argc, char *argv[]) {
    oaa_Init(argc, argv);
    init_callback_results();
    setup_oaa_connection(argc, argv);
}

static int add_callback(ICLTerm* goal,
                        ICLTerm* params,
                        ICLTerm* solutions) {
    int x = icl_Int(icl_NthTerm(goal, 1));
    int y = icl_Int(icl_NthTerm(goal, 2));
    int sum = x + y;

    icl_AddToList(solutions, icl_NewStruct("add", 3, icl_NewInt(x),
                     icl_NewInt(y), icl_NewInt(sum)), TRUE);
    return TRUE;
}

static void buildMakeStringSolution(int size, ICLTerm **solution) {
  int initialized = FALSE;
  static char big[1024*50];
  static char buf[1024*50 + 1];

  memset(big, 0, 1024 * 50);
  memset(buf, 0, 1024 * 50 + 1);

  if (!initialized) {
    // fill the array named "big" with printing characters
    size_t i = 0;
    size_t size = sizeof big;
    for (i = 0; i < size; i++) {
      big[i] = (char)(32 + (i % 95)); // one of the printing characters...
    }
    initialized = TRUE;
  }

  *solution = icl_NewStruct("makeString", 2,
                            icl_NewInt(size),
                            icl_NewStr(strncpy(buf, big, 1024*size)));
}

static void init_callback_results() {
// pre-built results callbacks
// Note: stringSoln0 is not zero length because binarytermreader
// does not like zero-length strings

  stringSoln0  = icl_NewStruct("makeString", 2, icl_NewInt(0), icl_NewStr(" "));
  buildMakeStringSolution(1,  &stringSoln1);
  buildMakeStringSolution(2,  &stringSoln2);
  buildMakeStringSolution(5,  &stringSoln5);
  buildMakeStringSolution(10, &stringSoln10);
  buildMakeStringSolution(20, &stringSoln20);
  buildMakeStringSolution(50, &stringSoln50);

  doNothingSoln = icl_NewStruct("doNothing", 1, icl_NewStr("nothing"));
}

static int makeString_callback(ICLTerm* goal,
                               ICLTerm* params,
                               ICLTerm* solutions) {

    ICLTerm *solution = NULL;

    int size  = icl_Int(icl_NthTerm(goal, 1));

    switch (size) {
      case 0:
        solution = stringSoln0;
        break;
      case 1:
        solution = stringSoln1;
        break;
      case 2:
        solution = stringSoln2;
        break;
      case 5:
        solution = stringSoln5;
        break;
      case 10:
        solution = stringSoln10;
        break;
      case 20:
        solution = stringSoln20;
        break;
      case 50:
        solution = stringSoln50;
        break;
      default:
        fprintf(stderr, "Unexpected makeString_callback, size: %li\n", size);fflush(stderr);
        solution = stringSoln0;
     }

    icl_AddToList(solutions, icl_CopyTerm(solution), TRUE);

    return TRUE;
}

static int doNothing_callback(ICLTerm* goal,
                              ICLTerm* params,
                              ICLTerm* solutions) {

    icl_AddToList(solutions, icl_CopyTerm(doNothingSoln), TRUE);

    return TRUE;
}

static int setup_oaa_connection(int argc, char *argv[]) {
    char *solvableString =
        "[solvable(doNothing(Anything), [callback(doNothing)]), \
          solvable(makeString(Size, BigString), [callback(makeString)]), \
          solvable(add(X,Y,Sum), [callback(add)])]";

    ICLTerm* mySolvablesAsList = icl_NewTermFromString(solvableString);
    if (!oaa_SetupCommunication("TestAgent")) {
        printf("Could not connect\n");
        fflush(stdout);
        return FALSE;
    }

    if (!oaa_Register("parent", "TestAgent", mySolvablesAsList)) {
        printf("Could not register\n");
        fflush(stdout);
        return FALSE;
    }

    printf("solvables: %s\n", icl_NewStringFromTerm(mySolvablesAsList));
    fflush(stdout);

    if (!oaa_RegisterCallback("doNothing", doNothing_callback)) {
        printf("Could not register doNothing callback\n");
        fflush(stdout);
    }

    if (!oaa_RegisterCallback("makeString", makeString_callback)) {
        printf("Could not register makeString callback\n");
        fflush(stdout);
    }

    /* The following solvables are used by the java unit tests */
    if (!oaa_RegisterCallback("add", add_callback)) {
        printf("Could not register add callback\n");
        fflush(stdout);
    }

    icl_Free(mySolvablesAsList);

    oaa_MainLoop(TRUE);
    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?