Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Create a cursor based on variables in memory
Message
De
10/02/2003 16:50:13
 
 
À
05/02/2003 16:40:44
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Divers
Thread ID:
00749040
Message ID:
00751658
Vues:
22

Ok, I am capturing almost all of the variables in memory. However, as you can see, I still have a few instances that are messing up (being caught in messups.txt):

SAVE TO MEMORY.TXT
DO tablmemory.prg
CLEAR
CLEAR ALL
CLOSE ALL
RELEASE ALL
SET CENTURY ON
ON ESCAPE DO quitit
ON KEY LABEL F10 SUSPEND
ON KEY LABEL F11 RESUME

PUBLIC showit, lncount, lcount
ln=0		&& length of name of variable when no PUB in it
lcount=5
lncount=0
showit=.F.
xquit=.F.
xfile='memory.txt'

IF FILE(xfile)
  xfilehan = FOPEN(xfile)
ELSE
  MESSAGEBOX(xfile+ " does not exist.",16)
  RETURN
ENDIF
IF !FILE('arrays.txt')
  =FCREATE('arrays.txt')
ENDIF
IF !FILE('messups.txt')
  =FCREATE('messups.txt')
ENDIF
IF !FILE('messups1.txt')
  =FCREATE('messups1.txt')
ENDIF

