dect
/
asl
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
asl/bpemu.c

240 lines
5.3 KiB
C

/*****************************************************************************/
/* AS-Portierung */
/* */
/* Emulation einiger Borland-Pascal-Funktionen */
/* */
/* Historie: 20. 5.1996 Grundsteinlegung */
/* */
/*****************************************************************************/
#include "stdinc.h"
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include "strutil.h"
#include "bpemu.h"
#ifdef __MSDOS__
#include <dos.h>
#include <dir.h>
#endif
#if defined( __EMX__ ) || defined( __IBMC__ )
#include <os2.h>
#endif
char *FExpand(char *Src)
BEGIN
static String CurrentDir;
String Copy;
#ifdef DRSEP
String DrvPart;
#if defined( __EMX__ ) || defined( __IBMC__ )
ULONG DrvNum,Dummy;
#else
int DrvNum;
#endif
#endif
char *p,*p2;
strmaxcpy(Copy,Src,255);
#ifdef DRSEP
p=strchr(Copy,DRSEP);
if (p!=Nil)
BEGIN
memcpy(DrvPart,Copy,p-Copy); DrvPart[p-Copy]='\0'; strcpy(Copy,p+1);
END
else *DrvPart='\0';
#endif
#ifdef __MSDOS__
if (*DrvPart=='\0')
BEGIN
DrvNum=getdisk(); *DrvPart=DrvNum+'A'; DrvPart[1]='\0'; DrvNum++;
END
else DrvNum=toupper(*DrvPart)-'@';
getcurdir(DrvNum,CurrentDir);
#else
#if defined( __EMX__ ) || defined( __IBMC__ )
if (*DrvPart=='\0')
BEGIN
DosQueryCurrentDisk(&DrvNum,&Dummy);
*DrvPart=DrvNum+'@'; DrvPart[1]='\0';
END
else DrvNum=toupper(*DrvPart)-'@';
Dummy=255; DosQueryCurrentDir(DrvNum,(PBYTE) CurrentDir,&Dummy);
#else
#ifdef _WIN32
getcwd(CurrentDir,255);
for (p=CurrentDir; *p!='\0'; p++)
if (*p=='/') *p='\\';
#else
getcwd(CurrentDir,255);
#endif
#endif
#endif
if (CurrentDir[strlen(CurrentDir)-1]!=PATHSEP) strmaxcat(CurrentDir,SPATHSEP,255);
if (*CurrentDir!=PATHSEP) strmaxprep(CurrentDir,SPATHSEP,255);
if (*Copy==PATHSEP)
BEGIN
strmaxcpy(CurrentDir,SPATHSEP,255); strcpy(Copy,Copy+1);
END
#ifdef DRSEP
strmaxprep(CurrentDir,SDRSEP,255);
strmaxprep(CurrentDir,DrvPart,255);
#endif
while((p=strchr(Copy,PATHSEP))!=Nil)
BEGIN
*p='\0';
if (strcmp(Copy,".")==0);
else if ((strcmp(Copy,"..")==0) AND (strlen(CurrentDir)>1))
BEGIN
CurrentDir[strlen(CurrentDir)-1]='\0';
p2=strrchr(CurrentDir,PATHSEP); p2[1]='\0';
END
else
BEGIN
strmaxcat(CurrentDir,Copy,255); strmaxcat(CurrentDir,SPATHSEP,255);
END
strcpy(Copy,p+1);
END
strmaxcat(CurrentDir,Copy,255);
return CurrentDir;
END
char *FSearch(char *File, char *Path)
BEGIN
static String Component;
char *p,*start,Save='\0';
FILE *Dummy;
Boolean OK;
Dummy=fopen(File,"r"); OK=(Dummy!=Nil);
if (OK)
BEGIN
fclose(Dummy);
strmaxcpy(Component,File,255); return Component;
END
start=Path;
do
BEGIN
if (*start=='\0') break;
p=strchr(start,DIRSEP);
if (p!=Nil)
BEGIN
Save=(*p); *p='\0';
END
strmaxcpy(Component,start,255);
strmaxcat(Component,SPATHSEP,255);
strmaxcat(Component,File,255);
if (p!=Nil) *p=Save;
Dummy=fopen(Component,"r"); OK=(Dummy!=Nil);
if (OK)
BEGIN
fclose(Dummy);
return Component;
END
start=p+1;
END
while (p!=Nil);
*Component='\0'; return Component;
END
long FileSize(FILE *file)
BEGIN
long Save=ftell(file),Size;
fseek(file,0,SEEK_END);
Size=ftell(file);
fseek(file,Save,SEEK_SET);
return Size;
END
Byte Lo(Word inp)
BEGIN
return (inp&0xff);
END
Byte Hi(Word inp)
BEGIN
return ((inp>>8)&0xff);
END
Boolean Odd(int inp)
BEGIN
return ((inp&1)==1);
END
Boolean DirScan(char *Mask, charcallback callback)
BEGIN
char Name[1024];
#ifdef __MSDOS__
struct ffblk blk;
int res;
char *pos;
res=findfirst(Mask,&blk,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_LABEL|FA_DIREC|FA_ARCH);
if (res<0) return False;
pos=strrchr(Mask,PATHSEP); if (pos==Nil) pos=strrchr(Mask,DRSEP);
if (pos==Nil) pos=Mask; else pos++;
memcpy(Name,Mask,pos-Mask);
while (res==0)
BEGIN
if ((blk.ff_attrib&(FA_LABEL|FA_DIREC))==0)
BEGIN
strcpy(Name+(pos-Mask),blk.ff_name);
callback(Name);
END
res=findnext(&blk);
END
return True;
#else
#if defined ( __EMX__ ) || defined ( __IBMC__ )
HDIR hdir=1;
FILEFINDBUF3 buf;
ULONG rescnt;
USHORT res;
char *pos;
rescnt=1; res=DosFindFirst(Mask,&hdir,0x16,&buf,sizeof(buf),&rescnt,1);
if (res!=0) return False;
pos=strrchr(Mask,PATHSEP); if (pos==Nil) pos=strrchr(Mask,DRSEP);
if (pos==Nil) pos=Mask; else pos++;
memcpy(Name,Mask,pos-Mask);
while (res==0)
BEGIN
strcpy(Name+(pos-Mask),buf.achName); callback(Name);
res=DosFindNext(hdir,&buf,sizeof(buf),&rescnt);
END
return True;
#else
strmaxcpy(Name,Mask,255); callback(Name); return True;
#endif
#endif
END
LongInt GetFileTime(char *Name)
BEGIN
struct stat st;
if (stat(Name,&st)==-1) return 0;
else return st.st_mtime;
END
void bpemu_init(void)
BEGIN
END