windows-nt/Source/XPSP1/NT/sdktools/nmake/file.cpp
2020-09-26 16:20:57 +08:00

135 lines
3.9 KiB
C++

// FILE.C -- Utilities for File handling
//
// Copyright (c) 1989, Microsoft Corporation. All rights reserved.
//
// Purpose:
// This module contains routines that help in file handling. These routines
// have a behaviour which depends upon the Operating System Version.
//
// Revision History:
// 08-Jun-1992 SS Port to DOSX32
// 20-Apr-1989 SB Created
//
// Notes: Created to give OS/2 Version 1.2 filename support.
#include "precomp.h"
#pragma hdrstop
#define bitsin(type) sizeof(type) * 8
// getFileName -- get file name from struct
//
// Purpose: returns filename from file search structure passed to it.
//
// Input: findBuf -- address of pointer to structure
//
// Output: Returns a pointer to filename in the file search structure.
//
// Assumes:
// That the structure of appropriate size is given to it. This means that the
// size is as per --
// find_t : DOS Real Mode
// _finddata_t : FLAT Protect Mode
//
// Notes: The functionality depends upon the OS version and mode
char *
getFileName(
void *findBuf
)
{
char *fileName;
fileName = ((struct _finddata_t *) findBuf)->name;
return(fileName);
}
// getDateTime -- get file timestamp from struct
//
// Purpose: returns timestamp from the file search structure passed to it.
//
// Input: findBuf -- address of pointer to structure
//
// Output: Returns timestamp of the file in the structure
//
// Assumes:
// That the structure of appropriate size is given to it. This means that the
// size is as per --
// find_t : DOS Real Mode
// _finddata_t : FLAT Protect Mode
//
// Notes:
// The timestamp is an unsigned long value that gives the date and time of last
// change to the file. If the date is high byte then two times of creation of
// two files can be compared by comparing their timestamps. This is easy in the
// DOS struct but becomes complex for the OS/2 structs because the order of date
// and time has been reversed (for some unexplicable reason).
//
// The functionality depends upon the OS version and mode.
time_t
getDateTime(
const _finddata_t *pfd
)
{
time_t dateTime;
if( pfd->attrib & _A_SUBDIR ) {
// subdir return create date
if (pfd->time_create == -1) {
// except on FAT
dateTime = pfd->time_write;
}
else {
dateTime = pfd->time_create;
}
}
else {
dateTime = pfd->time_write ;
}
return dateTime;
}
// putDateTime -- change the timestamp in the struct
//
// Purpose: changes timestamp in the file search structure passed to it.
//
// Input: findBuf -- address of pointer to structure
// lDateTime -- new value of timestamp
//
// Assumes:
// That the structure of appropriate size is given to it. This means that the
// size is as per --
// find_t : DOS Real Mode
// FileFindBuf : OS/2 (upto Ver 1.10) Protect Mode
// _FILEFINDBUF : OS/2 (Ver 1.20 & later) Protect Mode
//
// Notes:
// The timestamp is a time_t value that gives the date and time of last
// change to the file. If the date is high byte then two times of creation of
// two files can be compared by comparing their timestamps. This is easy in the
// DOS struct but becomes complex for the OS/2 structs because the order of date
// and time has been reversed (for some unexplicable reason).
//
// The functionality depends upon the OS version and mode.
//
// Efficient method to get a long with high and low bytes reversed is
// (long)high << 16 | (long)low //high, low being short
void
putDateTime(
_finddata_t *pfd,
time_t lDateTime
)
{
if (pfd->attrib & _A_SUBDIR) {
// return the creation date on directories
pfd->time_create = lDateTime;
}
else {
pfd->time_write = lDateTime;
}
}