IF xfilehan > 0	&& successfully opened memory.txt
  xfileh = FOPEN('arrays.txt',2)
  IF xfileh=0
    =FCLOSE(xfilehan)
    MESSAGEBOX("Cannot open file arrays.txt",16)
    RETURN
  ENDIF
  =FCHSIZE(xfileh,0)

  xfileh1 = FOPEN('messups1.txt',2)
  IF xfileh1=0
    =FCLOSE(xfilehan)
    =FCLOSE(xfileh)
    MESSAGEBOX("Cannot open file messups1.txt",16)
    RETURN
  ENDIF
  =FCHSIZE(xfileh1,0)

  xfileh2 = FOPEN('messups.txt',2)
  IF xfileh2=0
    =FCLOSE(xfilehan)
    =FCLOSE(xfileh)
    =FCLOSE(xfileh1)
    MESSAGEBOX("Cannot open file messups.txt",16)
    RETURN
  ENDIF
  =FCHSIZE(xfileh2,0)


  *---Search for the begining of the section
  xiniold=""
  xiniline=""
  DO WHILE !FEOF(xfilehan) .AND. !xquit
    xiniline=""
    xiniline = FGETS(xfilehan)
    *		xiniline=cleanline(xiniline)
    IF "variables defined" $ xiniline
      EXIT
    ENDIF
    xiniline=checkit(xiniline)
    IF TYPE('xiniline')="C" .AND. !EMPTY(xiniline) .AND. "Pub    A" $ xiniline
      *IF RIGHT(ALLTRIM(xiniline),1)="A" .AND. ! "(" $ xiniline .AND. ! "Pub    C  " $ xiniline
      IF LEN(ALLTRIM(xiniline))>1
        IF ALLTRIM(xiniline)="Pub    A" .AND. !EMPTY(xiniold)
          xiniline=PADR(ALLTRIM(xiniold),40)+LTRIM(xiniline)
          *					xiniline=cleanline(xiniline)
          =FPUTS(xfileh,xiniline)
        ELSE
          lnpos=0
          lnpos=AT('Pub    A',xiniline)
          IF lnpos>0
            xiniline=PADR(ALLTRIM(LEFT(xiniline,lnpos-1)),40)+RIGHT(xiniline,LEN(xiniline)-(lnpos-1))
            =FPUTS(xfileh,xiniline)
          ELSE
            =FPUTS(xfileh,xiniline)
          ENDIF
        ENDIF
      ENDIF
    ELSE	&& not the first line of an array
      IF !"Pub    "$ xiniold.AND. ! "(" $ xiniold
        IF LEN(ALLTRIM(xiniold))>ln			
          ln=LEN(ALLTRIM(xiniold))
        ENDIF
        IF LEFT(ALLTRIM(xiniline),3)="Pub"	
          xiniline=PADR(ALLTRIM(xiniold),40)+ALLTRIM(xiniline)
        ENDIF
        lnpos=0
        lnpos=AT('Pub    ',xiniline)
        IF lnpos>0
          xiniline=PADR(ALLTRIM(LEFT(xiniline,lnpos-1)),40)+RIGHT(xiniline,LEN(xiniline)-(lnpos-1))
        ENDIF
        aresult=";"
        FOR i = 1 TO LEN(xiniline)
          aresult=aresult+ALLTRIM(STR(ASC(SUBSTR(xiniline,i,1))))+";"
        ENDFOR
        DO CASE
          CASE OCCURS('34',aresult)=2
            =FPUTS(xfileh,xiniline)
          CASE RIGHT(ALLTRIM(xiniline),3)=".T." .OR. RIGHT(ALLTRIM(xiniline),3)=".F."
            =FPUTS(xfileh,xiniline)
          OTHERWISE
            IF	"Pub    C  " $ xiniline .AND. OCCURS('34',aresult)=1
              xiniline=LTRIM(xiniline)+CHR(34)
              =FPUTS(xfileh,xiniline)		&&^^tch missing quotes checked ok
            ELSE
              IF ")     C" $ xiniline .AND. OCCURS('34',aresult)=1
                xiniline=LTRIM(xiniline)+CHR(34)
                =FPUTS(xfileh,xiniline)	&&^^tch missing quotes checked out
              ELSE
                =FPUTS(xfileh,xiniline)	&& tested ok
              ENDIF
            ENDIF
        ENDCASE
        *ENDIF
      ELSE	&& additional array line has Pub and ( in it
        lnpos=0
        lnpos=AT('Pub    ',xiniline)
        IF lnpos>0
          xiniline=PADR(ALLTRIM(LEFT(xiniline,lnpos-1)),40)+RIGHT(xiniline,LEN(xiniline)-(lnpos-1))
        ENDIF
        aresult=";"
        FOR i = 1 TO LEN(xiniline)
          aresult=aresult+ALLTRIM(STR(ASC(SUBSTR(xiniline,i,1))))+";"
        ENDFOR
        IF	"Pub    C  " $ xiniline .AND. OCCURS('34',aresult)=1
          xiniline=LTRIM(xiniline)+CHR(34)
          =FPUTS(xfileh,xiniline)	&&^^tch
        ENDIF
        IF LEFT(xiniline,5)=SPACE(5)	&& additional array lines
          *^^tch
          IF !LEFT(ALLTRIM(xiniline),1)="("
            xiniline=checkit(xiniline)
            xiniold=checkit(xiniold)
            =FPUTS(xfileh,ALLTRIM(xiniold)+ALLTRIM(xiniline))
          ELSE
            =FPUTS(xfileh,ALLTRIM(xiniline))
          ENDIF
        ELSE
          IF "Pub   "$xiniline
            =FPUTS(xfileh,xiniline)	&&^tch
          ELSE
            IF !LEFT(ALLTRIM(xiniline),1)="("
              *=FPUTS(xfileh1,"REMOVE!"+xiniline)
            ELSE
              =FPUTS(xfileh,ALLTRIM(xiniline))
            ENDIF
          ENDIF
        ENDIF
      ENDIF
    ENDIF
    DO CASE
      CASE ASC(RIGHT(xiniline,1))=41	&& )  numeric type
      CASE ASC(RIGHT(xiniline,1))=34	&& "  character type
      CASE RIGHT(xiniline,3)=".T."	&& .  logical .T. ASC 46
      CASE RIGHT(xiniline,3)=".F."	&& .  logical .F. ASC 46
      CASE RIGHT(xiniline,10)="  /  /    "	&& date type empty
      CASE "Pub    D"	$ xiniline	&& date type
      CASE ")     C" $ xiniline .AND. !ASC(RIGHT(RTRIM(xiniline),1))=34
        ? "FIXED: "
        ? ALLTRIM(xiniold)+ALLTRIM(xiniline)
        ? "----------------------------------------------------------------"
      OTHERWISE
        IF TYPE('xiniline')="C" .AND. !EMPTY(xiniline) .AND. "Pub    A" $ xiniline
          * top Array line
        ELSE
          =FPUTS(xfileh2,"------------------------------------------------------------------")
          =FPUTS(xfileh2,"Previous line: "+xiniold)
          =FPUTS(xfileh2,"This line: "+xiniline)
          =FPUTS(xfileh2,"Last Character: "+RIGHT(xiniline,1)+"  "+ALLTRIM(STR(ASC(RIGHT(xiniline,1)))))
          =FPUTS(xfileh2,"Length: "+ALLTRIM(STR(LEN(xiniline))))
        ENDIF
    ENDCASE
    xiniold=xiniline
  ENDDO

  =FCLOSE(xfileh)
  =FCLOSE(xfileh1)
  =FCLOSE(xfileh2)
  =FCLOSE(xfilehan)
ELSE
  MESSAGEBOX("Cannot open file "+xfile,16)
  RETURN
