sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

utils.h (4606B)


      1 #ifndef UTILS_H_
      2 #define UTILS_H_
      3 
      4 #include <stdio.h>
      5 #include <stdint.h>
      6 
      7 // defines
      8 
      9 // printing size_t varies by compiler
     10 #if defined(_MSC_VER) || defined(__MINGW32__)
     11   #define SIZE_T_FORMAT "%Iu"
     12 #else
     13   #define SIZE_T_FORMAT "%zu"
     14 #endif
     15 
     16 #define KB 1024
     17 #define MB (1024 * KB)
     18 
     19 // number of elements in statically declared array
     20 #define DIM(S_ARR_) (sizeof(S_ARR_) / sizeof(S_ARR_[0]))
     21 
     22 #define MIN(A_, B_) ((A_) < (B_) ? (A_) : (B_))
     23 #define MAX(A_, B_) ((A_) > (B_) ? (A_) : (B_))
     24 
     25 // align value to N-byte boundary
     26 #define ALIGN(VAL_, ALIGNMENT_) (((VAL_) + ((ALIGNMENT_) - 1)) & ~((ALIGNMENT_) - 1))
     27 
     28 // read/write u32/16 big/little endian
     29 #define read_u32_be(buf) (unsigned int)(((buf)[0] << 24) + ((buf)[1] << 16) + ((buf)[2] << 8) + ((buf)[3]))
     30 #define read_u32_le(buf) (unsigned int)(((buf)[1] << 24) + ((buf)[0] << 16) + ((buf)[3] << 8) + ((buf)[2]))
     31 #define write_u32_be(buf, val) do { \
     32    (buf)[0] = ((val) >> 24) & 0xFF; \
     33    (buf)[1] = ((val) >> 16) & 0xFF; \
     34    (buf)[2] = ((val) >> 8) & 0xFF; \
     35    (buf)[3] = (val) & 0xFF; \
     36 } while(0)
     37 #define read_u16_be(buf) (((buf)[0] << 8) + ((buf)[1]))
     38 #define write_u16_be(buf, val) do { \
     39    (buf)[0] = ((val) >> 8) & 0xFF; \
     40    (buf)[1] = ((val)) & 0xFF; \
     41 } while(0)
     42 
     43 // Windows compatibility
     44 #if defined(_MSC_VER) || defined(__MINGW32__)
     45   #include <direct.h>
     46   #define mkdir(DIR_, PERM_) _mkdir(DIR_)
     47   #ifndef strcasecmp
     48     #define strcasecmp(A, B) stricmp(A, B)
     49   #endif
     50 #endif
     51 
     52 // typedefs
     53 
     54 #define MAX_DIR_FILES 128
     55 typedef struct
     56 {
     57    char *files[MAX_DIR_FILES];
     58    int count;
     59 } dir_list;
     60 
     61 typedef enum
     62 {
     63    ENCODING_RAW,
     64    ENCODING_U8,
     65    ENCODING_U16,
     66    ENCODING_U32,
     67    ENCODING_U64,
     68 } write_encoding;
     69 
     70 // global verbosity setting
     71 extern int g_verbosity;
     72 
     73 #define ERROR(...) fprintf(stderr, __VA_ARGS__)
     74 #define INFO(...) if (g_verbosity) printf(__VA_ARGS__)
     75 
     76 // functions
     77 
     78 // convert two bytes in big-endian to signed int
     79 int read_s16_be(unsigned char *buf);
     80 
     81 // convert four bytes in big-endian to float
     82 float read_f32_be(unsigned char *buf);
     83 
     84 // determine if value is power of 2
     85 // returns 1 if val is power of 2, 0 otherwise
     86 int is_power2(unsigned int val);
     87 
     88 // print buffer as raw binary, hex u8, hex u16, hex u32, hex u64. pads to encoding size
     89 // fp: file pointer
     90 // encoding: encoding type to use (see write_encoding)
     91 // buf: buffer to read bytes from
     92 // length: length of buffer to print
     93 int fprint_write_output(FILE *fp, write_encoding encoding, const uint8_t *buf, int length);
     94 
     95 // perform byteswapping to convert from v64 to z64 ordering
     96 void swap_bytes(unsigned char *data, long length);
     97 
     98 // reverse endian to convert from n64 to z64 ordering
     99 void reverse_endian(unsigned char *data, long length);
    100 
    101 // get size of file without opening it;
    102 // returns file size or negative on error
    103 long filesize(const char *file_name);
    104 
    105 // update file timestamp to now, creating it if it doesn't exist
    106 void touch_file(const char *filename);
    107 
    108 // read entire contents of file into buffer
    109 // returns file size or negative on error
    110 long read_file(const char *file_name, unsigned char **data);
    111 
    112 // write buffer to file
    113 // returns number of bytes written out or -1 on failure
    114 long write_file(const char *file_name, unsigned char *data, long length);
    115 
    116 // generate an output file name from input name by replacing file extension
    117 // in_name: input file name
    118 // out_name: buffer to write output name in
    119 // extension: new file extension to use
    120 void generate_filename(const char *in_name, char *out_name, char *extension);
    121 
    122 // extract base filename from file path
    123 // name: path to file
    124 // returns just the file name after the last '/'
    125 char *basename(const char *name);
    126 
    127 // make a directory if it doesn't exist
    128 // dir_name: name of the directory
    129 void make_dir(const char *dir_name);
    130 
    131 // copy a file from src_name to dst_name. will not make directories
    132 // src_name: source file name
    133 // dst_name: destination file name
    134 long copy_file(const char *src_name, const char *dst_name);
    135 
    136 // list a directory, optionally filtering files by extension
    137 // dir: directory to list files in
    138 // extension: extension to filter files by (NULL if no filtering)
    139 // list: output list and count
    140 void dir_list_ext(const char *dir, const char *extension, dir_list *list);
    141 
    142 // free associated date from a directory list
    143 // list: directory list filled in by dir_list_ext() call
    144 void dir_list_free(dir_list *list);
    145 
    146 // determine if a string ends with another string
    147 // str: string to check if ends with 'suffix'
    148 // suffix: string to see if 'str' ends with
    149 // returns 1 if 'str' ends with 'suffix'
    150 int str_ends_with(const char *str, const char *suffix);
    151 
    152 #endif // UTILS_H_