Annotation of mstools/samples/sdktools/windiff/file.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.