C-Headerdatei zu PB konvertieren

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

C-Headerdatei zu PB konvertieren

Beitrag von NicTheQuick »

Hallo Leute!

Ich bräuchte eure Hilfe beim Konvertieren einer C-Header-Datei zu
PureBasic.
Die Konstanten am Anfang waren alle kein Problem. Aber jetzt kommen
Strukturen und Funktionen. Ich habe alles schon so weit wie ich auf Anhieb
konnte und wo ich mir sicher war umgesetzt.

Ich werde die einzelnen Teile auch einzeln posten und nummerieren, damit
es für mich übersichtlicher wird.

Aber vorher noch zum Verständnis für mich:
char = .b
int = .l
short = .w
long = .l
Wenn das falsch ist, dann auch Bescheid geben. Danke!


1

Code: Alles auswählen

; String descriptor
Structure USB_String_descriptor
  bLength.b
  bDescriptorType.b
  ; unsigned short wData[1];
EndStructure
2

Code: Alles auswählen

; Endpoint descriptor
#USB_MAXENDPOINTS = 32
Structure USB_Endpoint_Descriptor
  bLength.b
  bDescriptorType.b
  bEndpointaddress.b
  bmAttributes.b
  ; unsigned short wMaxPacketSize;
  bInterval.b
  bRefresh.b
  bSynchAddress.b

  ; unsigned char *extra;	/* Extra descriptors */
  ; int extralen;
EndStructure
3

Code: Alles auswählen

Structure USB_Interface_Descriptor
  bLength.b
  bDescriptorType.b
  bInterfaceNumber.b
  bAlternateSetting.b
  bNumEndpoints.b
  bInterfaceClass.b
  bInterfaceSubClass.b
  bInterfaceProtocol.b
  iInterface.b

  ; struct usb_endpoint_descriptor *endpoint;
  ; 
  ; unsigned char *extra;	/* Extra descriptors */
  ; int extralen;
EndStructure
4

Code: Alles auswählen

Structure USB_Interface
  ; struct usb_interface_descriptor *altsetting;

  ; int num_altsetting;
EndStructure
5

Code: Alles auswählen

Structure USB_Config_Descriptor
  bLength.b
  bDescriptorType.b
  ; unsigned short wTotalLength;
  bNumInterfaces.b
  bConfigurationValue.b
  iConfiguration.b
  bmAttributes.b
  MaxPower.b

  ; struct usb_interface *interface;

  ; unsigned char *extra;	/* Extra descriptors */
  ; int extralen;
EndStructure
6

Code: Alles auswählen

; This is supposed to look weird. This file is generated from autoconf
; and I didn't want to make this too complicated.

; #define USB_LE16_TO_CPU(x)
; 
; /* Data types */
; /* struct usb_device; */
; /* struct usb_bus; */
; 
; struct usb_device {
  ; struct usb_device *next, *prev;
; 
  ; char filename[LIBUSB_PATH_MAX];
; 
  ; struct usb_bus *bus;
; 
  ; struct usb_device_descriptor descriptor;
  ; struct usb_config_descriptor *config;
; 
  ; void *dev;		/* Darwin support */
; 
  ; unsigned char devnum;
; 
  ; unsigned char num_children;
  ; struct usb_device **children;
; };
; 
; struct usb_bus {
  ; struct usb_bus *next, *prev;
; 
  ; char dirname[LIBUSB_PATH_MAX];
; 
  ; struct usb_device *devices;
  ; unsigned long location;
; 
  ; struct usb_device *root_dev;
; };
; 
; /* Version information, Windows specific */
; struct usb_version {
  ; struct {
    ; int major;
    ; int minor;
    ; int micro;
    ; int nano;
  ; } dll;
  ; struct {
    ; int major;
    ; int minor;
    ; int micro;
    ; int nano;
  ; } driver;
; };
; 
; 
; struct usb_dev_handle;
; typedef struct usb_dev_handle usb_dev_handle;
; 
; /* Variables */
; #ifndef __USB_C__
; #define usb_busses usb_get_busses()
; #endif
; 
; 
; 
; #include <poppack.h>
; 
; 
; #ifdef __cplusplus
; extern "C" {
; #endif
; 
  ; /* Function prototypes */
; 
  ; /* usb.c */
  ; usb_dev_handle *usb_open(struct usb_device *dev);
  ; int usb_close(usb_dev_handle *dev);
  ; int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf,
                     ; size_t buflen);
  ; int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf,
                            ; size_t buflen);
; 
  ; /* descriptors.c */
  ; int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep,
                                     ; unsigned char type, unsigned char index,
                                     ; void *buf, int size);
  ; int usb_get_descriptor(usb_dev_handle *udev, unsigned char type,
                         ; unsigned char index, void *buf, int size);