ENDIF
DO copytotable
ON ESCAPE
ON KEY LABEL F10
ON KEY LABEL F11
? "Longest length is: "+ALLTRIM(STR(ln))
? "FINISHED!"
RELEASE showit
RELEASE lncount
RELEASE lcount
RETURN

PROCEDURE quitit
  =FCLOSE(xfilehan)
  =FCLOSE(xfileh1)
  =FCLOSE(xfileh)
  =FCLOSE(xfileh2)
  xquit=.T.
  ON ESCAPE
  ON KEY LABEL F10
  ON KEY LABEL F11
  RETURN
  *********************************
FUNCTION cleanline
  PARAMETERS xiniline
  IF TYPE('xiniline')="L" .OR. LEN(ALLTRIM(xiniline))=0
    xiniline=SPACE(50)
  ENDIF
  PRIVATE result
  result=""
  #DEFINE    _END_CHAR         CHR(10)
  #DEFINE    _NULL             CHR(0)
  istop=(LEN(xiniline))
  FOR i = 1 TO istop
    DO WHILE ASC(SUBSTR(xiniline, i, 1))!=0 .AND. SUBSTR(xiniline, i, 1) != _NULL ;
        .AND. ASC(SUBSTR(xiniline, i, 1))!=32
      IF SUBSTR(xiniline, i, 1) != _END_CHAR .AND. SUBSTR(xiniline, i, 1)!=">";
          .AND.SUBSTR(xiniline, i, 1) != _NULL;
          .AND.ASC(SUBSTR(xiniline, i, 1))!=32
        result = LEFT(xiniline, i)
        i=i+1
      ELSE
        i=i+1
      ENDIF
    ENDDO
    i=i+1
  ENDFOR
  FOR i = 1 TO LEN(result)
    IF ASC(SUBSTR(result, i, 1))=32 .AND. i>1
      result = LEFT(result, i-1)
    ENDIF
    IF ASC(SUBSTR(result, i, 1))=13 .AND. i>1
      result = LEFT(result, i-1)
    ENDIF
  ENDFOR

  IF TYPE('result')="L" .OR. LEN(ALLTRIM(result))=0
    result=SPACE(50)
  ENDIF

  RETURN result

FUNCTION checkit
  PARAMETERS xiniline
  IF TYPE('xiniline')="C" .AND. !EMPTY(xiniline) .AND. "Pub    A" $ xiniline
    FOR i = 1 TO LEN(xiniline)
      IF ASC(SUBSTR(xiniline, i, 1))=32 .AND. i>1
        xinilinet = LEFT(xiniline, i-1)
      ENDIF
      *^^Tch
      IF ASC(SUBSTR(xiniline, i, 1))=13 .AND. i>1
        xinilinet = LEFT(xiniline, i-1)
      ENDIF
      *^^Tch
      IF ASC(SUBSTR(xiniline, i, 1))=10 .AND. i>1
        xinilinet = LEFT(xiniline, i-1)
      ENDIF
    ENDFOR
    IF "RATE_ERR    " $ xiniline
      showit=.T.
    ENDIF
    IF showit
      lncount=lncount+1
      ? ALLTRIM(STR(lncount))+"-"+xiniline
    ENDIF
  ENDIF
  RETURN xiniline

