Make PHYSFSX_gets_line_t::line_t be array<>

This commit is contained in:
Kp 2014-12-20 04:36:10 +00:00
parent 7c8c55b80c
commit 2766114959
7 changed files with 41 additions and 27 deletions

View file

@ -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>

View file

@ -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])
{

View file

@ -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 );

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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;
}