mirror of
https://github.com/joncampbell123/dosbox-x.git
synced 2025-05-08 02:53:03 +08:00
122 lines
3.7 KiB
C++
122 lines
3.7 KiB
C++
/*
|
|
* Copyright (C) 2002-2021 The DOSBox Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
|
|
#ifndef DOSBOX_SUPPORT_H
|
|
#define DOSBOX_SUPPORT_H
|
|
|
|
#include "dosbox.h"
|
|
|
|
#if defined (_MSC_VER) /* MS Visual C++ */
|
|
#define strcasecmp(a,b) stricmp(a,b)
|
|
#define strncasecmp(a,b,n) _strnicmp(a,b,n)
|
|
#endif
|
|
|
|
#define safe_strncpy(a,b,n) do { strncpy((a),(b),(size_t)((n)-1)); (a)[(size_t)((n)-1)] = 0; } while (0)
|
|
|
|
#ifdef HAVE_STRINGS_H
|
|
#include <strings.h>
|
|
#endif
|
|
|
|
char *strchr_dbcs(char *str, char ch);
|
|
char *strrchr_dbcs(char *str, char ch);
|
|
char *strtok_dbcs(char *s, const char *d);
|
|
void strreplace_dbcs(char * str,char o,char n);
|
|
void strreplace(char * str,char o,char n);
|
|
char *ltrim(char *str);
|
|
char *rtrim(char *str);
|
|
char *trim(char * str);
|
|
char * upcase(char * str);
|
|
char * lowcase(char * str);
|
|
std::vector<std::string> split(const std::string& str, char split_char);
|
|
char * StripArg(char *&cmd);
|
|
bool ScanCMDBool(char * cmd,char const * const check);
|
|
char * ScanCMDRemain(char * cmd);
|
|
char * StripWord(char *&line);
|
|
Bits ConvDecWord(char * word);
|
|
Bits ConvHexWord(char * word);
|
|
bool check_last_split_char(const char *name, size_t len, char split);
|
|
|
|
enum {
|
|
UTF8ERR_INVALID=-1,
|
|
UTF8ERR_NO_ROOM=-2
|
|
};
|
|
|
|
int utf8_encode(char **ptr,const char *fence,uint32_t code);
|
|
int utf8_decode(const char **ptr,const char *fence);
|
|
int utf16le_encode(char **ptr,const char *fence,uint32_t code);
|
|
int utf16le_decode(const char **ptr,const char *fence);
|
|
|
|
void trim(std::string& str);
|
|
void upcase(std::string &str);
|
|
void lowcase(std::string &str);
|
|
|
|
static inline bool is_power_of_2(Bitu val) {
|
|
return (val != 0) && ((val&(val-1)) == 0);
|
|
/* To explain: if val is a power of 2, then only one bit is set.
|
|
* Decrementing val would change that one bit to 0, and all bits to the right to 1.
|
|
* Example:
|
|
*
|
|
* Power of 2: val = 1024
|
|
*
|
|
* 1024 = 0000 0100 0000 0000
|
|
* AND 1023 = 0000 0011 1111 1111
|
|
* ------------------------------
|
|
* 0 = 0000 0000 0000 0000
|
|
*
|
|
* Non-power of 2: val = 713
|
|
*
|
|
* 713 = 0000 0010 1100 1001
|
|
* AND 712 = 0000 0010 1100 1000
|
|
* ------------------------------
|
|
* 712 = 0000 0010 1100 1000
|
|
*
|
|
* See how that works?
|
|
*
|
|
* For more info see https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2*/
|
|
}
|
|
|
|
/// Copy a string into C array
|
|
///
|
|
/// This function copies string pointed by src to fixed-size buffer dst.
|
|
/// At most N bytes from src are copied, where N is size of dst.
|
|
/// If exactly N bytes are copied, then terminating null byte is put
|
|
/// into buffer, thus buffer overrun is prevented.
|
|
///
|
|
/// Function returns pointer to buffer to be compatible with std::strcpy.
|
|
///
|
|
/// Usage:
|
|
///
|
|
/// char buffer[2];
|
|
/// safe_strcpy(buffer, "abc");
|
|
/// // buffer is filled with "a"
|
|
|
|
template<size_t N>
|
|
char * safe_strcpy(char (& dst)[N], const char * src) noexcept {
|
|
snprintf(dst, N, "%s", src);
|
|
return & dst[0];
|
|
}
|
|
|
|
template<size_t N>
|
|
char * safe_strcat(char (& dst)[N], const char * src) noexcept {
|
|
strncat(dst, src, N - strnlen(dst, N) - 1);
|
|
return & dst[0];
|
|
}
|
|
|
|
#endif
|