gmlTcl_Scanners_support_T.h

00001 // gml/tcl/wrapper/scanner/gmlTcl_Scanners_support_T.h --
00002 //
00003 //    See "gml/tcl/wrapper/scanner/gmlTcl_Scanners_support.h"
00004 //
00005 //  Copyright (c) 2004 CLIPS-IMAG
00006 //
00007 //  See the file "gml_LicenseTerms.txt" for information on usage and redistribution
00008 //  of this file, and for a DISCLAIMER OF ALL WARRANTIES.
00009 //
00010 //  Created in June 2004 (JL).
00011 
00012 #ifndef __GMLTCL_SCANNERS_SUPPORT_T__
00013 #define __GMLTCL_SCANNERS_SUPPORT_T__
00014 
00015 #include "gml/tcl/wrapper/scanner/gmlTcl_Scanners_support.h"
00016 
00017 #include "gml/base/gml_Alloc.h"
00018 #include "gml/tcl/wrapper/wrapper/gmlTcl_WrapperParser.h"
00019 #include "gml/tcl/wrapper/wrapper/gmlTcl_WrapperParser_T.h"
00020 
00021 template <typename T>
00022 inline static 
00023 Tcl_Obj* gmlTcl_NewListObj (unsigned length, T* values)
00024 {
00025   Tcl_Obj** array = (Tcl_Obj**) NULL;
00026   gml_TError err = gml_Malloc (array, length);
00027   if (err != gml_cNoError) return (Tcl_Obj*)NULL;
00028   
00029   for (unsigned k = 0; k < length; ++k) {
00030     array[k] = gmlTcl_NewObj (values[k]);
00031     if (array[k] == (Tcl_Obj*)NULL) return (Tcl_Obj*)NULL;
00032   }
00033   return Tcl_NewListObj (length, array);
00034 }
00035 
00036 template <typename T>
00037 inline static
00038 Tcl_Obj* gmlTcl_NewObj (gml_TArray<T> data)
00039 {
00040   unsigned length   = 0;
00041   Tcl_Obj** array   = (Tcl_Obj**)NULL;
00042   gml_TError err    = gml_cNoError;
00043   T item;
00044   
00045   length = data.Size ();
00046   err = gml_Malloc (array, length);
00047   if (err != gml_cNoError) goto error;
00048   
00049   for (unsigned k = 0; k < length; ++k) {
00050     item = data[k];
00051     array[k] = gmlTcl_NewObj (item);
00052     if (array[k] == (Tcl_Obj*)NULL) goto error;
00053   }
00054   return Tcl_NewListObj (length, array);
00055   
00056 error:
00057   gml_TestAndFree (array);
00058   return (Tcl_Obj*)NULL;
00059 }
00060 
00061 
00062 template<class T>
00063 int gmlTclWrapParseObjToArray (Tcl_Interp* interp, Tcl_Obj* arg, gml_TArray<T>** storage)
00064 {
00065   int             res          = TCL_OK;
00066   gml_TError      err          = gml_cNoError;
00067   int             lobjc        = 0;
00068   Tcl_Obj**       lobjv        = (Tcl_Obj**)NULL;
00069   gml_TArray<T>*  theArray     = (gml_TArray<T>*)NULL;
00070 
00071   res = Tcl_ListObjGetElements (interp, arg, &lobjc, &lobjv);
00072   if (res != TCL_OK) goto exit;
00073 
00074   err = gml_New (theArray);
00075   if (err != gml_cNoError) goto exit;
00076 
00077   err = theArray->Init (lobjc);
00078   if (err != gml_cNoError) goto exit;
00079 
00080   for (int i = 0; (res == TCL_OK) && (i < lobjc); i++) {
00081     T* value = new T();
00082     res = gmlTclWrapParseObjToVal (interp, lobjv[i], value);
00083     if (res == TCL_OK) goto exit;
00084       (*theArray)[i] = *value;
00085     delete value;
00086     if (res != TCL_OK) goto exit;
00087   }
00088 
00089   *storage = theArray;
00090 
00091 exit:
00092   if (err != gml_cNoError) {
00093     Tcl_AppendResult (interp, "could not parse array: ",
00094                                gml_ErrorGetMessage (err), (char*)NULL);
00095     gml_TestDisposeAndDelete (theArray);
00096     res = TCL_ERROR;
00097   }
00098   return res;
00099 }
00100 
00101 
00102 #endif // __GMLTCL_SCANNERS_SUPPORT_T__
00103 
Generated on Tue Jun 12 14:03:27 2007 for gml by Doxygen 1.5.2.