[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