namespace sys;
default:
+#define set _set
#define uint _uint
#define File _File
+#define strlen _strlen
+#undef __BLOCKS__
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#if defined(__WIN32__)
#define WIN32_LEAN_AND_MEAN
+#define String String_
#include <windows.h>
+#undef String
#include <io.h>
BOOL WINAPI GetVolumePathName(LPCTSTR lpszFileName,LPTSTR lpszVolumePathName,DWORD cchBufferLength);
#endif //#ifndef ECERE_BOOTSTRAP
private:
+#undef set
#undef uint
#undef File
+#undef strlen
import "System"
// IMPLEMENTATION OF THESE IS IN _File.c
default:
+FILE *eC_stdin(void);
+FILE *eC_stdout(void);
+
uint FILE_GetSize(FILE * input);
bool FILE_Lock(FILE * input, FILE * output, FileLock type, uint64 start, uint64 length, bool wait);
void FILE_set_buffered(FILE * input, FILE * output, bool value);
}
};
+public class FileSize64 : uint64
+{
+ int OnCompare(FileSize64 data2)
+ {
+ int result = 0;
+ if(&this && &data2)
+ {
+ if(this > data2)
+ result = 1;
+ else if(this < data2)
+ result = -1;
+ }
+ return result;
+ }
+
+ char * OnGetString(char * string, void * fieldData, bool * needClass)
+ {
+ PrintBigSize(string, this, 2);
+ return string;
+ }
+
+ bool OnGetDataFromString(char * string)
+ {
+ char * end;
+ double value = strtod(string, &end);
+ uint64 multiplier = 1;
+ if(strstr(end, "PB") || strstr(end, "pb")) multiplier = (uint64)1024 * 1024 * 1024 * 1024;
+ else if(strstr(end, "TB") || strstr(end, "tb")) multiplier = (uint64)1024 * 1024 * 1024 * 1024;
+ else if(strstr(end, "GB") || strstr(end, "gb")) multiplier = (uint64)1024 * 1024 * 1024;
+ else if(strstr(end, "MB") || strstr(end, "mb")) multiplier = (uint64)1024 * 1024;
+ else if(strstr(end, "KB") || strstr(end, "kb")) multiplier = 1024;
+
+ this = (uint64)(multiplier * value);
+ return true;
+ }
+};
+
class FileSystem
{
virtual File ::Open(char * archive, char * name, FileOpenMode mode);
public enum FileSeekMode { start, current, end };
#if !defined(ECERE_BOOTSTRAP)
-static FileDialog fileDialog { text = "Select File" };
+static FileDialog fileDialog { text = $"Select File" };
#endif
public enum FileLock
Window editData = class::OnEdit(dataBox, obsolete, x + 24, y, w - 48, h, userData);
Button load
{
- dataBox, inactive = true, text = "Imp", hotKey = f2,
+ dataBox, inactive = true, text = $"Import"."Imp", hotKey = f2,
position = { Max(x + 24, x + w - 24), y }, size = { 24, h };
bool DataBox::NotifyClicked(Button button, int x, int y, Modifiers mods)
};
Button save
{
- dataBox, inactive = true, text = "Exp", hotKey = f2,
+ dataBox, inactive = true, text = $"Export"."Exp", hotKey = f2,
position = { Max(x + 24, x + w - 48), y }, size = { 24, h };
bool DataBox::NotifyClicked(Button button, int x, int y, Modifiers mods)
virtual uint Tell(void)
{
- return input ? ftell(input) : ftell(output);
+ return (uint)(input ? ftell(input) : ftell(output));
}
virtual int Read(void * buffer, uint size, uint count)
int Printf(char * format, ...)
{
int result = 0;
- char text[MAX_F_STRING];
- va_list args;
- va_start(args, format);
- vsprintf(text, format, args);
- if(Puts(text))
- result = strlen(text);
- va_end(args);
+ if(format)
+ {
+ char text[MAX_F_STRING];
+ va_list args;
+ va_start(args, format);
+ vsnprintf(text, sizeof(text), format, args);
+ text[sizeof(text)-1] = 0;
+ if(Puts(text))
+ result = strlen(text);
+ va_end(args);
+ }
return result;
}
{
char string[32];
GetString(string, sizeof(string));
- return strtoul(string, null, 16);
+ return (uint)strtoul(string, null, 16);
}
float GetFloat(void)
break;
}
}
+ delete f;
}
Seek(0, start);
return result;
}
+
+#if 0
+ virtual bool Open(char * fileName, FileOpenMode mode)
+ {
+ bool result = false;
+ if(this)
+ {
+ FILE_FileOpen(fileName, mode, &input, &output);
+
+ //file.mode = mode;
+ if(!input && !output);
+ else
+ {
+ openCount++;
+ result = true;
+ // TESTING ENABLING FILE BUFFERING BY DEFAULT... DOCUMENT ANY ISSUE
+ /*
+ if(file.input)
+ setvbuf(file.input, null, _IONBF, 0);
+ else
+ setvbuf(file.output, null, _IONBF, 0);
+ */
+ }
+ //if(!result)
+ {
+ /* TOFIX:
+ LogErrorCode((mode == Read || mode == ReadWrite) ?
+ ERR_FILE_NOT_FOUND : ERR_FILE_WRITE_FAILED, fileName);
+ */
+ }
+ }
+ return result;
+ }
+#endif
+
+ virtual void Close()
+ {
+ CloseOutput();
+ CloseInput();
+ }
}
+#if defined(__WIN32__)
+default extern intptr_t stdinHandle;
+default extern intptr_t stdoutHandle;
+#endif
+
public class ConsoleFile : File
{
- input = stdin;
- output = stdout;
+ input = eC_stdin();
+ output = eC_stdout();
+
+#if defined(__WIN32__)
+ void CloseInput()
+ {
+ CloseHandle((HANDLE)stdinHandle);
+ }
+ /*
+ void CloseOutput()
+ {
+ CloseHandle((HANDLE)stdoutHandle);
+ }*/
+#endif
+
~ConsoleFile()
{
input = null;
file.stats.attribs.isSystem = (winFile.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? true : false;
file.stats.attribs.isTemporary = (winFile.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) ? true : false;
file.stats.attribs.isDirectory = (winFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false;
+ file.stats.attribs.isFile = !(winFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
strcpy(d.name, path);
file.stats.accessed = Win32FileTimeToTimeStamp(&winFile.ftLastAccessTime);
if(path[0])
{
strcpy(file.path, path);
- strcat(file.path, DIR_SEPS);
+ if(path[1])
+ strcat(file.path, DIR_SEPS);
}
strcpy(file.name,de->d_name);
strcat(file.path, file.name);
- stat(file.path, &s);
- file.stats.attribs = (s.st_mode&S_IFDIR) ? FileAttribs { isDirectory = true } : FileAttribs { isFile = true };
- file.stats.size = s.st_size;
- file.stats.accessed = s.st_atime;
- file.stats.modified = s.st_mtime;
- file.stats.created = s.st_ctime;
-
+ if(!stat(file.path, &s))
+ {
+ file.stats.attribs = (s.st_mode&S_IFDIR) ? FileAttribs { isDirectory = true } : FileAttribs { isFile = true };
+ file.stats.size = (FileSize)s.st_size;
+ file.stats.accessed = s.st_atime;
+ file.stats.modified = s.st_mtime;
+ file.stats.created = s.st_ctime;
+ }
strcpy(d.name, path);
result = file;
stats.attribs.isSystem = (winFile.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? true : false;
stats.attribs.isTemporary = (winFile.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) ? true : false;
stats.attribs.isDirectory = (winFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false;
+ stats.attribs.isFile = !(winFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
stats.size = winFile.nFileSizeLow;
stats.accessed = Win32FileTimeToTimeStamp(&winFile.ftLastAccessTime);
{
strcpy(name,de->d_name);
strcpy(path, d.name);
- if(d.name[0] && d.name[0])
+ if(d.name[0] && d.name[1])
strcat(path, DIR_SEPS);
strcat(path, name);
- stat(path, &s);
- stats.attribs = FileAttribs { };
- if(s.st_mode & S_IFDIR) stats.attribs.isDirectory = true;
- stats.size = s.st_size;
- stats.accessed = s.st_atime;
- stats.modified = s.st_mtime;
- stats.created = s.st_ctime;
+ if(!stat(path, &s))
+ {
+ stats.attribs = FileAttribs { };
+ stats.attribs = (s.st_mode&S_IFDIR) ? FileAttribs { isDirectory = true } : FileAttribs { isFile = true };
+ stats.size = (FileSize)s.st_size;
+ stats.accessed = s.st_atime;
+ stats.modified = s.st_mtime;
+ stats.created = s.st_ctime;
+ }
result = this;
}
else
#endif
#endif
}
+
+public void MakeSlashPath(char * p)
+{
+ FileFixCase(p);
+#ifdef WIN32
+ ChangeCh(p, '\\', '/');
+#endif
+}
+
+public void MakeSystemPath(char * p)
+{
+ FileFixCase(p);
+}
+
+public char * CopySystemPath(char * p)
+{
+ char * d = CopyString(p);
+ if(d)
+ MakeSystemPath(d);
+ return d;
+}
+
+public char * CopyUnixPath(char * p)
+{
+ char * d = CopyString(p);
+ if(d)
+ MakeSlashPath(d);
+ return d;
+}
+
+public char * GetSystemPathBuffer(char * d, char * p)
+{
+ if(d != p)
+ strcpy(d, p ? p : "");
+ MakeSystemPath(d);
+ return d;
+}
+
+public char * GetSlashPathBuffer(char * d, char * p)
+{
+ if(d != p)
+ strcpy(d, p ? p : "");
+ MakeSlashPath(d);
+ return d;
+}