PROCEDURE copytotable
  CLOSE TABLES
  WAIT WINDOW "Press anykey to create table of memory variables: memtab.dbf"
  CLEAR
  IF FILE('memtab.dbf')
    DELETE FILE ('memtab.dbf')
  ENDIF
  SELE 0
  CREATE TABLE MEMTAB FREE (cvar c(40), cscope c(10), ctype c(1), cvalue c(200),;
    nvalue N(15,2), lvalue L, dvalue D, csubscript c(20))
  IF FILE('arrays.txt')
    !COPY arrays.txt newmem.txt
  ENDIF
  xfile='newmem.txt'
  IF FILE(xfile)
    xfilehan = FOPEN(xfile)
  ELSE
    MESSAGEBOX(xfile+ " does not exist.",16)
    RETURN
  ENDIF
  IF xfilehan > 0	&& successfully opened memory.txt
    DO WHILE !FEOF(xfilehan) .AND. !xquit
      xiniline=""
      xiniline = FGETS(xfilehan)
      xiniline=LTRIM(xiniline)
      IF LEN(ALLTRIM(xiniline))>1
        WAIT WINDOW xiniline NOWAIT
        DO CASE
          CASE "Pub    A" $ xiniline
            SELE MEMTAB
            APPEND BLANK
            myvar=ALLTRIM(LEFT(xiniline,40))
            REPLACE MEMTAB.cvar WITH ALLTRIM(LEFT(xiniline,40))
            REPLACE MEMTAB.cscope WITH "Pub"
            REPLACE MEMTAB.ctype WITH "A"
          CASE LEFT(xiniline,1)="("
            SELE MEMTAB
            APPEND BLANK
            IF !EMPTY(myvar)
              REPLACE MEMTAB.cvar WITH myvar
            ENDIF
            REPLACE MEMTAB.cscope WITH "Pub"
            REPLACE MEMTAB.csubscript WITH SUBSTR(xiniline,1,AT(')',xiniline))
            lcvalue=SUBSTR(xiniline,AT(')',xiniline)+6,1)
            DO CASE
              CASE lcvalue="N"
                REPLACE MEMTAB.ctype WITH "N"
                REPLACE MEMTAB.nvalue WITH ;
                VAL(SUBSTR(xiniline,RAT('(',xiniline)+1,RAT(')',xiniline)-RAT('(',xiniline)-1))
              CASE lcvalue="C"
                REPLACE MEMTAB.ctype WITH "C"
                REPLACE MEMTAB.cvalue WITH ;
                SUBSTR(xiniline,AT(CHR(34),xiniline)+1,(RAT(CHR(34),xiniline)-1)-AT(CHR(34),xiniline))
              CASE lcvalue="L"
                REPLACE MEMTAB.ctype WITH "L"
                REPLACE MEMTAB.lvalue WITH ;
                IIF(SUBSTR(xiniline,AT('.',xiniline)+1,(RAT('.',xiniline)-1)-AT('.',xiniline))="T",.T.,.F.)
              CASE lcvalue="D"
                REPLACE MEMTAB.ctype WITH "D"
                REPLACE MEMTAB.dvalue WITH CTOD(RIGHT(ALLTRIM(xiniline),10))
            ENDCASE
          CASE "Pub    C" $ xiniline
            myvar=""
            SELE MEMTAB
            APPEND BLANK
            REPLACE MEMTAB.cvar WITH ALLTRIM(LEFT(xiniline,40))
            REPLACE MEMTAB.cscope WITH "Pub"
            REPLACE MEMTAB.ctype WITH "C"
            REPLACE MEMTAB.cvalue WITH ;
            SUBSTR(xiniline,AT(CHR(34),xiniline)+1,(RAT(CHR(34),xiniline)-1)-AT(CHR(34),xiniline))
          CASE "Pub    N" $ xiniline
            myvar=""
            SELE MEMTAB
            APPEND BLANK
            REPLACE MEMTAB.cvar WITH ALLTRIM(LEFT(xiniline,40))
            REPLACE MEMTAB.cscope WITH "Pub"
            REPLACE MEMTAB.ctype WITH "N"
            REPLACE MEMTAB.nvalue WITH ;
            VAL(SUBSTR(xiniline,AT('(',xiniline)+1,(RAT(')',xiniline)-2)-AT('(',xiniline)))
          CASE "Pub    L" $ xiniline
            myvar=""
            SELE MEMTAB
            APPEND BLANK
            REPLACE MEMTAB.cvar WITH ALLTRIM(LEFT(xiniline,40))
            REPLACE MEMTAB.cscope WITH "Pub"
            REPLACE MEMTAB.ctype WITH "L"
            REPLACE MEMTAB.lvalue WITH ;
            IIF(SUBSTR(xiniline,AT('.',xiniline)+1,(RAT('.',xiniline)-1)-AT('.',xiniline))="T",.T.,.F.)
          CASE "Pub    D" $ xiniline
            myvar=""
            SELE MEMTAB
            APPEND BLANK
            REPLACE MEMTAB.cvar WITH ALLTRIM(LEFT(xiniline,40))
            REPLACE MEMTAB.cscope WITH "Pub"
            REPLACE MEMTAB.ctype WITH "D"
            REPLACE MEMTAB.dvalue WITH CTOD(RIGHT(ALLTRIM(xiniline),10))
          OTHERWISE
            ? "CHECK: "+myvar
            ? xiniline
            LOOP
        ENDCASE
      ENDIF
    ENDDO
  ENDIF
  GO TOP
  INDEX ON cvar TAG cvar
  SET ORDER TO TAG cvar
  BROWSE
  IF USED('memtab')
    USE IN MEMTAB
  ENDIF
  RETURN
.·*´¨)
.·`TCH
(..·*

010000110101001101101000011000010111001001110000010011110111001001000010011101010111001101110100
"When the debate is lost, slander becomes the tool of the loser." - Socrates
Vita contingit, Vive cum eo. (Life Happens, Live With it.)
"Life is not measured by the number of breaths we take, but by the moments that take our breath away." -- author unknown
"De omnibus dubitandum"
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform