]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - gmqcc.h
Wrapper around FILE to take advantage of MSVC "secure" CRT. We don't actually defend...
[xonotic/gmqcc.git] / gmqcc.h
diff --git a/gmqcc.h b/gmqcc.h
index 169995f31b93bb5142b39331f593854e2fb09816..1e4fe3b18f2701c7675a5cfe348270e153877825 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -26,8 +26,8 @@
 #include <limits.h>
 #include <stdlib.h>
 #include <string.h>
-#include <stdio.h>
 #include <stdarg.h>
+#include <stdio.h>
 #include <ctype.h>
 
 /*
  * of my time.
  */
 #ifdef _MSC_VER
-#      pragma warning(disable : 4244 ) /* conversion from 'int' to 'float', possible loss of data */
-#      pragma warning(disable : 4018 ) /* signed/unsigned mismatch                                */
-#      pragma warning(disable : 4996 ) /* This function or variable may be unsafe                 */
-#      pragma warning(disable : 4700 ) /* uninitialized local variable used                       */
-#      pragma warning(disable : 4129 ) /* unrecognized character secape sequence                  */
+#   pragma warning(disable : 4244 ) /* conversion from 'int' to 'float', possible loss of data */
+#   pragma warning(disable : 4018 ) /* signed/unsigned mismatch                                */
+#   pragma warning(disable : 4996 ) /* This function or variable may be unsafe                 */
 #endif
 
 #define GMQCC_VERSION_MAJOR 0
 #      define strtof(X, Y)          (float)(strtod(X, Y))
 #endif
 
-
 /*
  * Very roboust way at determining endianess at compile time: this handles
  * almost every possible situation.  Otherwise a runtime check has to be
 #   endif
 #endif
 #if !defined (PLATFORM_BYTE_ORDER)
-#   if   defined (__aplha__) || defined (__aplha)    || defined (i386)       || \
+#   if   defined (__alpha__) || defined (__alpha)    || defined (i386)       || \
          defined (__i386__)  || defined (_M_I86)     || defined (_M_IX86)    || \
          defined (__OS2__)   || defined (sun386)     || defined (__TURBOC__) || \
          defined (vax)       || defined (vms)        || defined (VMS)        || \
 /*===================================================================*/
 /*=========================== util.c ================================*/
 /*===================================================================*/
-FILE *util_fopen(const char *filename, const char *mode);
-
 void *util_memory_a      (size_t,       unsigned int, const char *);
 void  util_memory_d      (void       *, unsigned int, const char *);
 void *util_memory_r      (void       *, size_t,       unsigned int, const char *);
@@ -257,21 +252,14 @@ void  util_meminfo       ();
 bool  util_filexists     (const char *);
 bool  util_strupper      (const char *);
 bool  util_strdigit      (const char *);
-bool  util_strncmpexact  (const char *, const char *, size_t);
 char *util_strdup        (const char *);
-char *util_strrq         (const char *);
-char *util_strrnl        (const char *);
-char *util_strsws        (const char *);
-char *util_strchp        (const char *, const char *);
 void  util_debug         (const char *, const char *, ...);
-int   util_getline       (char **, size_t *, FILE *);
 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);
 
 uint16_t util_crc16(uint16_t crc, const char *data, size_t len);
-uint32_t util_crc32(uint32_t crc, const char *data, size_t len);
 
 /*
  * If we're compiling as C++ code we need to fix some subtle issues regarding casts between mem_a/mem_d
@@ -311,13 +299,7 @@ uint32_t util_crc32(uint32_t crc, const char *data, size_t len);
 #    define mem_r(x, n) util_memory_r((void*)(x), (n), __LINE__, __FILE__)
 #endif
 
-/*
- * TODO: make these safer to use.  Currently this only works on
- * x86 and x86_64, some systems will likely not like this. Such
- * as BE systems. (and clean this up to use a structure ... )
- */
-#define FLT2INT(Y) *((int32_t*)&(Y))
-#define INT2FLT(Y) *((float  *)&(Y))
+/** TODO: Cleanup this whole mess {{{ */
 
 /* New flexible vector implementation from Dale */
 #define _vec_raw(A) (((size_t*)(void*)(A)) - 2)
@@ -328,6 +310,7 @@ uint32_t util_crc32(uint32_t crc, const char *data, size_t len);
 #define _vec_forcegrow(A,N) _util_vec_grow(((void**)&(A)), (N), sizeof(*(A)))
 #define _vec_remove(A,S,I,N) (memmove((char*)(A)+(I)*(S),(char*)(A)+((I)+(N))*(S),(S)*(_vec_end(A)-(I)-(N))), _vec_end(A)-=(N))
 void _util_vec_grow(void **a, size_t i, size_t s);
+
 /* exposed interface */
 #define vec_free(A)          ((A) ? (mem_d((void*)_vec_raw(A)), (A) = NULL) : 0)
 #define vec_push(A,V)        (_vec_mightgrow((A),1), (A)[_vec_end(A)++] = (V))
