2011-10-02 10:05:45 +00:00
|
|
|
#ifdef NALL_STRING_INTERNAL_HPP
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
namespace nall {
|
2011-10-02 10:05:45 +00:00
|
|
|
struct cstring;
|
2011-09-29 12:08:22 +00:00
|
|
|
struct string;
|
|
|
|
struct lstring;
|
2011-03-17 10:39:55 +00:00
|
|
|
template<typename T> inline const char* to_string(T);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2011-10-02 10:05:45 +00:00
|
|
|
struct cstring {
|
|
|
|
inline operator const char*() const;
|
|
|
|
inline unsigned length() const;
|
|
|
|
inline bool operator==(const char*) const;
|
|
|
|
inline bool operator!=(const char*) const;
|
|
|
|
inline optional<unsigned> position(const char *key) const;
|
|
|
|
inline optional<unsigned> iposition(const char *key) const;
|
|
|
|
inline cstring& operator=(const char *data);
|
|
|
|
inline cstring(const char *data);
|
|
|
|
inline cstring();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
const char *data;
|
|
|
|
};
|
|
|
|
|
2011-09-29 12:08:22 +00:00
|
|
|
struct string {
|
2012-08-07 13:28:00 +00:00
|
|
|
inline static string read(const string &filename);
|
|
|
|
|
2010-08-09 13:28:56 +00:00
|
|
|
inline void reserve(unsigned);
|
2011-12-12 10:59:53 +00:00
|
|
|
inline bool empty() const;
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2011-03-17 10:39:55 +00:00
|
|
|
template<typename... Args> inline string& assign(Args&&... args);
|
|
|
|
template<typename... Args> inline string& append(Args&&... args);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2011-01-29 09:48:44 +00:00
|
|
|
inline bool readfile(const string&);
|
2010-10-14 10:07:38 +00:00
|
|
|
|
2011-08-06 14:03:52 +00:00
|
|
|
template<unsigned Limit = 0> inline string& replace(const char*, const char*);
|
|
|
|
template<unsigned Limit = 0> inline string& ireplace(const char*, const char*);
|
|
|
|
template<unsigned Limit = 0> inline string& qreplace(const char*, const char*);
|
|
|
|
template<unsigned Limit = 0> inline string& iqreplace(const char*, const char*);
|
2010-10-14 10:07:38 +00:00
|
|
|
|
|
|
|
inline unsigned length() const;
|
2011-12-12 10:59:53 +00:00
|
|
|
inline unsigned capacity() const;
|
2010-10-14 10:07:38 +00:00
|
|
|
|
2011-10-16 09:44:48 +00:00
|
|
|
template<unsigned Limit = 0> inline lstring split(const char*) const;
|
|
|
|
template<unsigned Limit = 0> inline lstring isplit(const char*) const;
|
|
|
|
template<unsigned Limit = 0> inline lstring qsplit(const char*) const;
|
|
|
|
template<unsigned Limit = 0> inline lstring iqsplit(const char*) const;
|
|
|
|
|
2010-10-14 10:07:38 +00:00
|
|
|
inline bool equals(const char*) const;
|
|
|
|
inline bool iequals(const char*) const;
|
|
|
|
|
|
|
|
inline bool wildcard(const char*) const;
|
|
|
|
inline bool iwildcard(const char*) const;
|
|
|
|
|
|
|
|
inline bool beginswith(const char*) const;
|
|
|
|
inline bool ibeginswith(const char*) const;
|
|
|
|
inline bool endswith(const char*) const;
|
|
|
|
inline bool iendswith(const char*) const;
|
|
|
|
|
|
|
|
inline string& lower();
|
|
|
|
inline string& upper();
|
2011-07-07 12:59:26 +00:00
|
|
|
inline string& qlower();
|
|
|
|
inline string& qupper();
|
2010-10-14 10:07:38 +00:00
|
|
|
inline string& transform(const char *before, const char *after);
|
|
|
|
|
|
|
|
template<unsigned limit = 0> inline string& ltrim(const char *key = " ");
|
|
|
|
template<unsigned limit = 0> inline string& rtrim(const char *key = " ");
|
2011-08-06 14:03:52 +00:00
|
|
|
template<unsigned limit = 0> inline string& trim(const char *key = " ", const char *rkey = 0);
|
2010-10-14 10:07:38 +00:00
|
|
|
|
|
|
|
inline optional<unsigned> position(const char *key) const;
|
2011-08-06 14:03:52 +00:00
|
|
|
inline optional<unsigned> iposition(const char *key) const;
|
2010-10-14 10:07:38 +00:00
|
|
|
inline optional<unsigned> qposition(const char *key) const;
|
2011-08-06 14:03:52 +00:00
|
|
|
inline optional<unsigned> iqposition(const char *key) const;
|
2010-10-14 10:07:38 +00:00
|
|
|
|
2010-08-09 13:28:56 +00:00
|
|
|
inline operator const char*() const;
|
|
|
|
inline char* operator()();
|
|
|
|
inline char& operator[](int);
|
|
|
|
|
|
|
|
inline bool operator==(const char*) const;
|
|
|
|
inline bool operator!=(const char*) const;
|
|
|
|
inline bool operator< (const char*) const;
|
|
|
|
inline bool operator<=(const char*) const;
|
|
|
|
inline bool operator> (const char*) const;
|
|
|
|
inline bool operator>=(const char*) const;
|
|
|
|
|
|
|
|
inline string& operator=(const string&);
|
|
|
|
inline string& operator=(string&&);
|
|
|
|
|
2010-09-22 12:49:49 +00:00
|
|
|
template<typename... Args> inline string(Args&&... args);
|
2010-08-09 13:28:56 +00:00
|
|
|
inline string(const string&);
|
|
|
|
inline string(string&&);
|
|
|
|
inline ~string();
|
|
|
|
|
2011-09-27 11:55:02 +00:00
|
|
|
inline char* begin() { return &data[0]; }
|
|
|
|
inline char* end() { return &data[length()]; }
|
|
|
|
inline const char* begin() const { return &data[0]; }
|
|
|
|
inline const char* end() const { return &data[length()]; }
|
|
|
|
|
2011-08-06 14:03:52 +00:00
|
|
|
//internal functions
|
|
|
|
inline string& assign_(const char*);
|
|
|
|
inline string& append_(const char*);
|
|
|
|
|
2010-08-09 13:28:56 +00:00
|
|
|
protected:
|
|
|
|
char *data;
|
|
|
|
unsigned size;
|
|
|
|
|
2011-08-06 14:03:52 +00:00
|
|
|
template<unsigned Limit, bool Insensitive, bool Quoted> inline string& ureplace(const char*, const char*);
|
|
|
|
|
2010-08-09 13:28:56 +00:00
|
|
|
#if defined(QSTRING_H)
|
|
|
|
public:
|
|
|
|
inline operator QString() const;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2011-10-16 09:44:48 +00:00
|
|
|
struct lstring : vector<string> {
|
2010-10-14 10:07:38 +00:00
|
|
|
inline optional<unsigned> find(const char*) const;
|
Update to v087r30 release.
byuu says:
Changelog:
- DMA channel masks added (some are 27-bit source/target and some are
14-bit length -- hooray, varuint_t class.)
- No more state.pending flags. Instead, we set dma.pending flag when we
want a transfer (fixes GBA Video - Pokemon audio) [Cydrak]
- fixed OBJ Vmosaic [Cydrak, krom]
- OBJ cannot read <=0x13fff in BG modes 3-5 (fixes the garbled tile at
the top-left of some games)
- DMA timing should be much closer to hardware now, but probably not
perfect
- PPU frame blending uses blargg's bit-perfect, rounded method (slower,
but what can you do?)
- GBA carts really unload now
- added nall/gba/cartridge.hpp: used when there is no manifest. Scans
ROMs for library tags, and selects the first valid one found
- added EEPROM auto-detection when EEPROM size=0. Forces disk/save state
size to 8192 (otherwise states could crash between pre and post
detect.)
- detects first read after a set read address command when the size
is zero, and sets all subsequent bit-lengths to that value, prints
detected size to terminal
- added nall/nes/cartridge.hpp: moves iNES detection out of emulation
core.
Important to note: long-term goal is to remove all
nall/(system)/cartridge.hpp detections from the core and replace with
databases. All in good time.
Anyway, the GBA workarounds should work for ~98.5% of the library, if my
pre-scanning was correct (~40 games with odd tags. I reject ones without
numeric versions now, too.)
I think we're basically at a point where we can release a new version
now. Compatibility should be relatively high (at least for a first
release), and fixes are only going to affect one or two games at a time.
I'd like to start doing some major cleaning house internally (rename
NES->Famicom, SNES->SuperFamicom and such.) Would be much wiser to do
that on a .01 WIP to minimize regressions.
The main problems with a release now:
- speed is pretty bad, haven't really optimized much yet (not sure how
much we can improve it yet, this usually isn't easy)
- sound isn't -great-, but the GBA audio sucks anyway :P
- couple of known bugs (Sonic X video, etc.)
2012-04-22 10:49:19 +00:00
|
|
|
inline string concatenate(const char*) const;
|
2012-06-18 10:13:51 +00:00
|
|
|
inline void append() {}
|
|
|
|
template<typename... Args> inline void append(const string&, Args&&...);
|
Update to v087r30 release.
byuu says:
Changelog:
- DMA channel masks added (some are 27-bit source/target and some are
14-bit length -- hooray, varuint_t class.)
- No more state.pending flags. Instead, we set dma.pending flag when we
want a transfer (fixes GBA Video - Pokemon audio) [Cydrak]
- fixed OBJ Vmosaic [Cydrak, krom]
- OBJ cannot read <=0x13fff in BG modes 3-5 (fixes the garbled tile at
the top-left of some games)
- DMA timing should be much closer to hardware now, but probably not
perfect
- PPU frame blending uses blargg's bit-perfect, rounded method (slower,
but what can you do?)
- GBA carts really unload now
- added nall/gba/cartridge.hpp: used when there is no manifest. Scans
ROMs for library tags, and selects the first valid one found
- added EEPROM auto-detection when EEPROM size=0. Forces disk/save state
size to 8192 (otherwise states could crash between pre and post
detect.)
- detects first read after a set read address command when the size
is zero, and sets all subsequent bit-lengths to that value, prints
detected size to terminal
- added nall/nes/cartridge.hpp: moves iNES detection out of emulation
core.
Important to note: long-term goal is to remove all
nall/(system)/cartridge.hpp detections from the core and replace with
databases. All in good time.
Anyway, the GBA workarounds should work for ~98.5% of the library, if my
pre-scanning was correct (~40 games with odd tags. I reject ones without
numeric versions now, too.)
I think we're basically at a point where we can release a new version
now. Compatibility should be relatively high (at least for a first
release), and fixes are only going to affect one or two games at a time.
I'd like to start doing some major cleaning house internally (rename
NES->Famicom, SNES->SuperFamicom and such.) Would be much wiser to do
that on a .01 WIP to minimize regressions.
The main problems with a release now:
- speed is pretty bad, haven't really optimized much yet (not sure how
much we can improve it yet, this usually isn't easy)
- sound isn't -great-, but the GBA audio sucks anyway :P
- couple of known bugs (Sonic X video, etc.)
2012-04-22 10:49:19 +00:00
|
|
|
|
2011-08-06 14:03:52 +00:00
|
|
|
template<unsigned Limit = 0> inline lstring& split(const char*, const char*);
|
|
|
|
template<unsigned Limit = 0> inline lstring& isplit(const char*, const char*);
|
|
|
|
template<unsigned Limit = 0> inline lstring& qsplit(const char*, const char*);
|
|
|
|
template<unsigned Limit = 0> inline lstring& iqsplit(const char*, const char*);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2011-09-19 12:34:18 +00:00
|
|
|
inline bool operator==(const lstring&) const;
|
|
|
|
inline bool operator!=(const lstring&) const;
|
|
|
|
|
2012-06-18 10:13:51 +00:00
|
|
|
inline lstring& operator=(const lstring&);
|
|
|
|
inline lstring& operator=(lstring&);
|
|
|
|
inline lstring& operator=(lstring&&);
|
|
|
|
|
|
|
|
template<typename... Args> inline lstring(Args&&... args);
|
|
|
|
inline lstring(const lstring&);
|
|
|
|
inline lstring(lstring&);
|
|
|
|
inline lstring(lstring&&);
|
2011-08-06 14:03:52 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
template<unsigned Limit, bool Insensitive, bool Quoted> inline lstring& usplit(const char*, const char*);
|
2010-08-09 13:28:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//compare.hpp
|
|
|
|
inline char chrlower(char c);
|
|
|
|
inline char chrupper(char c);
|
2011-08-06 14:03:52 +00:00
|
|
|
inline int istrcmp(const char *str1, const char *str2);
|
|
|
|
inline bool strbegin(const char *str, const char *key);
|
|
|
|
inline bool istrbegin(const char *str, const char *key);
|
|
|
|
inline bool strend(const char *str, const char *key);
|
|
|
|
inline bool istrend(const char *str, const char *key);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
//convert.hpp
|
|
|
|
inline char* strlower(char *str);
|
|
|
|
inline char* strupper(char *str);
|
2011-07-07 12:59:26 +00:00
|
|
|
inline char* qstrlower(char *str);
|
|
|
|
inline char* qstrupper(char *str);
|
2010-08-09 13:28:56 +00:00
|
|
|
inline char* strtr(char *dest, const char *before, const char *after);
|
|
|
|
|
|
|
|
//math.hpp
|
2011-08-06 14:03:52 +00:00
|
|
|
inline bool strint(const char *str, int &result);
|
2010-08-09 13:28:56 +00:00
|
|
|
inline bool strmath(const char *str, int &result);
|
|
|
|
|
2010-10-14 10:07:38 +00:00
|
|
|
//platform.hpp
|
2012-06-18 10:13:51 +00:00
|
|
|
inline string activepath();
|
|
|
|
inline string realpath(const string &name);
|
2010-10-14 10:07:38 +00:00
|
|
|
inline string userpath();
|
2012-06-18 10:13:51 +00:00
|
|
|
inline string configpath();
|
2012-08-16 10:30:47 +00:00
|
|
|
inline string temppath();
|
2010-10-14 10:07:38 +00:00
|
|
|
|
2012-01-15 08:29:57 +00:00
|
|
|
//strm.hpp
|
|
|
|
inline unsigned strmcpy(char *target, const char *source, unsigned length);
|
|
|
|
inline unsigned strmcat(char *target, const char *source, unsigned length);
|
|
|
|
inline bool strccpy(char *target, const char *source, unsigned length);
|
|
|
|
inline bool strccat(char *target, const char *source, unsigned length);
|
|
|
|
inline void strpcpy(char *&target, const char *source, unsigned &length);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2010-10-14 10:07:38 +00:00
|
|
|
//strpos.hpp
|
|
|
|
inline optional<unsigned> strpos(const char *str, const char *key);
|
2011-08-06 14:03:52 +00:00
|
|
|
inline optional<unsigned> istrpos(const char *str, const char *key);
|
2010-10-14 10:07:38 +00:00
|
|
|
inline optional<unsigned> qstrpos(const char *str, const char *key);
|
2011-08-06 14:03:52 +00:00
|
|
|
inline optional<unsigned> iqstrpos(const char *str, const char *key);
|
|
|
|
template<bool Insensitive = false, bool Quoted = false> inline optional<unsigned> ustrpos(const char *str, const char *key);
|
2010-10-14 10:07:38 +00:00
|
|
|
|
2010-08-09 13:28:56 +00:00
|
|
|
//trim.hpp
|
Update to v070r14 release.
(there was no r13 release posted to the WIP thread)
byuu says:
- nall/string: trim and split functions now take the limit as a template
parameter for clarity, trim_once variants are removed
- quotable.trim<1>("\""); //remove quotes from string
- cheatcode.split<3>(","); //split up to three times, third one is
a description that may have commas
- foobar.trim(" "); //remove any and all spaces
- nall/string: added wildcard() and iwildcard() functions for pattern
matching
- nall/directory: accepts an optional pattern parameter to perform
wildcard matching
- lstring cartridges = directory::contents(path, "*.sfc");
- some people may prefer directory::contents("/path/to/files/*.sfc"),
but I like not having to build a string when you have the path
separated already
- nall/qt: removed entirely, now resides in bsnes/ui-qt/template; I do
intend to replace the check/radio actions with native Qt versions
later
- bsnes/data: new folder, share the parts that both UIs use; bsnes.ico,
bsnes.png, bsnes.Desktop, cheats.xml; simplify Makefile install target
- Makefile: install target now creates .bsnes folder and copies
cheats.xml there for you
- Makefile: gconftool hack removed, not needed for phoenix, will work
around with Qt later
- will probably make bsnes/Qt read the cheats.xml file externally as
well, as that file makes each profile 1MB bigger when embedded
- as such, will probably make bsnes also look in the binary directory
for that file, so Windows users don't have to copy it to their
userdata folder
2010-10-11 10:39:14 +00:00
|
|
|
template<unsigned limit = 0> inline char* ltrim(char *str, const char *key = " ");
|
|
|
|
template<unsigned limit = 0> inline char* rtrim(char *str, const char *key = " ");
|
2011-08-06 14:03:52 +00:00
|
|
|
template<unsigned limit = 0> inline char* trim(char *str, const char *key = " ", const char *rkey = 0);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
//utility.hpp
|
2011-08-06 14:03:52 +00:00
|
|
|
template<bool Insensitive> alwaysinline bool chrequal(char x, char y);
|
|
|
|
template<bool Quoted, typename T> alwaysinline bool quoteskip(T *&p);
|
|
|
|
template<bool Quoted, typename T> alwaysinline bool quotecopy(char *&t, T *&p);
|
2011-07-07 12:59:26 +00:00
|
|
|
inline string substr(const char *src, unsigned start = 0, unsigned length = ~0u);
|
|
|
|
inline string sha256(const uint8_t *data, unsigned size);
|
2011-01-22 08:15:49 +00:00
|
|
|
|
2011-10-24 11:35:34 +00:00
|
|
|
inline char* integer(char *result, intmax_t value);
|
|
|
|
inline char* decimal(char *result, uintmax_t value);
|
|
|
|
|
2011-08-06 14:03:52 +00:00
|
|
|
template<unsigned length = 0, char padding = ' '> inline string integer(intmax_t value);
|
|
|
|
template<unsigned length = 0, char padding = ' '> inline string linteger(intmax_t value);
|
|
|
|
template<unsigned length = 0, char padding = ' '> inline string decimal(uintmax_t value);
|
|
|
|
template<unsigned length = 0, char padding = ' '> inline string ldecimal(uintmax_t value);
|
|
|
|
template<unsigned length = 0, char padding = '0'> inline string hex(uintmax_t value);
|
2011-09-29 12:08:22 +00:00
|
|
|
template<unsigned length = 0, char padding = '0'> inline string binary(uintmax_t value);
|
Update to v084r03 release.
(r02 was not posted to the WIP thread)
byuu says:
Internally, all color is processed with 30-bit precision. The filters
also operate at 30-bit depth.
There's a new config file setting, video.depth, which defaults to 24.
This causes the final output to downsample to 24-bit, as most will
require.
If you set it to 30-bit, the downsampling will not occur, and bsnes will
ask ruby for a 30-bit surface. If you don't have one available, you're
going to get bad colors. Or maybe even a crash with OpenGL.
I don't yet have detection code to make sure you have an appropriate
visual in place.
30-bit mode will really only work if you are running Linux, running Xorg
at Depth 30, use the OpenGL or XShm driver, have an nVidia Quadro or AMD
FireGL card with the official drivers, and have a 30-bit capable
monitor.
Lots of planning and work for very little gain here, but it's nice that
it's finally finished.
Oh, I had to change the contrast/brightness formulas a tiny bit, but
they still work and look nice.
2011-12-03 03:22:54 +00:00
|
|
|
inline unsigned fp(char *str, long double value);
|
|
|
|
inline string fp(long double value);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
//variadic.hpp
|
2010-09-22 12:49:49 +00:00
|
|
|
template<typename... Args> inline void print(Args&&... args);
|
Update to v084r01 release.
I rewrote the S-SMP processor core (implementation of the 256 opcodes),
utilizing my new 6502-like syntax. It matches what bass v05r01 uses.
Took 10 hours.
Due to being able to group the "mov reg,mem" opcodes together with
"adc/sbc/ora/and/eor/cmp" sets, the total code size was reduced from
55.7KB to 42.5KB for identical accuracy and speed.
I also dropped the trick I was using to pass register variables as
template arguments, and instead just use a switch table to pass them as
function arguments. Makes the table a lot easier to read.
Passes all of my S-SMP tests, and all of blargg's
arithmetic/cycle-timing S-SMP tests. Runs Zelda 3 great as well. Didn't
test further.
This does have the potential to cause some regressions if I've messed
anything up, and none of the above tests caught it, so as always,
testing would be appreciated.
Anyway, yeah. By writing the actual processor with this new mnemonic
set, it confirms the parallels I've made.
My guess is that Sony really did clone the 6502, but was worried about
legal implications or something and changed the mnemonics last-minute.
(Note to self: need to re-enable snes.random before v085 official.)
EDIT: oh yeah, I also commented out the ALSA snd_pcm_drain() inside
term(). Without it, there is a tiny pop when the driver is
re-initialized. But with it, the entire emulator would lock up for five
whole seconds waiting on that call to complete. I'll take the pop any
day over that.
2011-11-17 12:05:35 +00:00
|
|
|
|
|
|
|
//wildcard.hpp
|
|
|
|
inline bool wildcard(const char *str, const char *pattern);
|
|
|
|
inline bool iwildcard(const char *str, const char *pattern);
|
2010-08-09 13:28:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|