[Gambas-user] Issue accessing C Library from Gambas

Linus olivier.cruilles at yahoo.fr
Sat Oct 7 23:29:43 CEST 2023


Hi Vuott,

Thank you very much for the information, it works perfectly now.



Olivier Cruilles


> Le 7 oct. 2023 à 15:48, vuott--- via User <user at lists.gambas-basic.org> a écrit :
> 
> I apologize for the clerical error, which I made, I correct:
> 
> This C declaration:
> 
> ' int rrd_graph(int, char **, char ***, int *, int *, FILE *, double *, double *);
> 
> In Gambas it would be:
> 
>   Private Extern rrd_graph(nbArgs As Integer, rrdgraphOptions As Pointer, CalCpr As Pointer, xsize As Pointer, ysize As Pointer, FileType As Pointer, ymin As Pointer, ymax As Pointer) As Integer
> 
> -----
> 
> 
> 
> 7 ott 2023, 21:42 da vuott at tutanota.com:
> Hello,
> 
> This C declaration:
> 
> ' int rrd_graph(int, char **, char ***, int *, int *, FILE *, double *, double *);
> 
> In Gambas it would be:
> 
>   Private Extern rrd_graph(nbArgs As Integer, rrdgraphOptions As Pointer, CalCpr As Pointer, xsize As Integer, ysize As Integer, FileType As Pointer, ymin As Pointer, ymax As Pointer) As Integer
> 
> 
> This C line:
> 
> ' result = rrd_graph(8, rrdargs, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax);
> 
> in Gambas it would be:
> 
> rc = rrd_graph(NbreOptions, RRDOption.Data, VarPtr(PointerCalCpr), VarPtr(xsize), VarPtr(ysize), 0, VarPtr(ymin), VarPtr(ymax))
> 
> ------------------
> 
> 
> 
> 
> 7 ott 2023, 20:24 da user at lists.gambas-basic.org:
> Hello,
> 
> For long time I build Classes in Gambas to access to various C Libraries directly.
> I did it for libssh4, GeoIp and others.
> For now all worked fine and I was able to figure all cases of Args format to convert in Gambas.
> 
> Currently, I'm trying to build another Classes for RRDtool library but new cases of Args and of course new 'Segmentation Fault 11" error.
> 
> Only the function 'rrd_graph' fail and I don't know how to deal with it
> 
> => int rrd_graph(int, char **, char ***, int *, int *, FILE *, double *, double *)
> 
> 
> Maybe someone can help me on it:
> 
> ######## Classe RRDtoolClient ########
> 
> ' Gambas class file
> 
> Export
> 
>   Event rrdError(ErrorMessage As String) ' librrd error
> 
>   ' Error return codes
>   Private Enum
>     RRD_OK = 0,
>     RRD_ERROR = -1,
>     RRD_PARAM = -10
> 
>   ' Declaration of librrd library
>   Library "librrd"
> 
>   ' Fonction C of the library 'librrd.so'
> 
>   ' int rrd_create(int, char **);
> 
>   ' rrd_info_t *rrd_info(int, char **);
>   ' rrd_info_t *rrd_info_push(rrd_info_t *, char *, rrd_info_type_t, rrd_infoval_t);
>   ' void rrd_info_print(
>   ' rrd_info_t * data);
>   ' void rrd_info_free(rrd_info_t *); 
>   ' int rrd_update(int, char **);
>   ' rrd_info_t *rrd_update_v(int, char **);
> 
>   ' int rrd_graph(int, char **, char ***, int *, int *, FILE *, double *, double *);
> 
>   ' rrd_info_t *rrd_graph_v(int, char **);
>   ' int rrd_fetch(int, char **, time_t *, time_t *, unsigned long *, unsigned long *, char ***, rrd_value_t **);
>   ' int rrd_restore(int, char **);
>   ' int rrd_dump(int, char **);
>   ' int rrd_tune(int, char **);
>   ' time_t rrd_last(int, char **);
>   ' int rrd_lastupdate(int argc, char **argv);
>   ' time_t rrd_first(int, char **);
>   ' int rrd_resize(int, char **);
>   ' char *rrd_strversion(void);
>   ' double rrd_version(void);
>   ' int rrd_xport(int, char **, int *, time_t *, time_t *, unsigned long *, unsigned long *, char ***, rrd_value_t **);
>   ' int rrd_flushcached (int argc, char **argv);
>   ' void rrd_freemem(void *mem);
> 
>   ' void   rrd_set_error_r  (rrd_context_t *, char *, ...)
>   ' void   rrd_clear_error_r(rrd_context_t *)
>   ' int    rrd_test_error_r (rrd_context_t *)
>   ' char  *rrd_get_error_r  (rrd_context_t *)
> 
> 
>   Private Extern rrd_create(nbArgs As Integer, rrdcreateOptions As Pointer) As Integer
>   Private Extern rrd_update(nbArgs As Integer, rrdupdateOptions As Pointer) As Integer
> 
>   Private Extern rrd_lastupdate(nbArgs As Integer, rrdOptions As Pointer) As Integer
> 
>   Private Extern rrd_version() As Long
>   Private Extern rrd_strversion() As String
> 
>   Private Extern rrd_clear_error()
>   Private Extern rrd_get_error() As String
> 
>   Private Extern rrd_test_error() As Integer
> 
> 
> ==> Here is my issue
> 
> 
>   ' int rrd_graph(int, char **, char ***, int *, int *, FILE *, double *, double *);
> 
>   Private Extern rrd_graph(nbArgs As Integer, rrdgraphOptions As Pointer, CalCpr As Pointer, xsize As Integer, ysize As Integer, FileType As Pointer, ymin As Float, ymax As Float) As Integer
> 
> 
> 
> Public Function rrdgraph(RRDfile As String, RRDGraphValue As String[]) As Integer
> 
>   ' Procedure to Create an RRD Graphic using
>   ' C fonction rrd_graph()
> 
>   Dim rc As Integer
>   Dim ErrorMess As String
>   Dim RRDOption As New String[]
>   Dim NbreOptions As Integer
>   Dim Options As String
>   Dim CalCpr As New String[]
>   Dim PointerCalCpr As Pointer
>   Dim xsize As Integer
>   Dim ysize As Integer
>   Dim FileStream As Pointer
>   Dim ymin As Float
>   Dim ymax As Float
> 
>   If RRDGraphValue = Null Then
>     Return RRD_PARAM
>   End If
> 
>   If RRDGraphValue = Null Then
>     Return RRD_PARAM
>   End If
> 
>   If Trim(RRDfile) = "" Then
>     Return RRD_PARAM
>   End If
> 
>   FileStream = Null
> 
>   RRDOption.Add("rrdgraph")
>   '
>   RRDOption.Add(RRDfile)
>   '
>   RRDOption.Insert(RRDGraphValue, RRDOption.Max + 1)
> 
>   RRDOption.Add("")
> 
> 
>   '     char *rrdargs[] = {
>   '         "rrdgraph",
>   '   "mygraph.png",
>   '   "-a", "PNG",
>   '   "--title", "My Fancy Graph",
>   '   "DEF:myval=myfile.rrd:myval:AVERAGE",
>   '   "LINE2:myval#00CC00:The value",
>   '   NULL
>   '     };
> 
>   xsize = 600
>   ysize = 300
> 
>   ymin = 10.0
>   ymax = 50.0
> 
>   Options = RRDOption.Join(" ")
>   NbreOptions = RRDOption.Max
> 
>   Print "rrdcreate: " & Options
> 
>   PointerCalCpr = CalCpr.Data
> 
>   rrd_clear_error()
> 
>   rc = rrd_graph(NbreOptions, RRDOption.Data, Pointer@(PointerCalCpr), xsize, ysize, FileStream, ymin, ymax)
>   If rrd_test_error() Or rc <> 0 Then
>     ErrorMess = rrd_get_error()
>     $MessageErreur = "Error creating RRD file: " & ErrorMess & " (" & rc & ")"
>     Raise rrdError($MessageErreur)
>     Return RRD_ERROR
>   End If
> 
>   Return rc
> 
> 
>   ' Example:
>   ' rrd_graph works the same, but has some additional parameters that are
>   ' return values from the rrd_graph function. And this API changed from
>   ' rrdtool 1.0 -> 1.2. So what I do is like this:
>   ' 
>   '     char **calcpr  = NULL;
>   '     int rrdargcount, xsize, ysize, result;
>   '     double ymin, ymax;
>   '     char *rrdargs[] = {
>   '         "rrdgraph",
>   '   "mygraph.png",
>   '   "-a", "PNG",
>   '   "--title", "My Fancy Graph",
>   '   "DEF:myval=myfile.rrd:myval:AVERAGE",
>   '   "LINE2:myval#00CC00:The value",
>   '   NULL
>   '     };
>   ' 
>   '     optind = opterr = 0;
>   '     rrd_clear_error();
>   ' #ifdef RRDTOOL12
>   '     result = rrd_graph(8, rrdargs, &calcpr, &xsize, &ysize, NULL, &ymin,
>   ' &ymax);
>   ' #else
>   '     result = rrd_graph(8, rrdargs, &calcpr, &xsize, &ysize);
>   ' #endif
>   ' 
>   '     /* Was it OK ? */
>   '     if (rrd_test_error() || (result != 0)) {
>   '         if (calcpr) {
>   '             int i;
>   '             for (i=0; (calcpr[i]); i++) free(calcpr[i]);
>   '             calcpr = NULL;
>   '         }
>   ' 
>   '   printf("Graph error: %s\n", rrd_get_error());
>   '     }
> 
> End
> 
> I have attached the project into the Email
> 
> 
> 
> 
> 
> 
> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20231007/958d6611/attachment-0001.htm>


More information about the User mailing list