[Gambas-user] Issue accessing C Library from Gambas

vuott at tutanota.com vuott at tutanota.com
Sat Oct 7 21:42:04 CEST 2023


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
>
>
>
>

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


More information about the User mailing list