Go to the first, previous, next, last section, table of contents.
It is possible to link an Asir library to use the functionalities of
Asir from other programs.
The necessary libraries are included in the OpenXM distribution
(OpenXM )
(http://www.math.kobe-u.ac.jp/OpenXM
).
At present only the OpenXM interfaces are available. Here we assume
that OpenXM is already installed. In the following
$OpenXM_HOME
denotes the OpenXM root directory.
All the library files are placed in `$OpenXM_HOME/lib'.
There are three kinds of libraries as follows.
int asir_ox_init(int byteorder)
void asir_ox_push_cmo(void *cmo)
int asir_ox_peek_cmo_size()
int asir_ox_pop_cmo(void *cmo, int limit)
asir_ox_peek_cmo_size
is called.
void asir_ox_push_cmd(int cmd)
void asir_ox_execute_string(char *str)
A program calling the above functions should include `$OpenXM_HOME/include/asir/ox.h'. In this file all the definitions of OpenXM tags and commands. The following example (`$OpenXM_HOME/doc/oxlib/test3.c') illustrates the usage of the above functions.
#include <asir/ox.h> #include <signal.h> main(int argc, char **argv) { char buf[BUFSIZ+1]; int c; unsigned char sendbuf[BUFSIZ+10]; unsigned char *result; unsigned char h[3]; int len,i,j; static int result_len = 0; char *kwd,*bdy; unsigned int cmd; signal(SIGINT,SIG_IGN); asir_ox_init(1); /* 1: network byte order; 0: native byte order */ result_len = BUFSIZ; result = (void *)malloc(BUFSIZ); while ( 1 ) { printf("Input>"); fflush(stdout); fgets(buf,BUFSIZ,stdin); for ( i = 0; buf[i] && isspace(buf[i]); i++ ); if ( !buf[i] ) continue; kwd = buf+i; for ( ; buf[i] && !isspace(buf[i]); i++ ); buf[i] = 0; bdy = buf+i+1; if ( !strcmp(kwd,"asir") ) { sprintf(sendbuf,"%s;",bdy); asir_ox_execute_string(sendbuf); } else if ( !strcmp(kwd,"push") ) { h[0] = 0; h[2] = 0; j = 0; while ( 1 ) { for ( ; (c= *bdy) && isspace(c); bdy++ ); if ( !c ) break; else if ( h[0] ) { h[1] = c; sendbuf[j++] = strtoul(h,0,16); h[0] = 0; } else h[0] = c; bdy++; } if ( h[0] ) fprintf(stderr,"Number of characters is odd.\n"); else { sendbuf[j] = 0; asir_ox_push_cmo(sendbuf); } } else if ( !strcmp(kwd,"cmd") ) { cmd = atoi(bdy); asir_ox_push_cmd(cmd); } else if ( !strcmp(kwd,"pop") ) { len = asir_ox_peek_cmo_size(); if ( !len ) continue; if ( len > result_len ) { result = (char *)realloc(result,len); result_len = len; } asir_ox_pop_cmo(result,len); printf("Output>"); fflush(stdout); printf("\n"); for ( i = 0; i < len; ) { printf("%02x ",result[i]); i++; if ( !(i%16) ) printf("\n"); } printf("\n"); } } }
This program receives a line in the form of keyword body as an input and it executes the following operations according to keyword.
asir
body
asir_ox_execute_string()
is called.
push
body
asir_ox_push_cmo()
is called.
pop
asir_ox_peek_cmo_size()
and asir_ox_pop_cmo()
are called.
cmd
body
asir_ox_push_cmd()
is called.
Go to the first, previous, next, last section, table of contents.