Página 1 de 1

Fluxo dos fontes

Enviado: 20 Nov 2025 09:48
por JoséQuintas
Sei lá....
Mexendo com aplicativo velho, e criando ferramentas pra tentar ajudar em alguma coisa.
A mais recente foi esta, como quebra galho, direcionado ao uso encontrado.

Código: Selecionar todos

#include "directry.ch"
#include "inkey.ch"

PROCEDURE main

   LOCAL aPRGList := {}, aItem, aItem2, aNewList := {}, nPos

   setmode(33,100)
   CLS
   processapath( ".\", @aPRGList, 1 )
   processapath( "d:\fontes\volmer\", @aPRGList, 2 )

   // chamado e quem chama
   // transformar pro contrário

   FOR EACH aItem IN aPrgList
      FOR EACH aItem2 IN aItem[3]
         nPos := hb_AScan( aNewList, { | e | e[1] == aItem2[1] } )
         IF nPos == 0
            AAdd( aNewList, { aItem2[1], {} } )
            nPos := Len( aNewList )
         ENDIF
         AAdd( aNewList[ nPos ][ 2 ], { aItem[1], {} } )
      NEXT
   NEXT

// tentar mover pra onde foi chamada, se só chamada 1 vez

   FOR EACH aItem IN aNewList DESCEND
      IF MoveItem( aItem, aNewList )
         hb_ADel( aNewList, aItem:__EnumIndex(), .T. )
      ENDIF
   NEXT

   ShowList( aNewList, "" )

   ? "Fim"
   Inkey(0)

   RETURN

FUNCTION ShowList( aList, cText )

   LOCAL aItem
   FOR EACH aItem IN aList
      ? cText + iif( Len( cText ) == 0, Space(3), "\--" ) + Pad( aItem[ 1 ], 10 )
      Inkey(1)
      IF Len( aItem[2] ) > 0
         ShowList( aItem[2], cText + Space(10) )
      ENDIF
   NEXT
   RETURN Nil

STATIC FUNCTION MoveItem( aSource, aList )

   LOCAL nCount := 0, aNew, aNew2, aTarget, xItem

   FOR EACH aNew IN aList
      FOR EACH aNew2 IN aNew[2]
         IF aNew2[1] == aSource[1]
            nCount += 1
            aTarget := aNew2[2]
         ENDIF
      NEXT
   NEXT
   IF nCount == 1
      FOR EACH xItem IN aSource[2]
         AAdd( aTarget, xItem )
      NEXT
      RETURN .T.
   ENDIF

   RETURN .F.

FUNCTION processapath( cPath, aPRGList, nStep )

   LOCAL aList, aFile, cTxt, aItem

   IF "tools" $ Lower( cPath ) .OR. "novo" $ Lower( cPath )
      RETURN Nil
   ENDIF
   aList := Directory( cPath + "*.*", "D" )
   FOR EACH aFile IN aList
      DO CASE
      CASE aFile[ F_NAME ] $ ".,.."
      CASE "D" $ aFile[ F_ATTR ]
         ProcessaPath( cPath + aFile[ F_NAME ] + "\", @aPRGList, nStep )
      CASE Lower( Right( aFile[ F_NAME ], 4 ) ) == ".prg"
         IF nStep == 1
            AAdd( aPrgList, { hb_FNameName( Lower( aFile[ F_NAME ] ) ), cPath, {} } )
         ELSE
            cTxt := Lower( MemoRead( cPath + aFile[ F_NAME ] ) )
            FOR EACH aItem IN aPrgList
               IF ! Lower( hb_FNameName( aFile[ F_NAME ] ) ) == aItem[1] .AND. "do " + aItem[1] $ cTxt
                  AAdd( aItem[3], { hb_FNameName( aFile[ F_NAME ] ), cPath } )
               ENDIF
            NEXT
         ENDIF
      ENDCASE
   NEXT

   RETURN Nil
O resultado

Código: Selecionar todos


   me003_a   
          \--cp003_a   
                    \--atpre_a   
                    \--atpro_a   
                    \--cp007_a   
                    \--cp247     
                    \--cp591_a   
                              \--cp184_a   
                              \--cp185_a   
                              \--cpcap_a   
                    \--cpipe_a   
                    \--cppfo_a   
                    \--ct000_a   
                              \--ctela_a   
                              \--ctsel_a   
                    \--cthpe_a   
          \--cp187_a   
          \--cp360_a   
          \--cp400_a   
                    \--cp403_a   
                    \--cp409_a   
                    \--cp413_a   
                    \--cp421_a   
                    \--cp431_a   
                    \--cp443_a   
          \--cp560_a   
                    \--cpcap_a   
          \--cp815     
                    \--cpcap_a   
          \--cp947     
          \--cpbao_a   
          \--cpvfa_a   
          \--ha401_a   
                    \--cpamk_a   
          \--ha402_a   
                    \--ft600_a   
          \--me100     
                    \--cp336     
                    \--ha403     
                              \--ftm07     
                    \--ha404     
                              \--ft001     
                    \--ha405     
          \--me200     
                    \--clien_a   
                    \--cp310     
                    \--cp337     
                    \--forne_a   
                    \--moeda_a   
          \--me300     
                    \--cp145_a   
                    \--cp146_a   
                    \--cp673_a   
                              \--cp904_a   
                    \--cp741_a   
                    \--cp853_a   
                              \--cp854_a   
                    \--ft607_a   
                    \--ftmfa_a   
                    \--me400_a   
                              \--cp514_a   
                              \--cp515_a   
                              \--cp516_a   
   

Re: Fluxo dos fontes

Enviado: 20 Nov 2025 09:52
por JoséQuintas
Cuidado, depende muito de estruturas e outras coisas.

Declarar FIELDS pra campos de DBF:

Código: Selecionar todos


#include "directry.ch"
#include "dbstruct.ch"

PROCEDURE Main

   LOCAL aDBFList, aFile, aStru, aField, cPath := "", aFieldList := {}
   LOCAL aItem, nPos, cTxt, cTxtLine

   SetMode(33,132)
   SetColor("W/B")
   CLS
   aDBFList := Directory( cPath + "*.dbf" )
   FOR EACH aFile IN aDBFList
      USE ( cPath + aFile[ F_NAME ] ) ALIAS temp
      aStru := dbStruct()
      FOR EACH aField IN aStru
         nPos := hb_AScan( aFieldList, { | e | e[1] == aField[ DBS_NAME ] } )
         IF nPos == 0
            //? aField[ DBS_NAME ], aField[ DBS_TYPE ], aField[ DBS_LEN ], aField[ DBS_DEC ]
            AAdd( aFieldList, { aField[ DBS_NAME ], 0 } )
            nPos := Len( aFieldList )
         ENDIF
         aFieldList[ nPos, 2 ] += 1
      NEXT
      USE
   NEXT
   ASort( aFieldList,,, { | a, b | a[ 2 ] < b[2] } )
   cTxt     := ""
   cTxtLine := ""
   FOR EACH aItem IN aFieldList
      ? aItem[1], aItem[2]
      IF Len( cTxtLine ) + Len( aItem[1] ) > 80
         cTxt     += "FIELDS " + cTxtLine + hb_Eol()
         cTxtLine := ""
      ENDIF
      cTxtLine += iif( Len( cTxtLine ) == 0, "", ", " ) + aItem[1]
   NEXT
   cTxt += "FIELDS " + cTxtLine + hb_Eol()
   hb_MemoWrit( "test.txt", cTxt )

   Inkey(0)

   RETURN
Também pra declarar MEMVAR a partir da lista de erros do harbour

Código: Selecionar todos


PROCEDURE Main

   LOCAL cTxt, aList, cItem, aVarList := {}
   LOCAL cSource := "", cSourceLine := ""

   SetMode(33,100)
   SetColor("W/B")
   CLS
   Altd()
   cTxt  := MemoRead( "output.txt" )
   aList := hb_RegExSplit( hb_Eol(), cTxt )
   ? Len( aList )
   FOR EACH cItem IN aList
      IF "ambiguous reference" $ Lower( cItem )
         IF "'" $ cItem
            cItem := Substr( cItem, 1, Rat( "'", cItem ) - 1 )
            cItem := Substr( cItem, Rat( "'", cItem ) + 1 )
            IF cItem != "GETLIST" .AND. hb_AScan( aVarList, { | e | e == cItem } ) == 0
               AAdd( aVarList, cItem )
               ? Len( aVarList ), cItem
            ENDIF
         ENDIF
      ENDIF
   NEXT
   ASort( aVarList,,, { | a, b | a < b } )
   FOR EACH cItem IN aVarList
      IF Len( cSourceLine ) + Len( cItem ) > 80
         cSource += "MEMVAR " + cSourceLine + hb_Eol()
         cSourceLine := ""
      ENDIF
      cSourceLine += iif( Len( cSourceLine ) == 0, "", ", " ) + cItem
      ? cItem
   NEXT
   cSource += "MEMVAR " + cSourceLine + hb_Eol()
   hb_MemoWrit( "novos.txt", cSource )
   Inkey(100)

   RETURN

Re: Fluxo dos fontes

Enviado: 20 Nov 2025 10:03
por JoséQuintas
- Declarar LOCAL GetList := {}, a partir da lista de erros

- Renomear fontes duplicados

- Transformar Achoice() e dbEdit() pra codeblock

- Alterar FUNCTION pra STATIC FUNCTION, se possível

- Alterar pra tratamento de rede

Etc. etc.

Ficar repetindo manualmente cansou, então fui criando pra fazer o máximo possível automaticamente.
Algumas das coisas testadas

Código: Selecionar todos

#define FORMAT_LINE_COMMENTS_REMOVE   .F.

#define FORMAT_FILE_HBP               .F.
#define FORMAT_FILE_INCLUDE           .F.
#define FORMAT_FILE_ERROR             .F.
#define FORMAT_FILE_DUPLICATED        .F.

#define FORMAT_PRG_REMOVE_FUNC_FIM    .F.
#define FORMAT_PRG_FOR_NEXT_LASTREC   .F.
#define FORMAT_PRG_RECLOCK            .F.

#define FORMAT_LINE_ACHOICE_RETURN    .F.
#define FORMAT_LINE_ACHOICE_CODEBLOCK .F.
#define FORMAT_LINE_COMMIT            .F.
#define FORMAT_LINE_COPY_TO           .T.
#define FORMAT_LINE_DBEDIT_CODEBLOCK  .F.
#define FORMAT_LINE_DRIVE_USE         .F.
#define FORMAT_LINE_DRIVE_INDEX_ON    .F.
#define FORMAT_LINE_DRIVE_SET_INDEX   .F.
#define FORMAT_LINE_DRIVE_USE_NIL     .F.
#define FORMAT_LINE_RECAPPEND         .F.
#define FORMAT_LINE_RECDELETE         .F.
#define FORMAT_LINE_REMOVE_CLOSE      .F.
#define FORMAT_LINE_REMOVE_SETCOLOR   .F.
#define FORMAT_LINE_ZAP               .F.

Re: Fluxo dos fontes

Enviado: 20 Nov 2025 10:08
por JoséQuintas
Faltou dizer.....

IA seria de muita ajuda numa coisa dessas, mas tem limite pra tudo, um simples fonte não dá pra enviar pra IA, quanto mais um aplicativo inteiro.

Se não vai de IA.... vai de José....

Nota: Também usei coisas assim pra alterar HMG 3 pra objetos. É criar fonte pra alterar fonte !!!!