; 
  ; /* <arch>.c */
  ; int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size,
                     ; int timeout);
  ; int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size,
                    ; int timeout);
  ; int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size,
                          ; int timeout);
  ; int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size,
                         ; int timeout);
  ; int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
                      ; int value, int index, char *bytes, int size, 
                      ; int timeout);
  ; int usb_set_configuration(usb_dev_handle *dev, int configuration);
  ; int usb_claim_interface(usb_dev_handle *dev, int interface);
  ; int usb_release_interface(usb_dev_handle *dev, int interface);
  ; int usb_set_altinterface(usb_dev_handle *dev, int alternate);
  ; int usb_resetep(usb_dev_handle *dev, unsigned int ep);
  ; int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
  ; int usb_reset(usb_dev_handle *dev);
; 
  ; char *usb_strerror(void);
; 
  ; void usb_init(void);
  ; void usb_set_debug(int level);
  ; int usb_find_busses(void);
  ; int usb_find_devices(void);
  ; struct usb_device *usb_device(usb_dev_handle *dev);
  ; struct usb_bus *usb_get_busses(void);
; 
; 
  ; /* Windows specific functions */
; 
  ; #define LIBUSB_HAS_INSTALL_SERVICE_NP 1
  ; int usb_install_service_np(void);
  ; void CALLBACK usb_install_service_np_rundll(HWND wnd, HINSTANCE instance,
                                              ; LPSTR cmd_line, int cmd_show);
  ; 
  ; #define LIBUSB_HAS_UNINSTALL_SERVICE_NP 1
  ; int usb_uninstall_service_np(void);
  ; void CALLBACK usb_uninstall_service_np_rundll(HWND wnd, HINSTANCE instance,
                                                ; LPSTR cmd_line, int cmd_show);
; 
  ; #define LIBUSB_HAS_INSTALL_DRIVER_NP 1
  ; int usb_install_driver_np(const char *inf_file);
  ; void CALLBACK usb_install_driver_np_rundll(HWND wnd, HINSTANCE instance,
                                             ; LPSTR cmd_line, int cmd_show);
; 
  ; #define LIBUSB_HAS_TOUCH_INF_FILE_NP 1
  ; int usb_touch_inf_file_np(const char *inf_file);
  ; void CALLBACK usb_touch_inf_file_np_rundll(HWND wnd, HINSTANCE instance,
                                             ; LPSTR cmd_line, int cmd_show);
; 
  ; #define LIBUSB_HAS_INSTALL_NEEDS_RESTART_NP 1
  ; int usb_install_needs_restart_np(void);
; 
  ; const struct usb_version *usb_get_version(void);
; 
  ; int usb_isochronous_setup_async(usb_dev_handle *dev, void **context,
                                  ; unsigned char ep, int pktsize);
  ; int usb_bulk_setup_async(usb_dev_handle *dev, void **context,
                           ; unsigned char ep);
  ; int usb_interrupt_setup_async(usb_dev_handle *dev, void **context,
                                ; unsigned char ep);
; 
  ; int usb_submit_async(void *context, char *bytes, int size);
  ; int usb_reap_async(void *context, int timeout);
  ; int usb_reap_async_nocancel(void *context, int timeout);
  ; int usb_cancel_async(void *context);
  ; int usb_free_async(void **context);
Bei Nummer 1 bis 5 sind es nur Kleinigkeiten, wo ich mir einfach nicht
sicher genug bin, es einfach selbst zu machen. Nummer 6 ist die
eigentliche Herausforderung. Dabei kommt es mir vor allem auf die
Sternchen an und wie sie zu interpretieren sind.

Danke schonmal im Voraus an alle, die mir helfen können / wollen! :allright:
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Vieleicht schreibt ja irgendwann mal jemand eine 'C-Header' Portierung?
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: C-Headerdatei zu PB konvertieren

Beitrag von milan1612 »

NicTheQuick hat geschrieben: Aber vorher noch zum Verständnis für mich:
char = .b
int = .l
short = .w
long = .l
Wenn das falsch ist, dann auch Bescheid geben. Danke!
Guckst du hier: http://freak.purearea.net/help/wintypes.txt
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@milan1612:
Danke erstmal für den Link! Der hat schonmal weitergeholfen.

Aber jetzt frage ich mich, was die Sternchen bedeuten sollen. Sind das
Pointer wie in PB?

Also z.B. diese Zeile:

Code: Alles auswählen

unsigned char *extra;   /* Extra descriptors */ 
Wird die dann zu

Code: Alles auswählen

*extra.Byte
Und das hier

Code: Alles auswählen

struct usb_endpoint_descriptor *endpoint;
wird zu diesem hier?

Code: Alles auswählen

*endpoint.usb_endpoint_descriptor
Und hier bin ich mir auch unsicher:

Code: Alles auswählen

