Make PHYSFSX_gets_line_t::line_t be array<>
This commit is contained in:
parent
7c8c55b80c
commit
2766114959
|
@ -34,6 +34,7 @@
|
|||
#include "byteutil.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <stdexcept>
|
||||
#include "u_mem.h"
|
||||
#include "pack.h"
|
||||
#include "compiler-array.h"
|
||||
|
@ -265,27 +266,30 @@ struct PHYSFSX_gets_line_t
|
|||
PHYSFSX_gets_line_t &operator=(const PHYSFSX_gets_line_t &) = delete;
|
||||
PHYSFSX_gets_line_t(PHYSFSX_gets_line_t &&) = default;
|
||||
PHYSFSX_gets_line_t &operator=(PHYSFSX_gets_line_t &&) = default;
|
||||
struct line_t
|
||||
{
|
||||
char buf[N];
|
||||
};
|
||||
typedef array<char, N> line_t;
|
||||
#ifdef DXX_HAVE_POISON
|
||||
/* Force onto heap to improve checker accuracy */
|
||||
std::unique_ptr<line_t> m_line;
|
||||
decltype(line_t::buf) &line() { return m_line->buf; }
|
||||
decltype(line_t::buf) &next()
|
||||
const line_t &line() const { return *m_line.get(); }
|
||||
line_t &line() { return *m_line.get(); }
|
||||
line_t &next()
|
||||
{
|
||||
m_line.reset(new line_t);
|
||||
return line();
|
||||
return *m_line.get();
|
||||
}
|
||||
#else
|
||||
line_t m_line;
|
||||
decltype(line_t::buf) &line() { return m_line.buf; }
|
||||
decltype(line_t::buf) &next() { return line(); }
|
||||
const line_t &line() const { return m_line; }
|
||||
line_t &line() { return m_line; }
|
||||
line_t &next() { return m_line; }
|
||||
#endif
|
||||
operator decltype(line_t::buf) &() { return line(); }
|
||||
operator const decltype(line_t::buf) &() const { return line(); }
|
||||
std::size_t size() const { return N; }
|
||||
operator line_t &() { return line(); }
|
||||
operator const line_t &() const { return line(); }
|
||||
operator char *() { return line().data(); }
|
||||
operator const char *() const { return line().data(); }
|
||||
typename line_t::reference operator[](typename line_t::size_type i) { return line()[i]; }
|
||||
typename line_t::const_reference operator[](typename line_t::size_type i) const { return line()[i]; }
|
||||
constexpr std::size_t size() const { return N; }
|
||||
};
|
||||
|
||||
template <>
|
||||
|
@ -294,17 +298,20 @@ struct PHYSFSX_gets_line_t<0>
|
|||
std::unique_ptr<char[]> m_line;
|
||||
std::size_t m_length;
|
||||
PHYSFSX_gets_line_t(std::size_t n) :
|
||||
#ifndef DXX_HAVE_POISON
|
||||
m_line(new char[n]),
|
||||
#endif
|
||||
m_length(n)
|
||||
{
|
||||
}
|
||||
char *line() { return m_line.get(); }
|
||||
const char *line() const { return m_line.get(); }
|
||||
char *next()
|
||||
{
|
||||
#ifdef DXX_HAVE_POISON
|
||||
m_line.reset(new char[m_length]);
|
||||
#endif
|
||||
return line();
|
||||
return m_line.get();
|
||||
}
|
||||
std::size_t size() const { return m_length; }
|
||||
operator const char *() const { return m_line.get(); }
|
||||
|
@ -318,7 +325,9 @@ char *PHYSFSX_fgets(char *buf, size_t n, PHYSFS_file *const fp);
|
|||
template <std::size_t n>
|
||||
static inline char * PHYSFSX_fgets(PHYSFSX_gets_line_t<n> &buf, PHYSFS_file *const fp, std::size_t offset = 0)
|
||||
{
|
||||
return PHYSFSX_fgets(buf.next() + offset, buf.size() - offset, fp);
|
||||
if (offset > buf.size())
|
||||
throw std::invalid_argument("offset too large");
|
||||
return PHYSFSX_fgets(&buf.next()[offset], buf.size() - offset, fp);
|
||||
}
|
||||
|
||||
template <size_t n>
|
||||
|
|
|
@ -65,6 +65,11 @@ struct d_fname : array<char, FILENAME_LEN>
|
|||
_copy(i, i + N);
|
||||
}
|
||||
void copy_if(const d_fname &, std::size_t = 0) = delete;
|
||||
template <std::size_t N>
|
||||
bool copy_if(const array<char, N> &i)
|
||||
{
|
||||
return copy_if(i.data(), N);
|
||||
}
|
||||
template <std::size_t N>
|
||||
bool copy_if(const char (&i)[N])
|
||||
{
|
||||
|
|
|
@ -494,12 +494,12 @@ void ui_pad_read( int n, const char * filename )
|
|||
PHYSFSX_gets_line_t<200> line_buffer;
|
||||
while (PHYSFSX_fgets(line_buffer, infile))
|
||||
{
|
||||
sscanf(line_buffer, " %s %99s ", text, buffer.line());
|
||||
sscanf(line_buffer, " %s %99s ", text, buffer.next().data());
|
||||
keycode = DecodeKeyText(text);
|
||||
functionnumber = func_get_index(buffer);
|
||||
if (functionnumber==-1)
|
||||
{
|
||||
Error( "Unknown function, %s, in %s\n", buffer.line(), filename );
|
||||
Error( "Unknown function, %s, in %s\n", static_cast<const char *>(buffer), filename );
|
||||
} else if (keycode==-1)
|
||||
{
|
||||
Error( "Unknown keystroke, %s, in %s\n", text, filename );
|
||||
|
|
|
@ -706,7 +706,7 @@ static window_event_result menubar_handler(window *wind,const d_event &event, ME
|
|||
return window_event_result::ignored;
|
||||
}
|
||||
|
||||
static void CommaParse( int n, char * dest, char * source )
|
||||
static void CommaParse(uint_fast32_t n, char * dest, const PHYSFSX_gets_line_t<200>::line_t &source)
|
||||
{
|
||||
int i = 0, j=0, cn = 0;
|
||||
|
||||
|
|
|
@ -453,7 +453,7 @@ static void name_frame(automap *am)
|
|||
const char *name_level;
|
||||
if (Current_level_num > 0)
|
||||
{
|
||||
snprintf(name_level_left, sizeof(name_level_left), "%s %i: %s",TXT_LEVEL, Current_level_num, Current_level_name.line());
|
||||
snprintf(name_level_left, sizeof(name_level_left), "%s %i: %s",TXT_LEVEL, Current_level_num, static_cast<const char *>(Current_level_name));
|
||||
name_level = name_level_left;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1265,7 +1265,7 @@ int load_level(const char * filename_passed)
|
|||
if (Gamesave_current_version > 1)
|
||||
PHYSFSX_fgets(Current_level_palette,LoadFile);
|
||||
if (Gamesave_current_version <= 1 || Current_level_palette[0]==0) // descent 1 level
|
||||
strcpy(Current_level_palette.next(), DEFAULT_LEVEL_PALETTE);
|
||||
strcpy(Current_level_palette.next().data(), DEFAULT_LEVEL_PALETTE);
|
||||
|
||||
if (Gamesave_current_version >= 3)
|
||||
Base_control_center_explosion_time = PHYSFSX_readInt(LoadFile);
|
||||
|
@ -1407,7 +1407,7 @@ int load_level(const char * filename_passed)
|
|||
|
||||
#ifdef EDITOR
|
||||
if (EditorWindow)
|
||||
editor_status_fmt("Loaded NEW mine %s, \"%s\"", filename, Current_level_name.line());
|
||||
editor_status_fmt("Loaded NEW mine %s, \"%s\"", filename, static_cast<const char *>(Current_level_name));
|
||||
#endif
|
||||
|
||||
#if !defined(NDEBUG) && !defined(COMPACT_SEGS)
|
||||
|
@ -1461,7 +1461,7 @@ int create_new_mine(void)
|
|||
#elif defined(DXX_BUILD_DESCENT_II)
|
||||
Gamesave_current_version = GAME_VERSION;
|
||||
|
||||
strcpy(Current_level_palette.next(), DEFAULT_LEVEL_PALETTE);
|
||||
strcpy(Current_level_palette.next().data(), DEFAULT_LEVEL_PALETTE);
|
||||
#endif
|
||||
|
||||
Cur_object_index = -1;
|
||||
|
@ -1567,7 +1567,7 @@ static int save_game_data(PHYSFS_file *SaveFile)
|
|||
// Write the mine name
|
||||
if (game_top_fileinfo_version >= 31)
|
||||
#endif
|
||||
PHYSFSX_printf(SaveFile, "%s\n", Current_level_name.line());
|
||||
PHYSFSX_printf(SaveFile, "%s\n", static_cast<const char *>(Current_level_name));
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
else if (game_top_fileinfo_version >= 14)
|
||||
PHYSFSX_writeString(SaveFile, Current_level_name);
|
||||
|
@ -1749,7 +1749,7 @@ static int save_level_sub(const char * filename, int compiled_version)
|
|||
|
||||
// Write the palette file name
|
||||
if (Gamesave_current_version > 1)
|
||||
PHYSFSX_printf(SaveFile, "%s\n", Current_level_palette.line());
|
||||
PHYSFSX_printf(SaveFile, "%s\n", static_cast<const char *>(Current_level_palette));
|
||||
|
||||
if (Gamesave_current_version >= 3)
|
||||
PHYSFS_writeSLE32(SaveFile, Base_control_center_explosion_time);
|
||||
|
@ -1801,7 +1801,7 @@ static int save_level_sub(const char * filename, int compiled_version)
|
|||
// if ( !compiled_version )
|
||||
{
|
||||
if (EditorWindow)
|
||||
editor_status_fmt("Saved mine %s, \"%s\"", filename, Current_level_name.line());
|
||||
editor_status_fmt("Saved mine %s, \"%s\"", filename, static_cast<const char *>(Current_level_name));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -691,9 +691,9 @@ static void set_briefing_filename(d_fname &f, const char *const v)
|
|||
f = {};
|
||||
}
|
||||
|
||||
static void record_briefing(d_fname &f, char (&buf)[PATH_MAX])
|
||||
static void record_briefing(d_fname &f, array<char, PATH_MAX> &buf)
|
||||
{
|
||||
char *const v = get_value(buf);
|
||||
const auto v = get_value(buf.data());
|
||||
if (v && (add_term(v), *v))
|
||||
set_briefing_filename(f, v);
|
||||
else
|
||||
|
@ -904,7 +904,7 @@ static int load_mission(const mle *mission)
|
|||
con_printf(CON_URGENT, "Mission %s has no HAM.", Current_mission->path.c_str());
|
||||
}
|
||||
else {
|
||||
con_printf(CON_URGENT, "Mission %s uses unsupported critical directive \"%s\".", Current_mission->path.c_str(), buf.line());
|
||||
con_printf(CON_URGENT, "Mission %s uses unsupported critical directive \"%s\".", Current_mission->path.c_str(), static_cast<const char *>(buf));
|
||||
Last_level = 0;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue