[Gambas-user] Issue accessing C Library from Gambas
vuott at tutanota.com
vuott at tutanota.com
Sat Oct 7 21:48:31 CEST 2023
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
>>
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20231007/1c23050c/attachment-0001.htm>
More information about the User
mailing list