unsigned short wData[1]; 
Ist das das selbe wie

Code: Alles auswählen

wData.w[1]
oder kommt da eher eine 0 als eine 1 hin?
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Also beim letzten bin ich mir nicht sicher, IIRC sind C Arrays auch nullbasiert.
Der Rest sollte so passen...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Hier mal die Strukturen 1-5

Code: Alles auswählen

; String descriptor 
Structure USB_String_descriptor 
  bLength.b 
  bDescriptorType.b 
  wData.w[1] 
EndStructure


Structure USB_Endpoint_Descriptor 
  bLength.b 
  bDescriptorType.b 
  bEndpointaddress.b 
  bmAttributes.b 
  wMaxPacketSize.w; 
  bInterval.b 
  bRefresh.b 
  bSynchAddress.b 

  *extra 
  extralen.l
EndStructure


Structure USB_Interface_Descriptor 
  bLength.b 
  bDescriptorType.b 
  bInterfaceNumber.b 
  bAlternateSetting.b 
  bNumEndpoints.b 
  bInterfaceClass.b 
  bInterfaceSubClass.b 
  bInterfaceProtocol.b 
  iInterface.b 

  *endpoint.usb_endpoint_descriptor 
  *extra 
  extralen.l
EndStructure

Structure USB_Interface 
  *altsetting.usb_interface_descriptor 

  num_altsetting.l
EndStructure


Structure USB_Config_Descriptor 
  bLength.b 
  bDescriptorType.b 
  wTotalLength.w 
  bNumInterfaces.b 
  bConfigurationValue.b 
  iConfiguration.b 
  bmAttributes.b 
  MaxPower.b 

  *interface.usb_interface  

  *extra 
  extralen 
EndStructure

Zu den Variablen- u. Pointer-Typen in der Strukturen:

Code: Alles auswählen

unsigned char *extra
Der Pointer *extra zeigt auf einen Speicherbereich der byte aligned ist, also ein byte array. Jedoch ist ein "char" hier ein byte groß, auch bei unicode, ein 2bytes character wäre nämlich ein "wchar"

Demnach ist deine Vermutung (der Logik nach)

Code: Alles auswählen

*extra.Byte
... richtig.

Code: Alles auswählen

*endpoint.usb_endpoint_descriptor
Ist auch richtig .... ich sehe gerade -> genauso wie deine restlichen Annahmen. ;-)
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Okay, bin dann wieder ein Stückchen weiter gekommen.

Jetzt aber hier noch eine Structure, bei der ich einfach nur Bestätigung
brauche. :wink:

Code: Alles auswählen

struct usb_version {
  struct {
    int major;
    int minor;
    int micro;
    int nano;
  } dll;
  struct {
    int major;
    int minor;
    int micro;
    int nano;
  } driver;
};
habe ich übersetzt zu

Code: Alles auswählen

; Version information, Windows specific */
Structure USB_Version
  dll_major.l
  dll_minor.l
  dll_micro.l
  dll_nano.l
  driver_major.l
  driver_minor.l
  driver_micro.l
  driver_nano.l
EndStructure
was ja gleichbedeutend ist mit

Code: Alles auswählen

Structure Version
  major.l
  minor.l
  micro.l
  nano.l
EndStructure
Structure USB_Version
  dll.Version
  driver.Version
EndStructure
Ist das dann so richtig?

Und was hat das hier zu bedeuten:

Code: Alles auswählen

struct usb_dev_handle;
typedef struct usb_dev_handle usb_dev_handle;
///Edit:
Ich bin mir nicht ganz sicher, aber zwei Sternchen bedeuten wohl einfach
nur, dass ich den Pointer zum Pointer zum Objekt übergeben muss, oder?
Also folgendes

Code: Alles auswählen

int usb_free_async(void **context);
muss ich so aufrufen

Code: Alles auswählen

usb_free_async(@*contex)
Ist das so korrekt?
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Code: Alles auswählen

...
...
...
Structure USB_Version 
  dll.Version 
  driver.Version 
EndStructure
ja, deine Vermutung müsste so funktionieren.

Code: Alles auswählen

nt usb_free_async(void **context);
=
usb_free_async(@*contex)
Ja genau der Pointer **context zeigt auf einen Speicherbereich mit aufeinanderfolgenden Zeigern (PointerArray).

Code: Alles auswählen

struct usb_dev_handle; 
typedef struct usb_dev_handle usb_dev_handle;
Meiner Meinung anch eine vorab Deklaration einer im weiteren Code folgenden Struktur.

Code: Alles auswählen

typedef int signed32
bedeutet, dass signed32 eine eine Vorzeichenbehaftete Variable vom Typen int darstellt.

In PB :

Code: Alles auswählen

Macro signed32
  l
EndMacro
Hier gibts die OOP Option für PureBasic.
Antworten