FILE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1993-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. /****************************** Module Header *******************************
  11. * Module Name: FILE.C
  12. *
  13. * An object representing a file and the lines of text it contains.
  14. *
  15. * Functions:
  16. *
  17. * file_new()
  18. * file_getdiritem()
  19. * file_delete()
  20. * file_getlinelist()
  21. * file_discardlines()
  22. * file_reset()
  23. * file_readlines()
  24. *
  25. * Comments:
  26. *
  27. * A FILEDATA object is initialised with a DIRITEM handle from which it
  28. * can get a filename. It knows how to supply a list of LINE handles for the
  29. * lines of text in the file.
  30. *
  31. * The file is read into memory optionally on creation of the FILEDATA object:
  32. * otherwise, at the first call to file_getlinelist. It can be discarded
  33. * by calling file_discardlines: in this case, it will be re-read next time
  34. * file_getlinelist is called.
  35. *
  36. * Calling file_reset will cause line_reset to be called for all lines
  37. * in the list. This clears any links.
  38. *
  39. * We allocate all memory from a gmem* heap hHeap, assumed to be declared and
  40. * initialised elsewhere.
  41. *
  42. ****************************************************************************/
  43. #include <windows.h>
  44. #include <stdlib.h>
  45. #include <string.h>
  46. #include "gutils.h"
  47. #include "windiff.h"
  48. #include "list.h"
  49. #include "line.h"
  50. #include "scandir.h"
  51. #include "file.h"
  52. extern HANDLE hHeap;
  53. struct filedata {
  54.         DIRITEM diritem;        /* handle to file name information */
  55.         LIST lines;             /* NULL if lines not read in */
  56. };
  57. void file_readlines(FILEDATA fd);
  58. /****************************************************************************
  59.  * Function: file_new
  60.  *
  61.  * Purpose:
  62.  * 
  63.  * Creates a new FILEDATA, based on a DIRITEM. the filedata will retain
  64.  * the diritem handle for use in fetching filenames and handles.
  65.  *
  66.  * If the bRead is set, the file will be read into memory. If not, this
  67.  * will be done during the first call to file_getlines.
  68.  *
  69.  ***************************************************************************/
  70. FILEDATA
  71. file_new(DIRITEM fiName, BOOL bRead)
  72. {
  73.         FILEDATA fd;
  74.         fd = (FILEDATA) gmem_get(hHeap, sizeof(struct filedata));
  75.         if (fd == NULL) {
  76.                 return(NULL);
  77.         }
  78.         fd->diritem = fiName;
  79.         fd->lines = NULL;
  80.         if (bRead) {
  81.                 file_readlines(fd);
  82.         }
  83.         return(fd);
  84. }
  85. /****************************************************************************
  86.  * Function: file_getdiritem
  87.  *
  88.  * Purpose:
  89.  * 
  90.  * Returns a handle to the DIRITEM used to create this FILEDATA
  91.  *
  92.  ***************************************************************************/
  93. DIRITEM
  94. file_getdiritem(FILEDATA fd)
  95. {
  96.         if (fd == NULL) {
  97.                 return(NULL);
  98.         }
  99.         return(fd->diritem);
  100. }
  101. /****************************************************************************
  102.  * Function: file_delete
  103.  *
  104.  * Purpose:
  105.  * 
  106.  * Deletes a filedata and its associated list of lines. Note that the diritem
  107.  * is not deleted (this is owned by the DIRLIST, and will be deleted
  108.  * when the DIRLIST is deleted)
  109.  *
  110.  ***************************************************************************/
  111. void
  112. file_delete(FILEDATA fd)
  113. {
  114.         if (fd == NULL) {
  115.                 return;
  116.         }
  117.         /* throw away the line list, if there is one */
  118.         file_discardlines(fd);
  119.         gmem_free(hHeap, (LPSTR) fd, sizeof(struct filedata));
  120. }
  121. /****************************************************************************
  122.  * Function: file_getlinelist
  123.  *
  124.  * Purpose:
  125.  * 
  126.  * Returns a handle to a list of lines in this file. The items in the
  127.  * list are LINE handles.
  128.  *
  129.  * The first call to this function will cause the file to be read into
  130.  * memory if bRead was FALSE on the call to file_new, or if file_discardlines
  131.  * has since been called.
  132.  *
  133.  * The list of lines returned should not be deleted except by calls to
  134.  * file_delete or file_discardlines.
  135.  *
  136.  ***************************************************************************/
  137. LIST
  138. file_getlinelist(FILEDATA fd)
  139. {
  140.         if (fd == NULL) {
  141.                 return NULL;
  142.         }
  143.         if (fd->lines == NULL) {
  144.                 file_readlines(fd);
  145.         }
  146.         return(fd->lines);
  147. }
  148. /****************************************************************************
  149.  * Function: file_discardlines
  150.  *
  151.  * Purpose:
  152.  * 
  153.  * Discards the list of lines associated with a file. This will cause
  154.  * the file to be re-read next time file_getlinelist is called.
  155.  *
  156.  ***************************************************************************/
  157. void
  158. file_discardlines(FILEDATA fd)
  159. {
  160.         LINE line;
  161.         if (fd == NULL) {
  162.                 return;
  163.         }
  164.         if (fd->lines != NULL) {
  165.                 /* clear each line to free any memory associated
  166.                  * with them, then discard the entire list
  167.                  */
  168.                 List_TRAVERSE(fd->lines, line) {
  169.                         line_delete(line);
  170.                 }
  171.                 List_Destroy(&fd->lines);
  172.         }
  173.         /* this is probably done in List_Destroy, but better do it anyway*/
  174.         fd->lines = NULL;
  175. }
  176. /****************************************************************************
  177.  * Function: file_reset
  178.  *
  179.  * Purpose:
  180.  * 
  181.  * Forces a reset of each line in the list. The function line_reset discards 
  182.  * links between lines, and any hashcode information. This would be used if
  183.  * the compare options or hashcode options have changed.
  184.  *
  185.  ***************************************************************************/
  186. void
  187. file_reset(FILEDATA fd)
  188. {
  189.         LINE line;
  190.         if (fd == NULL) {
  191.                 return;
  192.         }
  193.         if (fd->lines != NULL) {
  194.                 List_TRAVERSE(fd->lines, line)  {
  195.                         line_reset(line);
  196.                 }
  197.         }
  198. }
  199. /****************************************************************************
  200.  * Function: file_readlines
  201.  *
  202.  * Purpose:
  203.  * 
  204.  * Reads the file into a list of lines.
  205.  *
  206.  * Comments:
  207.  *
  208.  * We use the buffered read functions to read a block at a time, and
  209.  * return us a pointer to a line within the block. The line we are
  210.  * pointed to is not null terminated. from this we do a line_new: this
  211.  * will make a copy of the text (since we want to re-use the buffer), and
  212.  * will null-terminate its copy.
  213.  *
  214.  *
  215.  ***************************************************************************/
  216. void
  217. file_readlines(FILEDATA fd)
  218. {
  219.         LPSTR textp;
  220.         int fh;
  221.         FILEBUFFER fbuf;
  222.         int linelen;
  223.         int linenr = 1;
  224.         HCURSOR hcurs;
  225.         hcurs = SetCursor(LoadCursor(NULL, IDC_WAIT));
  226.         /* open the file */
  227.         fh = dir_openfile(fd->diritem);
  228.         if (fh < 0) {
  229.                 SetCursor(hcurs);
  230.                 return;
  231.         }
  232.         /* initialise the file buffering */
  233.         fbuf = readfile_new(fh);
  234.         /* make an empty list for the files */
  235.         fd->lines = List_Create();
  236.         while ( (textp = readfile_next(fbuf, &linelen)) != NULL) {
  237.                 line_new(textp, linelen, linenr++, fd->lines);
  238.         }
  239.         /* close filehandle and free buffer */
  240.         readfile_delete(fbuf);
  241.         dir_closefile(fd->diritem, fh);
  242.         SetCursor(hcurs);
  243. }