PRG缩排程序INDENT.PRG
来源:优易学  2011-12-9 18:35:49   【优易学:中国教育考试门户网】   资料下载   IT书店

  *********************************
  * INDENT.PRG - 格式化 .PRG 文件为缩进格式 Ver 1.0
  * (C) M.L.Y 2003.2.3
  *
  * 在 WIN98 + VFP 6.0 环境测试通过
  *********************************
  SET TALK OFF
  SET SAFETY ON
  LOCAL lcInFile, lcOutFile
  LOCAL lcCRLF, lcOutStr, lnLevel1, lnLevel2, lnFileHandle, lcLine
  IF MESSAGEBOX([INDENT.PRG - 格式化 .PRG 文件为缩进格式 Ver 1.0] + CHR(13) + ;
  CHR(13) + ;
  [是否继续?], 4 + 32 + 256, [.PRG Indent]) <> 6
  RETURN
  ENDIF
  lcInFile = GETFILE([PRG], [PRG file:], [Open])
  IF EMPTY(lcInFile)
  RETURN
  ENDIF
  IF RAT("\", lcInFile) > 0
  lcOutFile = SUBSTR(lcInFile, RAT("\", lcInFile ) + 1)
  ENDIF
  lcOutFile = SUBSTR(lcOutFile, 1, RAT(".", lcOutFile)) + "PR3"
  lcOutFile = PUTFILE("Output:", lcOutFile, "PR3")
  IF EMPTY(lcOutFile)
  RETURN
  ENDIF
  lcCRLF = CHR(13) + CHR(10)
  * 输出字符串:
  lcOutStr = []
  * 当前缩进级数:
  lnLevel1 = 0
  * 下一行缩进级数:
  lnLevel2 = 0
  lnFileHandle = FOPEN(lcInFile)
  IF lnFileHandle <= 0
  = MESSAGEBOX([打开文件出错!])
  RETURN 0
  ENDIF
  DO WHILE .T.
  IF FEOF(lnFileHandle)
  EXIT
  ENDIF
  * 读1行
  lcLine = FGETS(lnFileHandle, 10000)
  * TAB 统一换为 4 个空格
  lcLine = ALLTRIM(STRTRAN(lcLine, CHR(9), SPACE(4)))
  * 判断缩进级数
  lnLevel1 = IndentLevel(lcLine, lnLevel1, @lnLevel2)
  * 每级为 4 个空格:
  IF !EMPTY(lcLine)
  lcOutStr = lcOutStr + SPACE(4*lnLevel1) + lcLine + lcCRLF
  ELSE
  lcOutStr = lcOutStr + lcCRLF
  ENDIF
  * 下一行缩进级数:
  lnLevel1 = lnLevel2
  ENDDO
  = FCLOSE(lnFileHandle)
  * 输出字符串写到输出文件:
  = StrToFile(lcOutStr, lcOutFile)
  RETURN
  *********************************
  * FUNCTION IndentLevel(tcLine, tnLevel1, @tnLevel2)
  * 计算缩进级数
  *
  * tcLine - .PRG 当前行
  * tnLevel1 - 本行缩进级数
  * tnLevel2 - 下一行缩进级数
  * 函数返回tnLevel1, tnLevel2 通过引用返回
  *********************************

  FUNCTION IndentLevel
  LPARAMETERS tcLine, tnLevel1, tnLevel2
  * 变成大写的行:
  lcUpperLine = UPPER(ALLTRIM(tcLine))
  * 第1个空格的位置
  lnBlankPos = AT([ ], lcUpperLine)
  IF lnBlankPos > 0
  * 第1个词
  lcWord1 = SUBSTR(lcUpperLine, 1, lnBlankPos - 1)
  * 本行剩余内容
  lcUpperLine = LTRIM(SUBSTR(lcUpperLine, lnBlankPos))
  ELSE
  lcWord1 = lcUpperLine
  lcUpperLine = []
  ENDIF
  * 考虑 DO WHILE.NOT.EOF() 等:
  lcUpperLine = LTRIM(CHRTRAN(lcUpperLine, [.!] + CHR(9), SPACE(3)))
  lnBlankPos = AT([ ], lcUpperLine)
  *!* lnDotPos = AT([.], lcUpperLine) && 如 .NOT., .T., .F.
  *!* IF lnBlankPos > 0
  *!* IF lnDotPos > 0
  *!* lnBlankPos = MIN(lnBlankPos, lnDotPos)
  *!* ENDIF
  *!* ELSE
  *!* IF lnDotPos > 0
  *!* lnBlankPos = lnDotPos
  *!* ENDIF
  *!* ENDIF
  IF lnBlankPos > 0

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训