Fluxo dos fontes

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Fluxo dos fontes

Mensagem 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   
   
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Re: Fluxo dos fontes

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Re: Fluxo dos fontes

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Re: Fluxo dos fontes

Mensagem 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 !!!!
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder