* Initial check-in

git-svn-id: trunk@14857 -
This commit is contained in:
michael 2010-02-04 12:58:02 +00:00
parent 39224aad96
commit 34f551ad5e
11 changed files with 4726 additions and 0 deletions

10
.gitattributes vendored
View File

@ -4111,6 +4111,16 @@ packages/librsvg/Makefile svneol=native#text/plain
packages/librsvg/Makefile.fpc svneol=native#text/plain
packages/librsvg/fpmake.pp svneol=native#text/plain
packages/librsvg/src/rsvg.pas svneol=native#text/plain
packages/libsee/Makefile svneol=native#text/plain
packages/libsee/Makefile.fpc svneol=native#text/plain
packages/libsee/README.txt svneol=native#text/plain
packages/libsee/examples/mod_stream.pp svneol=native#text/plain
packages/libsee/examples/teststream.pp svneol=native#text/plain
packages/libsee/examples/testwrite.pp svneol=native#text/plain
packages/libsee/examples/tlibsee.pp svneol=native#text/plain
packages/libsee/fpmake.pp svneol=native#text/plain
packages/libsee/src/libsee.pas svneol=native#text/plain
packages/libsee/src/libseewrap.c svneol=native#text/plain
packages/libxml/Makefile svneol=native#text/plain
packages/libxml/Makefile.fpc svneol=native#text/plain
packages/libxml/examples/Makefile svneol=native#text/plain

2802
packages/libsee/Makefile Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,30 @@
#
# Makefile.fpc for InterBase bindings
#
[package]
name=libsee
version=2.5.1
[target]
units=libsee
exampledirs=examples
[require]
libc=y
[install]
fpcpackage=y
[default]
fpcdir=../..
[compiler]
includedir=src
sourcedir=src
[shared]
build=n
[rules]
.NOTPARALLEL:

View File

@ -0,0 +1,27 @@
This package contains an interface unit to the libSEE library.
SEE = Simple ECMAScript Engine
libSEE is a library that executes Javascript code, and is written by David Leonard.
The library itself must be obtained separately from
http://www.adaptive-enterprises.com.au/~d/software/see/
The library tarball contains installation instructions.
Make sure you compile it with Garbage collection.
the libsee unit was generated from the header files of version 3.1 of
libsee. Note that all type names have been prepended with T. That means
that the C struct
SEE_interpreter
becomes
TSEE_interpreter
in pascal.
The examples directory contains some examples of what can be done
with libsee, including how to integrate Object Pascal objects in the
Javascript runtime environment.
Enjoy,
Michael.

View File

