📄 os2.c
字号:
Trace((stderr, "error in DosDevIOCtl category IOCTL_DISK, function "
"DSK_BLOCKREMOVABLE\n (rc = 0x%04x): guessing...\n", rc));
return (nDrive == 1 || nDrive == 2)? TRUE : FALSE;
} else {
return DataArea[0] ? FALSE : TRUE;
}
} /* end function isfloppy() */
int IsFileNameValid(char *name)
{
HFILE hf;
#ifdef __32BIT__
ULONG uAction;
#else
USHORT uAction;
#endif
switch( DosOpen(name, &hf, &uAction, 0, 0, FILE_OPEN,
OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0) )
{
case ERROR_INVALID_NAME:
case ERROR_FILENAME_EXCED_RANGE:
return FALSE;
case NO_ERROR:
DosClose(hf);
default:
return TRUE;
}
}
/**********************/
/* Function map2fat() */
/**********************/
void map2fat(pathcomp, pEndFAT)
char *pathcomp, **pEndFAT;
{
char *ppc = pathcomp; /* variable pointer to pathcomp */
char *pEnd = *pEndFAT; /* variable pointer to buildpathFAT */
char *pBegin = *pEndFAT; /* constant pointer to start of this comp. */
char *last_dot = (char *)NULL; /* last dot not converted to underscore */
int dotname = FALSE; /* flag: path component begins with dot */
/* ("." and ".." don't count) */
register unsigned workch; /* hold the character being tested */
/* Only need check those characters which are legal in HPFS but not
* in FAT: to get here, must already have passed through mapname.
* (GRR: oops, small bug--if char was quoted, no longer have any
* knowledge of that.) Also must truncate path component to ensure
* 8.3 compliance...
*/
while ((workch = (uch)*ppc++) != 0) {
switch (workch) {
case '[':
case ']':
*pEnd++ = '_'; /* convert brackets to underscores */
break;
case '.':
if (pEnd == *pEndFAT) { /* nothing appended yet... */
if (*ppc == '\0') /* don't bother appending a */
break; /* "./" component to the path */
else if (*ppc == '.' && ppc[1] == '\0') { /* "../" */
*pEnd++ = '.'; /* add first dot, unchanged... */
++ppc; /* skip second dot, since it will */
} else { /* be "added" at end of if-block */
*pEnd++ = '_'; /* FAT doesn't allow null filename */
dotname = TRUE; /* bodies, so map .exrc -> _.exrc */
} /* (extra '_' now, "dot" below) */
} else if (dotname) { /* found a second dot, but still */
dotname = FALSE; /* have extra leading underscore: */
*pEnd = '\0'; /* remove it by shifting chars */
pEnd = *pEndFAT + 1; /* left one space (e.g., .p1.p2: */
while (pEnd[1]) { /* __p1 -> _p1_p2 -> _p1.p2 when */
*pEnd = pEnd[1]; /* finished) [opt.: since first */
++pEnd; /* two chars are same, can start */
} /* shifting at second position] */
}
last_dot = pEnd; /* point at last dot so far... */
*pEnd++ = '_'; /* convert dot to underscore for now */
break;
default:
*pEnd++ = (char)workch;
} /* end switch */
} /* end while loop */
*pEnd = '\0'; /* terminate buildpathFAT */
/* NOTE: keep in mind that pEnd points to the end of the path
* component, and *pEndFAT still points to the *beginning* of it...
* Also note that the algorithm does not try to get too fancy:
* if there are no dots already, the name either gets truncated
* at 8 characters or the last underscore is converted to a dot
* (only if more characters are saved that way). In no case is
* a dot inserted between existing characters.
*/
if (last_dot == (char *)NULL) { /* no dots: check for underscores... */
char *plu = strrchr(pBegin, '_'); /* pointer to last underscore */
if (plu == (char *)NULL) { /* no dots, no underscores: truncate at 8 */
*pEndFAT += 8; /* chars (or could insert '.' and keep 11?) */
if (*pEndFAT > pEnd)
*pEndFAT = pEnd; /* oops...didn't have 8 chars to truncate */
else
**pEndFAT = '\0';
} else if (MIN(plu - pBegin, 8) + MIN(pEnd - plu - 1, 3) > 8) {
last_dot = plu; /* be lazy: drop through to next if-blk */
} else if ((pEnd - *pEndFAT) > 8) {
*pEndFAT += 8; /* more fits into just basename than if */
**pEndFAT = '\0'; /* convert last underscore to dot */
} else
*pEndFAT = pEnd; /* whole thing fits into 8 chars or less */
}
if (last_dot != (char *)NULL) { /* one dot (or two, in the case of */
*last_dot = '.'; /* "..") is OK: put it back in */
if ((last_dot - pBegin) > 8) {
char *p=last_dot, *q=pBegin+8;
int i;
for (i = 0; (i < 4) && *p; ++i) /* too many chars in basename: */
*q++ = *p++; /* shift .ext left and trun- */
*q = '\0'; /* cate/terminate it */
*pEndFAT = q;
} else if ((pEnd - last_dot) > 4) { /* too many chars in extension */
*pEndFAT = last_dot + 4;
**pEndFAT = '\0';
} else
*pEndFAT = pEnd; /* filename is fine; point at terminating zero */
}
} /* end function map2fat() */
int SetLongNameEA(char *name, char *longname)
{
EAOP eaop;
FEALST fealst;
eaop.fpFEAList = (PFEALIST) &fealst;
eaop.fpGEAList = NULL;
eaop.oError = 0;
strcpy(fealst.szName, ".LONGNAME");
strcpy(fealst.szValue, longname);
fealst.cbList = sizeof(fealst) - CCHMAXPATH + strlen(fealst.szValue);
fealst.cbName = (BYTE) strlen(fealst.szName);
fealst.cbValue = sizeof(USHORT) * 2 + strlen(fealst.szValue);
#ifdef __32BIT__
fealst.oNext = 0;
#endif
fealst.fEA = 0;
fealst.eaType = 0xFFFD;
fealst.eaSize = strlen(fealst.szValue);
return DosSetPathInfo(name, FIL_QUERYEASIZE,
(PBYTE) &eaop, sizeof(eaop), 0);
}
/****************************/
/* Function close_outfile() */
/****************************/
void close_outfile() /* only for extracted files, not directories */
{
fclose(outfile);
/* set extra fields, both stored-in-zipfile and .LONGNAME flavors */
if (extra_field)
SetEAs(filename, extra_field);
if (longnameEA) {
#ifdef DEBUG
int e =
#endif
SetLongNameEA(filename, lastpathcomp);
Trace((stderr, "close_outfile: SetLongNameEA() returns %d\n", e));
free(lastpathcomp);
}
/* set date/time and permissions */
SetPathInfo(filename, lrec.last_mod_file_date,
lrec.last_mod_file_time, pInfo->file_attr);
} /* end function close_outfile() */
/******************************/
/* Function check_for_newer() */
/******************************/
int check_for_newer(filename) /* return 1 if existing file newer or equal; */
char *filename; /* 0 if older; -1 if doesn't exist yet */
{
long existing, archive;
if ((existing = GetFileTime(filename)) == -1)
return DOES_NOT_EXIST;
archive = ((long) lrec.last_mod_file_date) << 16 | lrec.last_mod_file_time;
return (existing >= archive);
}
#ifndef SFX
/*************************/
/* Function dateformat() */
/*************************/
int dateformat()
{
/*-----------------------------------------------------------------------------
For those operating systems which support it, this function returns a value
which tells how national convention says that numeric dates are displayed.
Return values are DF_YMD, DF_DMY and DF_MDY.
-----------------------------------------------------------------------------*/
switch (GetCountryInfo()) {
case 0:
return DF_MDY;
case 1:
return DF_DMY;
case 2:
return DF_YMD;
}
return DF_MDY; /* default if error */
} /* end function dateformat() */
/************************/
/* Function version() */
/************************/
void version()
{
extern char Far CompiledWith[];
#if defined(__IBMC__) || defined(__WATCOMC__) || defined(_MSC_VER)
char buf[80];
#endif
PRINTF(LoadFarString(CompiledWith),
#ifdef __GNUC__
# ifdef __EMX__ /* __EMX__ is defined as "1" only (sigh) */
"emx+gcc ", __VERSION__,
# else
"gcc/2 ", __VERSION__,
# endif
#else
#ifdef __IBMC__
"IBM C Set/2", (sprintf(buf, " %d.%02d", __IBMC__/100,__IBMC__%100), buf),
#else
#ifdef __WATCOMC__
"Watcom C", (sprintf(buf, " (__WATCOMC__ = %d)", __WATCOMC__), buf),
#else
#ifdef __TURBOC__
# ifdef __BORLANDC__
"Borland C++",
# if (__BORLANDC__ < 0x0200)
" 1.0",
# else
# if (__BORLANDC__ == 0x0200)
" 2.0",
# else
# if (__BORLANDC__ == 0x0400)
" 3.0",
# else
# if (__BORLANDC__ == 0x0410)
" 3.1",
# else
" later than 3.1",
# endif
# endif
# endif
# endif
# else
"Turbo C",
# if (__TURBOC__ >= 661)
"++ 1.0 or later",
# else
# if (__TURBOC__ == 661)
" 3.0?",
# else
# if (__TURBOC__ == 397)
" 2.0",
# else
" 1.0 or 1.5?",
# endif
# endif
# endif
# endif
#else
#ifdef MSC
"Microsoft C ",
# ifdef _MSC_VER
(sprintf(buf, "%d.%02d", _MSC_VER/100, _MSC_VER%100), buf),
# else
"5.1 or earlier",
# endif
#else
"unknown compiler", "",
#endif /* MSC */
#endif /* __TURBOC__ */
#endif /* __WATCOMC__ */
#endif /* __IBMC__ */
#endif /* __GNUC__ */
"OS/2",
/* GRR: does IBM C/2 identify itself as IBM rather than Microsoft? */
#if (defined(MSC) || (defined(__WATCOMC__) && !defined(__386__)))
# if defined(M_I86HM) || defined(__HUGE__)
" (16-bit, huge)",
# else
# if defined(M_I86LM) || defined(__LARGE__)
" (16-bit, large)",
# else
# if defined(M_I86MM) || defined(__MEDIUM__)
" (16-bit, medium)",
# else
# if defined(M_I86CM) || defined(__COMPACT__)
" (16-bit, compact)",
# else
# if defined(M_I86SM) || defined(__SMALL__)
" (16-bit, small)",
# else
# if defined(M_I86TM) || defined(__TINY__)
" (16-bit, tiny)",
# else
" (16-bit)",
# endif
# endif
# endif
# endif
# endif
# endif
#else
" 2.x (32-bit)",
#endif
#ifdef __DATE__
" on ", __DATE__
#else
"", ""
#endif
);
/* temporary debugging code for Borland compilers only */
#ifdef __TURBOC__
PRINTF("\t(__TURBOC__ = 0x%04x = %d)\n", __TURBOC__, __TURBOC__);
#ifdef __BORLANDC__
PRINTF("\t(__BORLANDC__ = 0x%04x)\n", __BORLANDC__);
#else
PRINTF("\tdebug(__BORLANDC__ not defined)\n");
#endif
#ifdef __TCPLUSPLUS__
PRINTF("\t(__TCPLUSPLUS__ = 0x%04x)\n", __TCPLUSPLUS__);
#else
PRINTF("\tdebug(__TCPLUSPLUS__ not defined)\n");
#endif
#ifdef __BCPLUSPLUS__
PRINTF("\t(__BCPLUSPLUS__ = 0x%04x)\n\n", __BCPLUSPLUS__);
#else
PRINTF("\tdebug(__BCPLUSPLUS__ not defined)\n\n");
#endif
#endif /* __TURBOC__ */
} /* end function version() */
#endif /* !SFX */
static unsigned char cUpperCase[256], cLowerCase[256];
static BOOL bInitialized;
/* Initialize the tables of upper- and lowercase characters, including
handling of country-dependent characters. */
static void InitNLS(void)
{
unsigned nCnt, nU;
COUNTRYCODE cc;
bInitialized = TRUE;
for ( nCnt = 0; nCnt < 256; nCnt++ )
cUpperCase[nCnt] = cLowerCase[nCnt] = (unsigned char) nCnt;
cc.country = cc.codepage = 0;
DosMapCase(sizeof(cUpperCase), &cc, (PCHAR) cUpperCase);
for ( nCnt = 0; nCnt < 256; nCnt++ )
{
nU = cUpperCase[nCnt];
if (nU != nCnt && cLowerCase[nU] == (unsigned char) nU)
cLowerCase[nU] = (unsigned char) nCnt;
}
for ( nCnt = 'A'; nCnt <= 'Z'; nCnt++ )
cLowerCase[nCnt] = (unsigned char) (nCnt - 'A' + 'a');
}
int IsUpperNLS(int nChr)
{
if (!bInitialized)
InitNLS();
return (cUpperCase[nChr] == (unsigned char) nChr);
}
int ToLowerNLS(int nChr)
{
if (!bInitialized)
InitNLS();
return cLowerCase[nChr];
}
char *StringLower(char *szArg)
{
unsigned char *szPtr;
if (!bInitialized)
InitNLS();
for ( szPtr = szArg; *szPtr; szPtr++ )
*szPtr = cLowerCase[*szPtr];
return szArg;
}
#if defined(__IBMC__) && defined(__DEBUG_ALLOC__)
void DebugMalloc(void)
{
_dump_allocated(0); /* print out debug malloc memory statistics */
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -