# include <dirent.h>
#endif /*! _WIN32 && !defined(__MINGW32__) */
-/*===================================================================*/
-/*=========================== stat.c ================================*/
-/*===================================================================*/
+/* stat.c */
void stat_info (void);
char *stat_mem_strdup (const char *, size_t, const char *, bool);
void *stat_mem_reallocate(void *, size_t, size_t, const char *);
#define util_strdup(SRC) stat_mem_strdup((char*)(SRC), __LINE__, __FILE__, false)
#define util_strdupe(SRC) stat_mem_strdup((char*)(SRC), __LINE__, __FILE__, true)
-/*===================================================================*/
-/*=========================== util.c ================================*/
-/*===================================================================*/
+/* util.c */
/*
* Microsoft implements against the spec versions of ctype.h. Which
#define util_isprint(a) (((unsigned)(a)-0x20) < 0x5F)
#define util_isspace(a) (((a) >= 9 && (a) <= 13) || (a) == ' ')
-bool util_filexists (const char *);
bool util_strupper (const char *);
bool util_strdigit (const char *);
-void util_endianswap (void *, size_t, unsigned int);
+void util_endianswap (void *, size_t, unsigned int);
size_t util_strtocmd (const char *, char *, size_t);
size_t util_strtononcmd (const char *, char *, size_t);
#define vec_append(A,N,S) ((void)(memcpy(vec_add((A), (N)), (S), (N) * sizeof(*(S)))))
#define vec_remove(A,I,N) ((void)(memmove((A)+(I),(A)+((I)+(N)),sizeof(*(A))*(vec_meta(A)->used-(I)-(N))),vec_meta(A)->used-=(N)))
-typedef struct correct_trie_s {
- void *value;
- struct correct_trie_s *entries;
-} correct_trie_t;
-
-correct_trie_t* correct_trie_new(void);
-
typedef struct hash_table_s {
size_t size;
struct hash_node_t **table;
void *util_htget (hash_table_t *ht, const char *key);
void *util_htgeth(hash_table_t *ht, const char *key, size_t hash);
-/*===================================================================*/
-/*============================ file.c ===============================*/
-/*===================================================================*/
-/* file handling */
+
+/* fs.c */
void fs_file_close (FILE *);
int fs_file_error (FILE *);
int fs_file_getc (FILE *);
FILE *fs_file_open (const char *, const char *);
int fs_file_getline(char **, size_t *, FILE *);
-/* directory handling */
int fs_dir_make (const char *);
DIR *fs_dir_open (const char *);
int fs_dir_close (DIR *);
struct dirent *fs_dir_read (DIR *);
-/*===================================================================*/
-/*=========================== correct.c =============================*/
-/*===================================================================*/
+/* correct.c */
+typedef struct correct_trie_s {
+ void *value;
+ struct correct_trie_s *entries;
+} correct_trie_t;
+
+correct_trie_t* correct_trie_new(void);
+
typedef struct {
char ***edits;
size_t **lens;
void correct_init(correction_t *);
void correct_free(correction_t *);
-/*===================================================================*/
-/*=========================== code.c ================================*/
-/*===================================================================*/
+
+/* code.c */
/* Note: if you change the order, fix type_sizeof in ir.c */
enum {
void code_pop_statement (code_t *);
-/*===================================================================*/
-/*============================ con.c ================================*/
-/*===================================================================*/
+/* conout.c */
enum {
CON_BLACK = 30,
CON_RED,
bool GMQCC_WARN vcompile_warning(lex_ctx_t ctx, int warntype, const char *fmt, va_list ap);
void compile_show_werrors(void);
-/*===================================================================*/
-/*============================= ir.c ================================*/
-/*===================================================================*/
-
+/* ir.c */
+/* TODO: cleanup */
enum store_types {
store_global,
store_local, /* local, assignable for now, should get promoted later */
qcfloat_t x, y, z;
} vec3_t;
-/*===================================================================*/
-/*============================= exec.c ==============================*/
-/*===================================================================*/
+/* exec.c */
/* TODO: cleanup */
/*
qcint_t prog_tempstring(qc_program_t *prog, const char *_str);
-/*===================================================================*/
-/*===================== parser.c commandline ========================*/
-/*===================================================================*/
+/* parser.c */
struct parser_s;
struct parser_s *parser_create (void);
bool parser_compile_file (struct parser_s *parser, const char *);
bool parser_finish (struct parser_s *parser, const char *);
void parser_cleanup (struct parser_s *parser);
-/*===================================================================*/
-/*====================== ftepp.c commandline ========================*/
-/*===================================================================*/
+/* ftepp.c */
struct ftepp_s;
struct ftepp_s *ftepp_create (void);
bool ftepp_preprocess_file (struct ftepp_s *ftepp, const char *filename);
void ftepp_add_define (struct ftepp_s *ftepp, const char *source, const char *name);
void ftepp_add_macro (struct ftepp_s *ftepp, const char *name, const char *value);
-/*===================================================================*/
-/*======================= main.c commandline ========================*/
-/*===================================================================*/
+/* main.c */
#if 1
/* Helpers to allow for a whole lot of flags. Otherwise we'd limit
#define LONGBIT_SET(B, I) ((B) = (I))
#endif
-/*===================================================================*/
-/*============================= utf8.c ==============================*/
-/*===================================================================*/
+/* utf.8 */
typedef long utf8ch_t;
int utf8_from(char *, utf8ch_t);
int utf8_to(utf8ch_t *, const unsigned char *, size_t);
-/*===================================================================*/
-/*============================= opts.c ==============================*/
-/*===================================================================*/
+/* opts.c */
typedef struct {
const char *name;
longbit bit;
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#include "gmqcc.h"
+#include <string.h>
+#include <stdlib.h>
+#include <io.h>
+
+#include "platform.h"
#define CTIME_BUFFER 64
#define GETENV_BUFFER 4096
strerror_s(buffer, STRERROR_BUFFER, err);
return buffer;
}
+
+FILE *platform_fopen(const char *filename, const char *mode) {
+ FILE *handle;
+ return (fopen_s(&handle, filename, mode) != 0) ? NULL : handle;
+}
+
+size_t platform_fread(void *ptr, size_t size, size_t count, FILE *stream) {
+ return fread_s(ptr, size, size, count, stream);
+}
+
+size_t platform_fwrite(const void *ptr, size_t size, size_t count, FILE *stream) {
+ return fwrite(ptr, size, count, stream);
+}
+
+int platform_vfprintf(FILE *stream, const char *format, va_list arg) {
+ return vfprintf_s(stream, format, arg);
+}
+
+int platform_fclose(FILE *stream) {
+ return fclose(stream);
+}
+
+int platform_ferror(FILE *stream) {
+ return ferror(stream);
+}
+
+int platform_fgetc(FILE *stream) {
+ return fgetc(stream);
+}
+
+int platform_fputs(const char *str, FILE *stream) {
+ return fputs(str, stream);
+}
+
+int platform_fseek(FILE *stream, long offset, int origin) {
+ return fseek(stream, offset, origin);
+}
+
+long platform_ftell(FILE *stream) {
+ return ftell(stream);
+}
+
+int platform_mkdir(const char *path, int mode) {
+ return mkdir(path, mode);
+}
+
+DIR *platform_opendir(const char *path) {
+ return opendir(path);
+}
+
+int platform_closedir(DIR *dir) {
+ return closedir(dir);
+}
+
+struct dirent *platform_readdir(DIR *dir) {
+ return readdir(dir);
+}
+
+int platform_istty(int fd) {
+ return _istty(fd);
+}