home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Visual Database / Visual Foxpro 6.0 (Ent. Edition) / Vf6ent Extractor.EXE / TOOLS / XSOURCE / XSOURCE.ZIP / vfpsource / wizards / Wzintnet / wizinet.prg < prev    next >
Encoding:
Text File  |  1998-05-01  |  14.8 KB  |  485 lines

  1. *:*********************************************************************
  2. *:
  3. *:        Class file: \WZINTNET\WIZINET.PRG
  4. *:
  5. *:         Wizard: Internet
  6. *:         Author: Microsoft Corporation; Matthew Kowalczyk, Ken Levy
  7. *:          Created: 09/20/95
  8. *:    Last modified: 01/11/96
  9. *:
  10. *:
  11. *:    IWizEngine Class Methods
  12. *:    ========================    
  13. *:        GenerateHTML        Generates the final HTML page
  14. *:        CopyFile            Copies a file to the current directory
  15. *:        CopyAllFiles        Copies all files used in this Class
  16. *:        InternetFinish        Called when the finish button is Clicked in the wizard
  17. *:
  18. *:*********************************************************************
  19. #INCLUDE "inetwiz.H"        && Include basic INTERNET definitions
  20.  
  21. #DEFINE WIZFORM_CLASS        "form"
  22. #DEFINE WIZFORM_NAME        "internetwizard"
  23. #DEFINE    C_SAVEFORM_LOC        "Save HTML page as:"
  24.  
  25.  
  26. *******************************************
  27. DEFINE CLASS IWizEngine AS WizEngineAll
  28. *******************************************
  29.     
  30.     
  31.     **************************************
  32.     * Method Descriptions
  33.     *
  34.     * GenerateHTML:        Generates Final HTML Page
  35.     * GenerateIDC:        Generates Final IDC File    
  36.     * GenerateHTX:        Generates Final HTX File
  37.     *    
  38.     *
  39.     **************************************
  40.  
  41.     ****************
  42.     * Define Internet Specific Properties
  43.     ****************
  44.     
  45.     ********* Search Page properties
  46.     cSeaTitle                =TITLE1_LOC                            && Default for Title of Search Page. 
  47.     cSeaHeaderTxt            =""                                    && Default Search Header Text
  48.     cSeaBackgroundImg        =""                                    && Default Search Background Gif
  49.     cSeaPageName            ="Page1"                            && Name of Search Page
  50.     cSeaFileName            =""                                    && Default name for Search output
  51.     cSeaEditTxt                =STRINGHERE_LOC                        && Default text for the EditBox
  52.     cSeaButtonTxt            =SEARCHBTNCAPTION_LOC                && Default button text
  53.     cSeaTextSize            = 20                                && Default textbox size
  54.     cSeaSearchColumn        = ""                                && Column to search on
  55.     cSeaHeaderImg            = ""                                && Header Image
  56.     cSeaOutputDirectory        = ""                                && Output directory to save output files
  57.     cSeaReturnAsFile        = .F.                                && Return result as file
  58.     
  59.     ******** Return Page Properties
  60.     CRetTitle                =TITLE2_LOC                            && Default for Title of Return Page. 
  61.     CRetHeaderTxt            =""                                    && Default Return Header Text
  62.     CRetBackgroundImg        =""                                    && Default Return Background Gif
  63.     CRetHeaderImg            = ""                                && Header Image
  64.     nRetMaxRecords            = 10                                    && Number of records to return
  65.     cRetTemplateID            ="0000001"                            && Default Template ID
  66.     DIMENSION aReturnColumns[1] 
  67.     aReturnColumns[1]        = ""                                && Detail Fields to return 
  68.     DIMENSION aTableFields[1] 
  69.     aTableFields[1]            = ""                                && Fields of table to search 
  70.     
  71.     ******** Misc Properties
  72.     cDBFpath                = ""                                && DBF to be searched. Must be entered by user
  73.     cDBFFullPath            = ""                                && complete path to cDBFPath
  74.     cHTMLText                = ""                                && HTML Code
  75.     cIDCText                 = ""                                && IDC Code
  76.     cHTXText                 = ""                                && HTX Code
  77.     cDataSource                = ""                                && IDC DataSource
  78.  
  79.     Procedure InternetFinish
  80.         LOCAL ;
  81.             cCurrentDir;
  82.             cNewDir ;
  83.                                 
  84.         m.cCurrentDir = fullpath(curdir())
  85.         
  86.         if empty(this.cSeaOutputDirectory)
  87.             this.cSeaOutputDirectory = m.cCurrentDir
  88.         endif
  89.         m.cNewDir = this.cSeaOutputDirectory
  90.         
  91.         cd (cNewDir)
  92.         this.GenerateHTML
  93.         this.GenerateHTX
  94.         this.GenerateIDC
  95.         this.CopyAllFiles(cNewDir)
  96.         cd (cCurrentDir)
  97.     EndProc
  98.     
  99.     Procedure CopyAllFiles(tcNewDir)
  100.         LOCAL nDirExists,lcCopyToFileName,lcFileName
  101.         LOCAL aDummy[1]
  102.  
  103.         nDirExists = 0
  104.         nDirExists = adir(aDummy,"img","D")
  105.         if     (nDirExists = 0)
  106.             md img
  107.         ENDIF                
  108.         *** copy images to img directory
  109.         this.copyfile(UPPER(this.cSeaBackgroundImg),'IMG\')
  110.         this.copyfile(UPPER(this.cSeaHeaderImg),'IMG\')
  111.         this.copyfile(UPPER(this.cRetBackgroundImg),'IMG\')
  112.         this.copyfile(UPPER(this.cRetHeaderImg),'IMG\')
  113.         lcFileName=FULLPATH('FOXSM.GIF',oEngine.oFileInfo.cFilePath)
  114.         lcCopyToFileName=UPPER(tcNewDir+'IMG\FOXSM.GIF')
  115.         IF FILE(lcFileName) AND NOT FILE(lcCopyToFileName)
  116.             COPY FILE (lcFileName) TO (lcCopyToFileName)
  117.         ENDIF
  118.         lcFileName=FULLPATH('VFPCGI.EXE',oEngine.oFileInfo.cFilePath)
  119.         lcCopyToFileName=UPPER(tcNewDir+'VFPCGI.EXE')
  120.         IF FILE(lcFileName) AND NOT FILE(lcCopyToFileName)
  121.             COPY FILE (lcFileName) TO (lcCopyToFileName)
  122.         ENDIF
  123.  
  124.     EndProc
  125.     
  126.     PROCEDURE ErrorTest
  127.     LPARAMETERS cProgramName, nErrorNum
  128.     
  129.         if ("CopyAllFiles" $ cProgramName) and (nErrorNum =1961)
  130.             Return .T.
  131.         ENDIF
  132.         RETURN .F.
  133.     ENDPROC    
  134.         
  135.     Procedure CopyFile
  136.     LPARAMETERS tcFileName,tcPath
  137.     LOCAL lcPath,lcFileName
  138.     
  139.     lcPath=IIF(EMPTY(tcPath),'',tcPath)
  140.     lcFileName=UPPER(ALLTRIM(this.justFname(tcFileName)))
  141.     if !empty(lcFileName)
  142.         if NOT FILE(lcFileName)
  143.             copy file (tcFileName) to (lcPath+lcFileName)
  144.         ENDIF
  145.     ENDIF
  146.     ENDPROC
  147.     
  148.     Procedure GenerateHTX
  149.         *****************
  150.         * Use this method to generate the HTX file
  151.         *****************
  152.         
  153.         *****************
  154.         * Local Vars
  155.         *****************    
  156.         LOCAL i, nSelected, cHTXTextTmpTop, cHTXTextTmpBottom, iSelect
  157.         LOCAL array aTempFlds(1)
  158.         LOCAL ARRAY aDBFStru[1,1]
  159.         
  160.         nSelected=Select()
  161.         select tempstyl
  162.         set order to tempid
  163.         seek(this.cRetTemplateID)
  164.         if !(found())            && Should never happen
  165.             return .F.
  166.         ENDIF    
  167.         
  168.         cHTXTextTmpBottom=tempstyl.htxfile
  169.         cHTXTextTmpBottom=strtran(cHTXTextTmpBottom,"<HTML>","")
  170.         cHTXTextTmpTop='<HTML>'+CRLF
  171.         
  172.         if !Empty(this.cRetTitle)
  173.             cHTXTextTmpTop=cHTXTextTmpTop+'<HEAD>'+ CRLF
  174.             cHTXTextTmpTop=cHTXTextTmpTop+'<TITLE>'+allt(this.cRetTitle)+'</TITLE>'+ CRLF
  175.             cHTXTextTmpTop=cHTXTextTmpTop+'</HEAD>'+ CRLF
  176.         ENDIF
  177.             
  178.         If !Empty(this.cRetHeaderTxt)
  179.             cHTXTextTmpTop=cHTXTextTmpTop+'<CENTER><h1>'+alltrim(this.cRetHeaderTxt)+'</h1></CENTER>'+ CRLF
  180.         ENDIF
  181.  
  182.         if !empty(this.cRetBackgroundImg)
  183.             cHTXTextTmpTop=cHTXTextTmpTop+'<BODY BACKGROUND="IMG/'+UPPER(alltrim(this.justfname(this.cRetBackgroundImg)))+'">'+ CRLF
  184.         ENDIF
  185.  
  186.         if !empty(this.cRetHeaderImg)
  187.             cHTXTextTmpTop=cHTXTextTmpTop+'<CENTER>'+ CRLF
  188.             cHTXTextTmpTop=cHTXTextTmpTop+'<IMG SRC="IMG/'+UPPER(alltrim(this.justfname(this.cRetHeaderImg)))+'">'+ CRLF
  189.             cHTXTextTmpTop=cHTXTextTmpTop+'</CENTER>'+ CRLF
  190.         ENDIF
  191.  
  192.         *- get data structure of source table, so we can determine correct number of decimal places for numeric values
  193.         iSelect = SELECT()
  194.         IF USED("_tmpsource")
  195.             USE IN _tmpsource
  196.         ENDIF
  197.         SELECT 0
  198.         USE (THIS.cDBFFullPath) AGAIN ALIAS _tmpsource
  199.         =AFIELDS(aDBFStru)
  200.         USE IN _tmpSource
  201.         SELECT (iSelect)
  202.         set talk off
  203.         select fieldname, fieldrepl from tempflds where tempflds.tempid=this.cRetTemplateID into array aTempFlds
  204.         FOR i = 1 to alen(aTempFlds,1)
  205.             lcNewText=IIF(i<=alen(this.aReturnColumns,1),this.aReturnColumns[i,1],'')
  206.             iFldIndex = ASCAN(aDBFStru,UPPER(lcNewText))
  207.             IF iFldIndex > 0
  208.                 iFldIndex = ASUBSCRIPT(aDBFStru, iFldIndex, 1)
  209.                 iType = aDBFStru[iFldIndex,2]
  210.                 iLen = aDBFStru[iFldIndex,3]
  211.                 iDec = aDBFStru[iFldIndex,4]
  212.             ELSE
  213.                 iType = 'C'
  214.                 iLen = 10
  215.                 iDec = 0
  216.             ENDIF
  217.             *- adjust numeric values so that they display properly (e.g., all decimal places)
  218.             DO CASE
  219.                 CASE iType $ 'NFB'
  220.                     lcNewText = "STR(" + lcNewText + "," + LTRIM(STR(iLen)) + "," + LTRIM(STR(iDec)) + ")"
  221.                 CASE iType $ 'Y'
  222.                     lcNewText = "STR(" + lcNewText + ",16," + LTRIM(STR(iDec)) + ")"
  223.                 CASE iType == 'I'
  224.                     *- this will be handled appropriately by the server
  225.                 CASE iType == 'B'
  226.                     *- double
  227.                     *- lcNewText = "ALLT(STR(SIGN(" + lcNewText + ")*IIF(" + lcNewText + "=0,0,LOG10(ABS(" + lcNewText + "))),20,16))"
  228.                 OTHERWISE
  229.                     *- the EXPRTOC() function in the server app will handle all other cases
  230.             ENDCASE
  231.             cHTXTextTmpBottom=strtran(cHTXTextTmpBottom,alltrim(aTempFlds(i,1)),lcNewText)
  232.         ENDFOR
  233.         this.cHTXText=cHTXTextTmpTop+cHTXTextTmpBottom
  234.         this.cHTXText=STRTRAN(STRTRAN(STRTRAN(STRTRAN(this.cHTXText,'<DD><%%>'+CRLF,''), ;
  235.                 '<DD><%%>'+C_CR,''),', <%%>',''),'<%%>','')
  236.         this.WriteVarToFile(this.cHTXText,this.forceExt(this.juststem(this.cSeaFileName),"HTX"))
  237.         select (nSelected)
  238.  
  239.     ENDPROC
  240.     
  241.     Procedure GenerateIDC
  242.         LOCAL cReturnColumnTxt,lcWhere1,lcWhere2,lcExpr,lcSubExpr,lcField
  243.         LOCAL lnCount,lnAtPos,lnAtPos2,lnOffset,lcDBFPath
  244.         LOCAL aTempFlds(1)
  245.         
  246.         m.cReturnColumnTxt=""
  247.         
  248.         *** Return Columns
  249.         this.cIDCText="Datasource: "+ALLTRIM(this.cDataSource)+CRLF
  250.         this.cIDCText=this.cIDCText+"Template: "+this.JustFName(this.forceExt(this.juststem(this.cSeaFileName),"HTX"))+CRLF
  251.         select distinct fieldrepl from tempflds where tempflds.tempid=this.cRetTemplateID into array aTempFlds
  252.  
  253.         for i = 1 to ALEN(aTempFlds)
  254.             
  255.                 m.CReturnColumnTxt = m.CReturnColumnTxt+ " "+ALLTRIM(aTempFlds(i))
  256.                 if !(i = ALEN(aTempFlds))
  257.                     m.cReturnColumnTxt = m.cReturnColumnTxt +","
  258.                 endif
  259.         endfor
  260.         this.cIDCText=this.cIDCText+"SQLStatement:"+CRLF
  261.         this.cIDCText=this.cIDCText+"+" + "SELECT" + m.cReturnColumnTxt
  262.         for i = 1 to ALEN(this.aReturnColumns,1)
  263.             this.cIDCText= this.cIDCText+ " "+ALLTRIM(this.aReturnColumns[i,1])
  264.             if !(i = ALEN(this.aReturnColumns,1))
  265.                 this.cIDCText= this.cIDCText+","
  266.             endif
  267.         endfor
  268.         lcDBFPath=ALLTRIM(this.cDBFPath)
  269.         IF LOWER(RIGHT(lcDBFPath,4))=='.dbf'
  270.             lcDBFPath=LEFT(lcDBFPath,LEN(lcDBFPath)-4)
  271.         ENDIF
  272.         this.cIDCText=this.cIDCText+CRLF+"+ FROM '" + lcDBFPath+"'"+CRLF
  273.         lcWhere1=ALLTRIM(this.cSeaSearchColumn)
  274.         lcWhere2="'%SearchParam%'"
  275.         lcExpr=lcWhere1
  276.         DO WHILE .T.
  277.             lnAtPos=AT('+',lcExpr)
  278.             IF lnAtPos=0
  279.                 EXIT
  280.             ENDIF
  281.             lcSubExpr=SUBSTR(lcExpr,lnAtPos)
  282.              lnAtPos2=AT(')',lcSubExpr)
  283.             IF lnAtPos2=0
  284.                 lcExpr=ALLTRIM(LEFT(lcExpr,lnAtPos-1))
  285.             ELSE
  286.                 IF BETWEEN(AT('(',lcSubExpr),1,lnAtPos2)
  287.                     lnOffset=0
  288.                 ELSE
  289.                     lnOffset=1
  290.                 ENDIF
  291.                 lcExpr=ALLTRIM(LEFT(lcExpr,lnAtPos-1))+ ;
  292.                         ALLTRIM(SUBSTR(lcExpr,lnAtPos+lnAtPos2-lnOffset))
  293.             ENDIF
  294.         ENDDO
  295.         IF '('$lcExpr
  296.             FOR lnCount = 1 TO ALEN(this.aTableFields,1)
  297.                 lcField=this.aTableFields[lnCount,1]
  298.                 IF EMPTY(lcField)
  299.                     LOOP
  300.                 ENDIF
  301.                 IF ATC(lcField,lcExpr)>0
  302.                     lcWhere2=StrTranC(lcExpr,lcField,lcWhere2)
  303.                     EXIT
  304.                 ENDIF
  305.             ENDFOR
  306.         ENDIF
  307.  
  308.         this.cIDCText=this.cIDCText+"+ " + "WHERE "+lcWhere1+" = "+lcWhere2+CRLF
  309.         this.cIDCText=this.cIDCText+"Maxrecords: "+ALLTRIM(STR(this.nRetMaxRecords))+CRLF
  310.         this.WriteVarToFile(this.cIDCText,this.ForceExt(this.JustStem(this.cSeaFileName),"IDC"))
  311.  
  312.     ENDPROC
  313.     
  314.     Procedure WriteVarToFile
  315.     PARAMETER cVarName, cFileName
  316.     LOCAL nFileHandle
  317.     
  318.         nFileHandle = fcreate(cFileName)    
  319.         =FWRITE(nFileHandle, cVarName)
  320.         =FClose(nFileHandle)
  321.         
  322.     ENDPROC
  323.         
  324.     Procedure GenerateHTML
  325.         *****************
  326.         * Use this method to generate the HTML page
  327.         *****************
  328.         
  329.         *****************
  330.         * Local Vars
  331.         *****************        
  332.         Local ;        
  333.             i ,j                         
  334.         
  335.         this.cHTMLText='<HTML>'+ CRLF
  336.         this.cHTMLText=this.cHTMLText+'<HEAD>'+ CRLF
  337.         this.cHTMLText=this.cHTMLText+'<TITLE>'+this.cSeaTitle+'</TITLE>'+ CRLF
  338.         this.cHTMLText=this.cHTMLText+'</HEAD>'+ CRLF
  339.         if !empty(this.cSeaBackgroundImg)
  340.             this.cHTMLText=this.cHTMLText+'<BODY BACKGROUND="IMG/'+UPPER(alltrim(this.justfname(this.cSeaBackgroundImg)))+'">'+ CRLF
  341.         ENDIF
  342.         this.cHTMLText=this.cHTMLText+'<CENTER><h1>'+alltrim(this.cSeaTitle)+'</h1></CENTER>'+ CRLF
  343.         if !empty(this.cSeaHeaderImg)
  344.             this.cHTMLText=this.cHTMLText+'<CENTER>'+ CRLF
  345.             this.cHTMLText=this.cHTMLText+'<IMG SRC="IMG/'+UPPER(alltrim(this.justfname(this.cSeaHeaderImg)))+'">'+ CRLF
  346.             this.cHTMLText=this.cHTMLText+'</CENTER>'+ CRLF
  347.         ENDIF
  348.         this.cHTMLText=this.cHTMLText+'<P>'+ CRLF
  349.         this.cHTMLText=this.cHTMLText+this.cSeaHeaderTxt+ CRLF
  350.         this.cHTMLText=this.cHTMLText+'</BODY>'+ CRLF
  351.         this.cHTMLText=this.cHTMLText+'<P>'+ CRLF
  352.         
  353.         This.cHTMLText=this.cHTMLText+'<CENTER>'+CRLF
  354.         this.cHTMLText=this.cHTMLText+'<P>'+this.cSeaEditTxt+'</P>'+ CRLF
  355.         this.cHTMLText=this.cHTMLText+'<FORM ACTION="'
  356.         this.cSeaFileName=ALLTRIM(MLINE(ALLTRIM(this.cSeaFileName),1))
  357.         IF EMPTY(this.cDataSource)
  358.             this.cHTMLText=this.cHTMLText+'vfpcgi.exe?IDCFile='+ ;
  359.                     TrimPath(this.cSeaFileName,.T.)+'.IDC'
  360.         ELSE
  361.             this.cHTMLText=this.cHTMLText+TrimPath(this.cSeaFileName,.T.)+'.IDC'
  362.         ENDIF
  363.         this.cHTMLText=this.cHTMLText+'" METHOD="POST">'+ CRLF
  364.     
  365.         this.cHTMLText=this.cHTMLText+'<INPUT NAME="SearchParam" SIZE='+ ;
  366.                 ALLTRIM(STR(this.cSeaTextSize))+' VALUE="" >'+ CRLF
  367.         this.cHTMLText=this.cHTMLText+'<INPUT TYPE="SUBMIT" VALUE="'+this.cSeaButtonTxt+'">'+ CRLF
  368.         this.cHTMLText=This.cHTMLText+"<br>"+CRLF
  369.         IF     this.cSeaReturnAsFile
  370.             this.cHTMLText=this.cHTMLText+'<br><INPUT NAME="ReturnAsFile" TYPE = checkbox>'+RETDATA_LOC+'<br>'
  371.         ENDIF
  372.         This.cHTMLText=this.cHTMLText+'</CENTER>'+CRLF
  373.         this.cHTMLText=this.cHTMLText+'<hr><center>'+ CRLF
  374.         this.cHTMLText=this.cHTMLText+'<img src="IMG/FOXSM.GIF">'+ CRLF
  375.         this.cHTMLText=this.cHTMLText+GENERATE_LOC+ CRLF
  376.         this.cHTMLText=this.cHTMLText+'</center>'+ CRLF
  377.         this.cHTMLText=this.cHTMLText+'<hr>'+ CRLF
  378.         
  379.         this.cHTMLText=this.cHTMLText+'</FORM>'+ CRLF
  380.         this.cHTMLText=this.cHTMLText+'</BODY>'+ CRLF
  381.         this.cHTMLText=this.cHTMLText+'</HTML>'+ CRLF
  382.         this.WriteVarToFile(this.cHTMLText,this.forceExt(this.juststem(this.cSeaFileName),"HTM"))
  383.  
  384.     EndProc
  385.  
  386. ENDDEFINE
  387.  
  388.  
  389.  
  390. FUNCTION StrTranC(tcExpC1,tcExpC2,tcExpC3,tnExpN1,tnExpN2)
  391. LOCAL lcExpr,lnAtPos,lnAtPos2,lnCount1,lnCount2
  392.  
  393. IF EMPTY(tcExpC1).OR.EMPTY(tcExpC2)
  394.   RETURN tcExpC1
  395. ENDIF
  396. lcExpr=tcExpC1
  397. IF TYPE('tnExpN1')#'N'
  398.   tnExpN1=1
  399. ENDIF
  400. IF TYPE('tnExpN2')#'N'
  401.   tnExpN2=LEN(tcExpC1)
  402. ENDIF
  403. IF tnExpN1<1.OR.tnExpN2<1
  404.   RETURN tcExpC1
  405. ENDIF
  406. lnCount1=0
  407. lnCount2=0
  408. lnAtPos2=1
  409. DO WHILE .T.
  410.   lnAtPos=ATC(tcExpC2,SUBSTR(lcExpr,lnAtPos2))
  411.   IF lnAtPos=0
  412.     EXIT
  413.   ENDIF
  414.   lnCount1=lnCount1+1
  415.   IF lnCount1<tnExpN1
  416.     lnAtPos2=lnAtPos+lnAtPos2+LEN(tcExpC2)-1
  417.     LOOP
  418.   ENDIF
  419.   lcExpr=LEFT(lcExpr,lnAtPos+lnAtPos2-2)+tcExpC3+;
  420.          SUBSTR(lcExpr,lnAtPos+lnAtPos2+LEN(tcExpC2)-1)
  421.   lnCount2=lnCount2+1
  422.   IF lnCount2>=tnExpN2
  423.     EXIT
  424.   ENDIF
  425.   lnAtPos2=lnAtPos+lnAtPos2+LEN(tcExpC3)-1
  426.   IF lnAtPos2>LEN(lcExpr)
  427.     EXIT
  428.   ENDIF
  429. ENDDO
  430. RETURN lcExpr
  431.  
  432.  
  433.  
  434. FUNCTION TrimExt(filename)
  435. LOCAL at_pos,at_pos2
  436.  
  437. m.at_pos=RAT('.',m.filename)
  438. IF m.at_pos>0
  439.     m.at_pos2=RAT(':',m.filename)
  440.     IF m.at_pos>m.at_pos2
  441.         m.filename=LEFT(m.filename,m.at_pos-1)
  442.     ENDIF
  443. ENDIF
  444. RETURN ALLTRIM(m.filename)
  445.  
  446. * END TrimExt
  447.  
  448.  
  449.  
  450. FUNCTION TrimPath(filename,trim_ext)
  451. LOCAL at_pos
  452.  
  453. IF EMPTY(m.filename)
  454.     RETURN ''
  455. ENDIF
  456. m.at_pos=AT(':',m.filename)
  457. IF m.at_pos>0
  458.     m.filename=SUBSTR(m.filename,m.at_pos+1)
  459. ENDIF
  460. IF m.trim_ext
  461.     m.filename=trimext(m.filename)
  462. ENDIF
  463. m.filename=ALLTRIM(SUBSTR(m.filename,AT('\',m.filename,;
  464.     MAX(OCCURS('\',m.filename),1))+1))
  465. DO WHILE LEFT(m.filename,1)=='.'
  466.     m.filename=ALLTRIM(SUBSTR(m.filename,2))
  467. ENDDO
  468. DO WHILE RIGHT(m.filename,1)=='.'
  469.     m.filename=ALLTRIM(LEFT(m.filename,LEN(m.filename)-1))
  470. ENDDO
  471. RETURN m.filename
  472.  
  473. * END TrimPath
  474.  
  475.  
  476.  
  477. FUNCTION TrimFile(filename)
  478. LOCAL at_pos
  479.  
  480. m.at_pos=RAT('\',m.filename)
  481. m.filename=ALLTRIM(IIF(m.at_pos=0,m.filename,LEFT(m.filename,m.at_pos)))
  482. RETURN m.filename
  483.  
  484. * END TrimFile
  485.