@ -0,0 +1,478 @@
unit mod_stream;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, libsee;
Procedure RegisterStreamModule;
Procedure RegisterWriteModule;
implementation
{ ---------------------------------------------------------------------
General auxiliary functions
---------------------------------------------------------------------}
Function ValueToString(V : TSee_Value) : string;
Var
PS : Ptcuint;
PD : PChar;
I : Integer;
begin
SetLength(Result,v.u._string^.length);
If Length(Result)<>0 then
begin
PD:=PChar(Result);
PS:=v.u._string^.data;
For I:=0 to length(Result)-1 do
begin
PD^:=Char(PS^ and $ff);
Inc(PD);
Inc(PS);
end;
end;
end;
Procedure CreateJSObject(Interp : PSEE_Interpreter; Parent : PSEE_Object;AName : PSEE_String; Obj : PSee_Object);
var
V : PSEE_Value;
begin
v:=new_see_value;
see_set_object(V,Obj);
see_object_put(interp,parent,AName,V,SEE_ATTR_DEFAULT);
end;
Procedure CreateJSNumber(Interp : PSEE_Interpreter; Obj : PSee_Object; AName : PSEE_String; AValue : TSEE_number_t);
var
V : PSEE_Value;
begin
v:=new_SEE_value;
see_set_number(V,AValue);
see_object_put(Interp,Obj,AName,v,SEE_ATTR_DEFAULT);
end;
Procedure CreateJSFunction(Interp : PSEE_Interpreter; Obj : PSee_Object; Func : TSEE_call_fn_t; AName : PSEE_String; Len : Integer);
var
V : PSEE_Value;
begin
v:=new_SEE_value;
see_set_object(V,see_cfunction_make(interp,Func,AName,len));
see_object_put(Interp,Obj,AName,v,SEE_ATTR_DEFAULT);
end;
{ ---------------------------------------------------------------------
Stream module support
---------------------------------------------------------------------}
Var
StreamModule : TSEE_module;
StreamObjectDef,
StreamPrototypeDef : PSEE_objectclass;
WriteModule : TSEE_module;
Type
TStreamModuleData = record
Stream : PSEE_object;
Prototype : PSEE_object;
Error : PSEE_object;
end;
PStreamModuleData = ^TStreamModuleData;
TStreamObject = record
native : TSEE_native;
Stream : TStream;
end;
PSTreamObject = ^TStreamObject;
Var
GStreamRead,
GStreamWrite,
GStreamSeek,
GStreamSize,
GStreamPosition,
GStreamFree,
GStreamfmCreate,
GStreamfmOpenRead,
GStreamfmOpenWrite,
GStreamfmOpenReadWrite,
GStreamStream,
GStreamError,
GStreamPrototype : PSEE_String;
Procedure StreamAlloc(Interp : PSEE_Interpreter); cdecl;
begin
PPointer(see_module_private(Interp,@StreamModule))^:=new(PStreamModuleData);
end;
Function PrivateData(Interp : PSEE_Interpreter) : PStreamModuleData;
begin
Result:=PStreamModuleData((see_module_private(Interp,@StreamModule))^)
end;
Function AsFile(i:PTSEE_interpreter; obj:PTSEE_object) : PStreamObject;
begin
If (Not Assigned(obj)) or (Obj^.objectclass<>StreamPrototypeDef) then
SEE_error__throw0(i,I^.TypeError,Nil);
Result:=PStreamObject(Obj)
end;
procedure StreamSize (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
S : PStreamObject;
begin
S:=AsFile(I,ThisObj);
If (S^.Stream=Nil) then
SEE_error__throw0(i,PrivateData(I)^.Error,Nil);
SEE_SET_NUMBER(res,S^.Stream.Size);
end;
procedure StreamWrite (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
S : PStreamObject;
v : TSEE_Value;
t : string;
begin
S:=AsFile(I,ThisObj);
If (S^.Stream=Nil) then
SEE_error__throw0(i,PrivateData(I)^.Error,'File is closed');
if (ArgC=0) then
SEE_error__throw0(i,I^.RangeError,'Missing argument');
SEE_ToString(i,argv[0], @v);
T:=ValueToString(V);
If Length(T)>0 then
S^.Stream.Write(T[1],Length(T));
end;
procedure StreamPosition (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
S : PStreamObject;
v : TSEE_Value;
t : string;
begin
S:=AsFile(I,ThisObj);
If (S^.Stream=Nil) then
SEE_error__throw0(i,PrivateData(I)^.Error,'File is closed');
SEE_SET_NUMBER(res,S^.Stream.Position);
end;
procedure StreamSeek (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
S : PStreamObject;
v : TSEE_Value;
newpos : integer;
begin
S:=AsFile(I,ThisObj);
If (S^.Stream=Nil) then
SEE_error__throw0(i,PrivateData(I)^.Error,'File is closed');
if (ArgC=0) then
SEE_error__throw0(i,I^.RangeError,'Missing argument');
newpos:=SEE_ToUint32(i,argv[0]);
SEE_SET_NUMBER(res,S^.Stream.Seek(soFromBeginning,newpos));
end;
procedure StreamRead (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
S : PStreamObject;
r : PSEE_String;
j,maxlen : integer;
c : char;
begin
S:=AsFile(I,ThisObj);
If (S^.Stream=Nil) then
SEE_error__throw0(i,PrivateData(I)^.Error,'File is closed');
if (ArgC=0) then
maxlen:=1024
else
maxlen:=see_touint32(I,argv[0]);
r:=see_string_new(I,maxlen);
For j:=0 to maxLen-1 do
begin
S^.stream.Read(c,sizeOf(c));
SEE_string_addch(R,ord(c));
end;
SEE_SET_STRING(Res,r);
end;
procedure StreamFree (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
S : PStreamObject;
v : TSEE_Value;
t : string;
begin
S:=AsFile(I,ThisObj);
If (S^.Stream=Nil) then
SEE_error__throw0(i,PrivateData(I)^.Error,'File is closed');
FreeAndNil(S^.Stream);
SEE_SET_UNDEFINED(Res);
end;
procedure StreamFinalize ( i:PTSEE_interpreter; p:pointer; closure:pointer);cdecl;
begin
FreeAndNil(PStreamObject(P)^.Stream);
end;
procedure StreamConstruct (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
P : PChar;
fm : Integer;
S : TStream;
Err : String;
R : PTSEE_Object;
begin
SEE_parse_args(i,argc,argv,'Z|i',@p,@fm);
If (P=Nil) then
SEE_error__throw0(i,I^.RangeError,'Missing argument');
Err:='';
try
S:=TFileStream.Create(strpas(p),fm);
except
On E : Exception do
Err:=E.Message;
end;
If (Err<>'') then
SEE_error__throw0(i,PrivateData(I)^.Error,PChar(Err));
R:=PTSEE_Object(SEE_malloc_finalize(I,SizeOf(TStreamObject),@StreamFinalize,Nil));
SEE_Native_init(PSEE_Native(R),I,StreamPrototypeDef,PrivateData(I)^.Prototype);
PStreamObject(r)^.Stream:=S;
SEE_SET_OBJECT(Res,R);
end;
Procedure StreamInit(Interp : PSEE_Interpreter); cdecl;
Var
Stream,
StreamPrototype,
StreamError : PSee_object;
begin
// writeln('Initializing stream');
// Construct Stream.prototype object
// writeln('Creating Stream Prototype ');
StreamPrototype:=PSEE_object(SEE_malloc(Interp,SizeOf(TSTreamObject)));
See_native_init(PSEE_native(StreamProtoType),Interp,StreamPrototypeDef,interp^.Object_prototype);
PSTreamObject(StreamPrototype)^.stream:=Nil;
createJSFUnction(Interp,StreamPrototype,@StreamRead,GStreamRead,0);
createJSFUnction(Interp,StreamPrototype,@StreamWrite,GStreamWrite,0);
createJSFUnction(Interp,StreamPrototype,@StreamSize,GStreamSize,0);
createJSFUnction(Interp,StreamPrototype,@StreamPosition,GStreamPosition,0);
createJSFUnction(Interp,StreamPrototype,@StreamSeek,GStreamSeek,0);
createJSFUnction(Interp,StreamPrototype,@StreamFree,GStreamFree,0);
// writeln('Creating Stream');
// Construct Stream object
Stream:=PSEE_object(new_see_native);
See_native_init(PSEE_native(Stream),Interp,StreamObjectDef,interp^.Object_prototype);
CreateJSObject(Interp,Interp^.Global,GStreamStream,Stream);
CreateJSObject(Interp,Stream,GStreamprototype,StreamPrototype);
CreateJSNumber(Interp,Stream,GStreamfmCreate,fmCreate);
CreateJSNumber(Interp,Stream,GStreamfmOpenRead,fmOpenRead);
CreateJSNumber(Interp,Stream,GStreamfmOpenWrite,fmOpenWrite);
CreateJSNumber(Interp,Stream,GStreamfmOpenReadWrite,fmOpenReadWrite);
StreamError:=SEE_Error_make(interp, GSTreamError);
PrivateData(Interp)^.Stream:=STream;
PrivateData(Interp)^.Prototype:=StreamPrototype;
PrivateData(Interp)^.Error:=StreamError;
// writeln('Done initializing stream');
end;
Procedure AllocateStreamStrings;
begin
GStreamRead:=SEE_intern_global('Read');
GStreamWrite:=SEE_intern_global('Write');
GStreamSeek:=SEE_intern_global('Seek');
GStreamSize:=SEE_intern_global('Size');
GStreamPosition:=SEE_intern_global('Position');
GStreamFree:=SEE_intern_global('Free');
GStreamfmCreate:=SEE_intern_global('fmCreate');
GStreamfmOpenRead:=SEE_intern_global('fmOpenRead');
GStreamfmOpenWrite:=SEE_intern_global('fmOpenWrite');
GStreamfmOpenReadWrite:=SEE_intern_global('fmOpenReadWrite');
GStreamStream:=SEE_intern_global('Stream');
GStreamError:=SEE_intern_global('Error');
GStreamPrototype:=SEE_intern_global('prototype');
end;
Function StreamInitModule : Integer; cdecl;
begin
// writeln('Initializing module');
StreamPrototypeDef:=new_SEE_objectclass;
With StreamPrototypeDef^ do
begin
_Class:='Stream';
get:=SEE_native_get;
put:=SEE_native_put;
canput:=SEE_native_canput;
hasproperty:=SEE_native_hasproperty;
Delete:=SEE_native_delete;
DefaultValue:=SEE_native_defaultvalue;
ENumerator:=SEE_native_enumerator;
Construct:=Nil;
Call:=Nil;
HasInstance:=Nil;
end;
StreamObjectDef:=new_SEE_objectclass;
With StreamObjectDef^ do
begin
_Class:='Stream';
get:=SEE_native_get;
put:=SEE_native_put;
get:=SEE_native_get;
put:=SEE_native_put;
canput:=SEE_native_canput;
hasproperty:=SEE_native_hasproperty;
Delete:=SEE_native_delete;
DefaultValue:=SEE_native_defaultvalue;
ENumerator:=SEE_native_enumerator;
Construct:=@StreamConstruct;
Call:=Nil;
HasInstance:=Nil;
end;
AllocateStreamStrings;
// writeln('Done Initializing module');
Result:=0;
end;
Procedure RegisterStreamModule;
begin
// writeln('Registering stream module');
// StreamModule:=new_SEE_module;
With StreamModule do
begin
magic:=SEE_MODULE_MAGIC;
name:='Stream';
version:='1.0';
Index:=0;
Mod_init:=@StreamInitModule;
alloc:=@StreamAlloc;
init:=@StreamInit
end;
SEE_module_add(@StreamModule);
end;
{ ---------------------------------------------------------------------
Write(ln) module support
---------------------------------------------------------------------}
procedure WriteWrite (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
Var
a,C : Integer;
t : string;
v : TSEE_Value;
begin
if (ArgC=0) then
SEE_error__throw0(i,I^.RangeError,'Missing argument');
C:=0;
For A:=0 to Argc-1 do
begin
SEE_ToString(i,argv[a], @v);
T:=ValueToString(V);
If Length(T)>0 then
begin
Write(T);
C:=C+Length(T);
end;
end;
SEE_SET_NUMBER(Res,C);
end;
procedure WriteWriteln (i:PTSEE_interpreter; obj:PTSEE_object; thisobj:PTSEE_object; argc:Tcint; argv:PPTSEE_value;
res:PTSEE_value);cdecl;
begin
if (Argc>0) then
WriteWrite(i,obj,thisobj,argc,argv,res)
else
SEE_SET_NUMBER(Res,0);
Writeln;
end;
Var
GWriteWrite : PSEE_STRING;
GWriteWriteln : PSEE_STRING;
Procedure WriteInit(Interp : PSEE_Interpreter); cdecl;
begin
// writeln('Initializing write');
createJSFUnction(Interp,Interp^.Global,@WriteWrite,GWriteWrite,1);
createJSFUnction(Interp,Interp^.Global,@WriteWriteln,GWriteWriteln,1);
// writeln('Done initializing write');
end;
Procedure AllocateWriteStrings;
begin
GWriteWrite:=SEE_intern_global('write');
GWriteWriteln:=SEE_intern_global('writeln');
end;
Function WriteInitModule : Integer; cdecl;
begin
Result:=0;
end;
Procedure RegisterWriteModule;
begin
// writeln('Registering write module');
// StreamModule:=new_SEE_module;
With WriteModule do
begin
magic:=SEE_MODULE_MAGIC;
name:='Write';
version:='1.0';
Index:=0;
Mod_init:=@WriteInitModule;
alloc:=Nil;
init:=@WriteInit
end;
AllocateWriteStrings;
SEE_module_add(@WriteModule);
end;
end.

View File

@ -0,0 +1,28 @@
program teststream;
{$mode objfpc}
{$H+}
uses
Classes, libsee, mod_stream;
Var
interp : TSEE_interpreter;
ainput : PSEE_INPUT;
res : TSEE_Value;
const
Program_text = 's = new Stream("test.txt",Stream.fmCreate); '+
's.Write("something"); '+
's.Free(); '+
'delete s;';
begin
see_init;
RegisterStreamModule;
SEE_interpreter_init(@interp);
ainput :=SEE_input_utf8(@interp, pchar(program_text));
See_global_eval(@interp,ainput,@res);
see_input_close(ainput);
end.

View File

@ -0,0 +1,25 @@
program testwrite;
{$mode objfpc}
{$H+}
uses
Classes, libsee, mod_stream;
Var
interp : TSEE_interpreter;
ainput : PSEE_INPUT;
res : TSEE_Value;
const
Program_text = 'writeln("Hello, world!");';
begin
see_init;
RegisterWriteModule;
SEE_interpreter_init(@interp);
ainput :=SEE_input_utf8(@interp, pchar(program_text));
See_global_eval(@interp,ainput,@res);
see_input_close(ainput);
end.

View File

@ -0,0 +1,23 @@
program tlibsee;
uses libsee;
Var
Interp : TSEE_interpreter;
ainput : PSEE_INPUT;
res : TSEE_Value;
Const
Program_text = 'Math.sqrt(3 + 4 * 7)+9;';
begin
see_init;
SEE_interpreter_init(@Interp);
ainput :=SEE_input_utf8(@Interp, pchar(program_text));
See_global_eval(@interp,ainput,@res);
if (res._type=SEE_NUMBER) then
Writeln('Result is : ',res.u.number)
else
Writeln('Result is not a number');
see_input_close(ainput);
end.

42
packages/libsee/fpmake.pp Normal file
View File

@ -0,0 +1,42 @@
{$ifndef ALLPACKAGES}
{$mode objfpc}{$H+}
program fpmake;
uses fpmkunit;
Var
P : TPackage;
T : TTarget;
begin
With Installer do
begin
{$endif ALLPACKAGES}
P:=AddPackage('libsee');
{$ifdef ALLPACKAGES}
P.Directory:='libsee';
{$endif ALLPACKAGES}
P.Version:='2.5.1';
P.Author := 'David Leonard';
P.License := 'BSD style';
P.HomepageURL := 'http://www.adaptive-enterprises.com.au/~d/software/see/';
P.Email := 'leonard@users.sourceforge.net';
P.Description := 'Headers for the libSEE library (javascript engine)';
P.NeedLibC:= true; // true for headers that indirectly link to libc?
P.SourcePath.Add('src');
P.IncludePath.Add('src');
T:=P.Targets.AddUnit('libsee.pas');
P.ExamplePath.Add('examples');
P.Targets.AddExampleUnit('mod_stream.pp');
P.Targets.AddExampleProgram('tlibsee.pp');
P.Targets.AddExampleProgram('testwrite.pp');
P.Targets.AddExampleProgram('teststream.pp');
{$ifndef ALLPACKAGES}
Run;
end;
end.
{$endif ALLPACKAGES}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,189 @@
#include <see/see.h>
int SEE_help_Global_eval(interp, input, res)
struct SEE_interpreter *interp;
struct SEE_input *input;
struct SEE_value *res;
{
SEE_try_context_t c;
SEE_TRY(interp,c) {
SEE_Global_eval (interp, input, res);
}
if (SEE_CAUGHT(c)) {
SEE_VALUE_COPY(res, SEE_CAUGHT(c));
return 1;
} else
return 0;
}
struct SEE_value * SEE_help_CAUGHT (c)
struct SEE_try_context * c;
{
return (SEE_CAUGHT(*c));
}
void SEE_help_THROW (interp,v)
struct SEE_interpreter *interp;
struct SEE_value * v;
{
SEE_THROW(interp,v);
}
void SEE_help_RETHROW (interp,c)
struct SEE_interpreter *interp;
struct SEE_try_context * c;
{
SEE_RETHROW(interp,* c);
}
void SEE_help_DEFAULT_CATCH (interp,c)
struct SEE_interpreter *interp;
struct SEE_try_context * c;
{
SEE_DEFAULT_CATCH(interp,* c);
}
struct SEE_interpreter * new_SEE_interpreter()
{
struct SEE_interpreter *interp;
interp = SEE_NEW(NULL, struct SEE_interpreter);
SEE_interpreter_init(interp);
return interp;
}
struct SEE_value * new_SEE_value ()
{
struct SEE_value * p;
p = SEE_NEW(NULL, struct SEE_value);
return p;
}
struct SEE_objectclass * new_SEE_objectclass ()
{
struct SEE_objectclass * p;
p = SEE_NEW(NULL, struct SEE_objectclass);
return p;
}
struct SEE_object * new_SEE_object ()
{
struct SEE_object * p;
p = SEE_NEW(NULL, struct SEE_object);
return p;
}
struct SEE_enumclass * new_SEE_enumclass ()
{
struct SEE_enumclass * p;
p = SEE_NEW(NULL, struct SEE_enumclass);
return p;
}
struct SEE_enum * new_SEE_enum ()
{
struct SEE_enum * p;
p = SEE_NEW(NULL, struct SEE_enum);
return p;
}
struct SEE_native * new_SEE_native ()
{
struct SEE_native * p;
p = SEE_NEW(NULL, struct SEE_native);
return p;
}
struct SEE_scope * new_SEE_scope ()
{
struct SEE_scope * p;
p = SEE_NEW(NULL, struct SEE_scope);
return p;
}
struct SEE_inputclass * new_SEE_inputclass ()
{
struct SEE_inputclass * p;
p = SEE_NEW(NULL, struct SEE_inputclass);
return p;
}
struct SEE_input * new_SEE_input ()
{
struct SEE_input * p;
p = SEE_NEW(NULL, struct SEE_input);
return p;
}
struct SEE_traceback * new_SEE_traceback ()
{
struct SEE_traceback * p;
p = SEE_NEW(NULL, struct SEE_traceback);
return p;
}
struct SEE_context * new_SEE_context ()
{
struct SEE_context * p;
p = SEE_NEW(NULL, struct SEE_context);
return p;
}
struct SEE_growable * new_SEE_growable ()
{
struct SEE_growable * p;
p = SEE_NEW(NULL, struct SEE_growable);
return p;
}
struct SEE_module * new_SEE_module ()
{
struct SEE_module * p;
p = SEE_NEW(NULL, struct SEE_module);
return p;
}
struct SEE_string * new_SEE_string ()
{
struct SEE_string * p;
p = SEE_NEW(NULL, struct SEE_string);
return p;
}
struct SEE_stringclass * new_SEE_stringclass ()
{
struct SEE_stringclass * p;
p = SEE_NEW(NULL, struct SEE_stringclass);
return p;
}
struct SEE_system * new_SEE_system ()
{
struct SEE_system * p;
p = SEE_NEW(NULL, struct SEE_system);
return p;
}
struct SEE_throw_location * new_SEE_throw_location ()
{
struct SEE_throw_location * p;
p = SEE_NEW(NULL, struct SEE_throw_location);
return p;
}
struct SEE_try_context * new_SEE_try_context ()
{
struct SEE_try_context * p;
p = SEE_NEW(NULL, struct SEE_try_context);
return p;
}
void free_SEE_struct(p)
void * p;
{
free(p);
}