/********************************************************/
/* BinDrv library example */
/* ====================== */
/* */
/* file bdrv.c */
/* ``````````` */
/* Example of use of BinDrv */
/* */
/* (c) 2011 Fair Isaac Corporation */
/* author: Y. Colombani, 2011 */
/********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "bindrv.h"
static void writeit(void);
static void readit(void);
static void *dummy_malloc(size_t s,void *ctx);
int main()
{
writeit();
readit();
return 0;
}
/*****************************/
/* Create a BinDrv data file */
/*****************************/
static void writeit(void)
{
FILE *f;
s_bindrvctx bdrv;
unsigned char data[]={1,2,3,4,5,6,7,8};
f=fopen("bindata","w");
bdrv=bindrv_newwriter((size_t (*)(const void *,size_t,size_t,void*))fwrite,f);
bindrv_putctrl(bdrv,BINDRV_CTRL_LABEL); bindrv_putstring(bdrv,"A");
bindrv_putctrl(bdrv,BINDRV_CTRL_OPENLST);
bindrv_putctrl(bdrv,BINDRV_CTRL_OPENNDX); bindrv_putint(bdrv,1);
bindrv_putctrl(bdrv,BINDRV_CTRL_CLOSENDX);
bindrv_putreal(bdrv,0.45);bindrv_putreal(bdrv,-31.02); bindrv_putint(bdrv,-28);
bindrv_putctrl(bdrv,BINDRV_CTRL_CLOSELST);
bindrv_putctrl(bdrv,BINDRV_CTRL_LABEL); bindrv_putstring(bdrv,"B");
bindrv_putbool(bdrv,1);
bindrv_putctrl(bdrv,BINDRV_CTRL_LABEL); bindrv_putstring(bdrv,"C");
bindrv_putstring(bdrv,"sometext");
bindrv_putctrl(bdrv,BINDRV_CTRL_LABEL); bindrv_putstring(bdrv,"D");
bindrv_putlong(bdrv,(BINDRV_LONG)INT_MAX*11);
bindrv_putctrl(bdrv,BINDRV_CTRL_LABEL); bindrv_putstring(bdrv,"E");
bindrv_putdata(bdrv,data,sizeof(data));
bindrv_delete(bdrv);
fclose(f);
}
/***************************************/
/* Read and display a BinDrv data file */
/***************************************/
static void readit(void)
{
FILE *f;
s_bindrvctx bdrv;
union { int i; double r; char b; char *str; void *data; BINDRV_LONG l;} val;
size_t size,i;
f=fopen("bindata","r");
bdrv=bindrv_newreader((size_t (*)(void *,size_t,size_t,void*))fread,f);
/* By default the library will allocate strings (returned by 'getstring') */
/* using 'malloc'. The following routine allows to replace 'malloc' by some */
/* user-defined memory allocation routine (that gets a context as an */
/* extra parameter) */
bindrv_setalloc(bdrv,dummy_malloc,NULL);
while(bindrv_nexttoken(bdrv)>=0)
{
switch(bindrv_nexttoken(bdrv))
{
case BINDRV_TYP_INT:
bindrv_getint(bdrv,&(val.i));
printf(" %d",val.i);
break;
case BINDRV_TYP_DATA:
bindrv_getdata(bdrv,&(val.data),&size);
printf(" ");
for(i=0;i<size;i++)
printf("%02x",val.str[i]);
break;
case BINDRV_TYP_REAL:
bindrv_getreal(bdrv,&(val.r));
printf(" %g",val.r);
break;
case BINDRV_TYP_STR:
bindrv_getstring(bdrv,&(val.str));
printf(" %s",val.str);
break;
case BINDRV_TYP_BOOL:
bindrv_getbool(bdrv,&(val.b));
printf(" %s",val.b?"true":"false");
break;
case BINDRV_TYP_CTRL:
bindrv_getctrl(bdrv,&(val.i));
switch(val.i)
{
case BINDRV_CTRL_SKIP: printf(" *"); break;
case BINDRV_CTRL_LABEL:
bindrv_getstring(bdrv,&(val.str));
printf("\n%s:",val.str);
break;
case BINDRV_CTRL_OPENLST: printf("["); break;
case BINDRV_CTRL_CLOSELST: printf("]"); break;
case BINDRV_CTRL_OPENNDX: printf("("); break;
case BINDRV_CTRL_CLOSENDX: printf(")"); break;
case BINDRV_CTRL_NIL: printf(" ?"); break;
default:
fprintf(stderr,"Unexpected control\n");
exit(1);
}
break;
case BINDRV_TYP_LONG:
bindrv_getlong(bdrv,&(val.l));
printf(" %lld",val.l);
break;
default:
fprintf(stderr,"Unexpected token\n");
exit(1);
}
}
bindrv_delete(bdrv);
fclose(f);
printf("\n");
}
/* A dummy malloc function using a static region */
static void *dummy_malloc(size_t s,void *ctx)
{
static char buf[1024];
return (s>1024)?NULL:buf;
}
|
/********************************************************/
/* BinDrv library example */
/* ====================== */
/* */
/* file bdrv.java */
/* `````````````` */
/* Example of use of BinDrv */
/* */
/* (c) 2011 Fair Isaac Corporation */
/* author: Y. Colombani, 2011 */
/********************************************************/
import java.io.*;
import java.nio.*;
import com.dashoptimization.*;
public class bdrv
{
public static void main(String[] args) throws Exception
{
ByteBuffer buf=ByteBuffer.allocate(128);
writeIt();
readIt();
writeIt(buf);
buf.rewind();
readIt(buf);
}
/*****************************/
/* Create a BinDrv data file */
/*****************************/
static void writeIt() throws IOException
{
BinDrvWriter bdrv;
FileOutputStream f;
byte[] data={1,2,3,4,5,6,7,8};
f=new FileOutputStream("bindata");
bdrv=new BinDrvWriter(f);
bdrv.putControl(bdrv.CTRL_LABEL).put("A");
bdrv.putControl(bdrv.CTRL_OPENLST);
bdrv.putControl(bdrv.CTRL_OPENNDX).put(1).putControl(bdrv.CTRL_CLOSENDX);
bdrv.put(0.45).put(-31.02).put(-123);
bdrv.putControl(bdrv.CTRL_CLOSELST);
bdrv.putControl(bdrv.CTRL_LABEL).put("B").put(true);
bdrv.putControl(bdrv.CTRL_LABEL).put("C").put("sometext");
bdrv.putControl(bdrv.CTRL_LABEL).put("D").put(Long.MAX_VALUE/2);
bdrv.putControl(bdrv.CTRL_LABEL).put("E").put(data);
f.close();
}
/***************************************/
/* Read and display a BinDrv data file */
/***************************************/
static void readIt() throws IOException
{
BinDrvReader bdrv;
FileInputStream f;
f=new FileInputStream("bindata");
bdrv=new BinDrvReader(f);
while(bdrv.nextToken()>=0)
{
switch(bdrv.nextToken())
{
case BinDrvReader.TYP_INT:
System.out.print(" "+bdrv.getInt());
break;
case BinDrvReader.TYP_DATA:
{
byte[] data;
data=bdrv.getData();
System.out.print(" ");
if(data!=null)
{
for(int i=0;i<data.length;i++)
System.out.print(String.format("%02x",data[i]));
}
break;
}
case BinDrvReader.TYP_REAL:
System.out.print(" "+bdrv.getReal());
break;
case BinDrvReader.TYP_STR:
System.out.print(" "+bdrv.getString());
break;
case BinDrvReader.TYP_BOOL:
System.out.print(" "+bdrv.getBoolean());
break;
case BinDrvReader.TYP_CTRL:
switch(bdrv.getControl())
{
case BinDrvReader.CTRL_SKIP: System.out.print(" *"); break;
case BinDrvReader.CTRL_LABEL: System.out.print("\n"+bdrv.getString()+":"); break;
case BinDrvReader.CTRL_OPENLST: System.out.print("["); break;
case BinDrvReader.CTRL_CLOSELST: System.out.print("]"); break;
case BinDrvReader.CTRL_OPENNDX: System.out.print("("); break;
case BinDrvReader.CTRL_CLOSENDX: System.out.print(")"); break;
case BinDrvReader.CTRL_NIL: System.out.print(" ?"); break;
default:
System.out.println("Unexpected Control");
System.exit(0);
}
break;
case BinDrvReader.TYP_LONG:
System.out.print(" "+bdrv.getLong());
break;
default:
System.out.println("Unexpected token: "+bdrv.nextToken());
System.exit(0);
}
}
f.close();
System.out.println("");
}
/*******************************/
/* Create a BinDrv data buffer */
/*******************************/
static void writeIt(ByteBuffer buf)
{
byte[] data={1,2,3,4,5,6,7,8};
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_LABEL);
BinDrvWriter.put(buf,"A");
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_OPENLST);
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_OPENNDX);
BinDrvWriter.put(buf,1);
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_CLOSENDX);
BinDrvWriter.put(buf,0.45);
BinDrvWriter.put(buf,-31.02);
BinDrvWriter.put(buf,-123);
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_CLOSELST);
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_LABEL);
BinDrvWriter.put(buf,"B");
BinDrvWriter.put(buf,true);
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_LABEL);
BinDrvWriter.put(buf,"C");
BinDrvWriter.put(buf,"sometext");
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_LABEL);
BinDrvWriter.put(buf,"D");
BinDrvWriter.put(buf,Long.MAX_VALUE/2);
BinDrvWriter.putControl(buf,BinDrvWriter.CTRL_LABEL);
BinDrvWriter.put(buf,"E");
BinDrvWriter.put(buf,data);
buf.limit(buf.position());
}
/*****************************************/
/* Read and display a BinDrv data buffer */
/*****************************************/
static void readIt(ByteBuffer buf) throws IOException
{
while(BinDrvReader.nextToken(buf)>=0)
{
switch(BinDrvReader.nextToken(buf))
{
case BinDrvReader.TYP_INT:
System.out.print(" "+BinDrvReader.getInt(buf));
break;
case BinDrvReader.TYP_DATA:
{
byte[] data;
data=BinDrvReader.getData(buf);
System.out.print(" ");
if(data!=null)
{
for(int i=0;i<data.length;i++)
System.out.print(String.format("%02x",data[i]));
}
break;
}
case BinDrvReader.TYP_REAL:
System.out.print(" "+BinDrvReader.getReal(buf));
break;
case BinDrvReader.TYP_STR:
System.out.print(" "+BinDrvReader.getString(buf));
break;
case BinDrvReader.TYP_BOOL:
System.out.print(" "+BinDrvReader.getBoolean(buf));
break;
case BinDrvReader.TYP_CTRL:
switch(BinDrvReader.getControl(buf))
{
case BinDrvReader.CTRL_SKIP: System.out.print(" *"); break;
case BinDrvReader.CTRL_LABEL: System.out.print("\n"+BinDrvReader.getString(buf)+":"); break;
case BinDrvReader.CTRL_OPENLST: System.out.print("["); break;
case BinDrvReader.CTRL_CLOSELST: System.out.print("]"); break;
case BinDrvReader.CTRL_OPENNDX: System.out.print("("); break;
case BinDrvReader.CTRL_CLOSENDX: System.out.print(")"); break;
case BinDrvReader.CTRL_NIL: System.out.print(" ?"); break;
default:
System.out.println("Unexpected Control");
System.exit(0);
}
break;
case BinDrvReader.TYP_LONG:
System.out.print(" "+BinDrvReader.getLong(buf));
break;
default:
System.out.println("Unexpected token: "+BinDrvReader.nextToken(buf));
System.exit(0);
}
}
System.out.println("");
}
}
|