Estrarre il valore di una costante definita in un file d'intestazione in C

Da Gambas-it.org - Wikipedia.

Per estrarre il valore di una Costante eventualmente presente in un file d'intestazione (header file), e definita con la parola #define o Const, oppure il valore esplicitamente assegnato ad un elemento di unaEnumerazione, evitando così di dichiarane una identica anche nel codice Gambas, si potranno utilizzare un paio di codici esemplificativi.


1° esempio

In questo esempio i due parametri di tipo stringa della funzione rappresentano rispettivamente: - "fileh" = il percorso del file d'intestazione scritto in C;
- "costante" = il preprocessore "#define" seguito dal nome identificativo della costante di cui si intende estrarre il valore definito.

Private Function RicavaCostante(fileh As String, costante As String) As String
 
 Dim fl As File
 Dim s As String

   fl = Open fileh
   
   While True
     s = fl.ReadLine()
     If s Begins costante Then
       s = Replace$(s, costante, Null)
' Elimina un eventuale commento alla destra del valore della costante:
       If s Like "*/*" Then s = Trim(Left(s, InStr(s, "/") - 1))
' Adatta un eventuale valore esadecimale per una sua corretta gestione nel codice Gambas:
       If s Begins "0x" Then s = Trim(Replace(s, "0x", "00"))
       Break
     Endif
   Wend
   
   fl.Close()
   
   Return s
 
End


2° esempio

In quest'altro esempio si intende cercare il valore della costante M_PI dichiarata ed istanziata nel file d'intestazione "math.h":

Public Sub Main()
 
 Dim percorso_file, obiettivo, ris As String
  
  percorso_file = "/usr/include/math.h"
  If Not Exist(percorso_file) Then Error.Raise("Percorso o file Errato !")
   
  obiettivo = "# define M_PI"
   
  ris = Estrai_valore(percorso_file, obiettivo)
   
  Print ris
  
End


Private Function Estrai_valore(percorso As String, ob As String) As String
 
 Dim s As String
  
  s = File.Load(percorso)
  If InStr(s, ob) = 0 Then Error.Raise("Definizione '" & ob & "' inesistente in: " & percorso)
  
  s = Scan(s, "*" & ob & "*\n*")[1]
   
  If InStr(s, "/") > 0 Then
    s = Scan(s, "*/*")[0]
  Endif
  s = Trim(s)
  If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)
   
  Return s
     
End