@@ -337,6 +320,7 @@ void _util_vec_grow(void **a, size_t i, size_t s);
 #define vec_append(A,N,S)    memcpy(vec_add((A), (N)), (S), N * sizeof(*(S)))
 #define vec_remove(A,I,N)    _vec_remove((A), sizeof(*(A)), (I), (N))
 #define vec_pop(A)           (_vec_end(A)-=1)
+
 /* these are supposed to NOT reallocate */
 #define vec_shrinkto(A,N)    (_vec_end(A) = (N))
 #define vec_shrinkby(A,N)    (_vec_end(A) -= (N))
@@ -351,6 +335,8 @@ void _util_vec_grow(void **a, size_t i, size_t s);
         }                      \
     } while(0)
 
+/** }}} */
+
 typedef struct hash_table_t {
     size_t                size;
     struct hash_node_t **table;
@@ -393,10 +379,31 @@ void          util_htdel (hash_table_t *ht);
 size_t        util_hthash(hash_table_t *ht, const char *key);
 void         *util_htgeth(hash_table_t *ht, const char *key, size_t hash);
 void          util_htseth(hash_table_t *ht, const char *key, size_t hash, void *value);
+
+/*===================================================================*/
+/*============================ file.c ===============================*/
+/*===================================================================*/
+void   GMQCC_INLINE file_close  (FILE *);
+
+int    GMQCC_INLINE file_error  (FILE *);
+int    GMQCC_INLINE file_getc   (FILE *);
+int    GMQCC_INLINE file_printf (FILE *, const char *, ...);
+int    GMQCC_INLINE file_puts   (FILE *, const char *);
+int    GMQCC_INLINE file_seek   (FILE *, long int, int);
+
+size_t GMQCC_INLINE file_read   (void *,        size_t, size_t, FILE *);
+size_t GMQCC_INLINE file_write  (const void *,  size_t, size_t, FILE *);
+
+FILE*  GMQCC_INLINE file_open   (const char *, const char *);
+
+int   /*NO_INLINE*/ file_getline(char  **, size_t *, FILE *);
+
+
 /*===================================================================*/
 /*=========================== code.c ================================*/
 /*===================================================================*/
 
+/* TODO: cleanup */
 /* Note: if you change the order, fix type_sizeof in ir.c */
 enum {
     TYPE_VOID     ,
@@ -816,6 +823,7 @@ vector  vec3_mulvf(vector, float);
 /*============================= exec.c ==============================*/
 /*===================================================================*/
 
+/* TODO: cleanup */
 /*
  * Darkplaces has (or will have) a 64 bit prog loader
  * where the 32 bit qc program is autoconverted on load.
@@ -920,20 +928,22 @@ bool parser_compile_file  (const char *filename);
 bool parser_compile_string(const char *name, const char *str);
 bool parser_finish        (const char *output);
 void parser_cleanup       ();
+
+/* TODO: make compile_string accept len and remove this */
 /* There's really no need to strlen() preprocessed files */
 bool parser_compile_string_len(const char *name, const char *str, size_t len);
 
 /*===================================================================*/
 /*====================== ftepp.c commandline ========================*/
 /*===================================================================*/
-bool ftepp_init             ();
-bool ftepp_preprocess_file  (const char *filename);
-bool ftepp_preprocess_string(const char *name, const char *str);
-void ftepp_finish           ();
-const char *ftepp_get       ();
-void ftepp_flush            ();
-void ftepp_add_define       (const char *source, const char *name);
-void ftepp_add_macro        (const char *name,   const char *value);
+bool        ftepp_init             ();
+bool        ftepp_preprocess_file  (const char *filename);
+bool        ftepp_preprocess_string(const char *name, const char *str);
+void        ftepp_finish           ();
+const char *ftepp_get              ();
+void        ftepp_flush            ();
+void        ftepp_add_define       (const char *source, const char *name);
+void        ftepp_add_macro        (const char *name,   const char *value);
 
 /*===================================================================*/
 /*======================= main.c commandline ========================*/
@@ -1025,6 +1035,7 @@ typedef enum {
     COMPILER_GMQCC    /* this   QuakeC */
 } opts_std_t;
 
+/* TODO: cleanup this */
 typedef struct {
     uint32_t    O;              /* -Ox           */
     const char *output;         /* -o file       */
@@ -1047,7 +1058,6 @@ typedef struct {
 
 extern opts_cmd_t opts;
 
-/*===================================================================*/
 #define OPTS_FLAG(i)         (!! (opts.flags       [(i)/32] & (1<< ((i)%32))))
 #define OPTS_WARN(i)         (!! (opts.warn        [(i)/32] & (1<< ((i)%32))))
 #define OPTS_WERROR(i)       (!! (opts.werror      [(i)/32] & (1<< ((i)%32))))