Commits (5)
/* Library to deal with big/little endian-specific data types */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU Lesser General Public License for more details: lgpl.txt or *
* https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#ifndef ENDIAN_HPP_
#define ENDIAN_HPP_
#include "xpendian.h"
template <typename T>
class BigEndInt {
T value{};
public:
void operator = (T nval) {
value = BE_INT(nval);
}
T operator = (const BigEndInt&) {
return BE_INT(value);
}
};
template <typename T>
class LittleEndInt {
T value{};
public:
void operator = (T nval) {
value = LE_INT(nval);
}
T operator = (const LittleEndInt&) {
return LE_INT(value);
}
};
#endif // Don't add anything after this line
......@@ -24,7 +24,7 @@
#include <algorithm> // std::min
#include <type_traits>
#include "gen_defs.h"
#include "xpendian.h"
#include "endian.hpp"
namespace Pascal {
......@@ -66,23 +66,11 @@ public:
// All multi-byte integer data types are all implicitly little-endian (x86),
// so provide automatic byte-swap (on big-endian systems) during assignment operations.
template <typename T>
class LittleEndianInteger {
T value{};
public:
void operator = (T nval) {
value = LE_INT(nval);
}
T operator = (const LittleEndianInteger&) {
return LE_INT(value);
}
};
using Integer = LittleEndianInteger<int16_t>; // Integer is a 16-bit signed integer
using Word = LittleEndianInteger<uint16_t>; // Word is a 16-bit unsigned integer
using LongInt = LittleEndianInteger<int32_t>; // LongInt is a 32-bit signed integer
using LongWord = LittleEndianInteger<uint32_t>; // LongWord is a 32-bit unsigned integer
using Byte = uint8_t; // Byte is an 8-bit unsigned integer
using Char = char; // Char is an 8-bit char
using Integer = LittleEndInt<int16_t>; // Integer is a 16-bit signed integer
using Word = LittleEndInt<uint16_t>; // Word is a 16-bit unsigned integer
using LongInt = LittleEndInt<int32_t>; // LongInt is a 32-bit signed integer
using LongWord = LittleEndInt<uint32_t>; // LongWord is a 32-bit unsigned integer
using Byte = uint8_t; // Byte is an 8-bit unsigned integer
using Char = char; // Char is an 8-bit char
} // namespace Pascal
/* PCBoard Structure Definitions, Source: SYS.C and USERSYS.H v15.3 */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU Lesser General Public License for more details: lgpl.txt or *
* http://www.fsf.org/copyleft/lesser.html *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#ifndef PCBDEFS_HPP_
#define PCBDEFS_HPP_
#include "endian.hpp"
namespace PCBoard {
static const uint16_t Version{1530};
class abool { // "ASCII Bool" craziness
uint16_t value{False};
public:
static const uint16_t True = LE_INT(0x312D); // "-1"
static const uint16_t False = LE_INT(0x3020); // " 0"
void operator = (int nval) {
value = nval ? True : False;
}
bool operator = (const abool&) {
return value == True;
}
};
// Unterminated space-padded ASCII string
template <size_t size>
class string {
char value[size]{};
public:
void operator = (const char* s) {
memset(value, ' ', size);
memcpy(value, s, min(size, strlen(s)));
}
};
// All multi-byte integer data types are all implicitly little-endian (x86),
// so provide automatic byte-swap (on big-endian systems) during assignment operations.
using Int16 = LittleEndInt<int16_t>;
using Int32 = LittleEndInt<int32_t>;
using UInt16 = LittleEndInt<uint16_t>;
using UInt32 = LittleEndInt<uint32_t>;
static const int USER_FLAG_DIRTY = (1<<0);
static const int USER_FLAG_MSGCLEAR = (1<<1);
static const int USER_FLAG_HASMAIL = (1<<2);
static const int USER_FLAG_NOFSE = (1<<3); // DontAskFSE
static const int USER_FLAG_SCROLLMSG = (1<<4); // ScrollMsgBody
static const int USER_FLAG_SHORTHDR = (1<<5); // ShortHeader
static const int USER_FLAG_WIDEEDITOR = (1<<6);
#pragma pack(push,1) // Disk image structures must be packed
struct sys {
abool Screen;
abool PrintLog;
abool PageBell;
abool Alarm;
char SysopFlag{' '};
abool ErrorCorrected;
char GraphicsMode;
char UserNetStatus{'A'};
string<5> ModemSpeed; /* rate to open com port */
string<5> CarrierSpeed; /* actual speed of caller */
UInt16 UserRecNo;
string<15> FirstName;
string<12> Password;
UInt16 LogonMinute;
Int16 TimeUsed;
string<5> LogonTime;
Int16 PwrdTimeAllowed;
Int16 MaxKBytesAllowed;
char Conference;
char ConfJoined[5];
char ConfScanned[5];
Int16 ConfAddTime;
Int16 CreditMinutes;
char MultiLangExt[4];
string<25> Name;
Int16 MinutesLeft;
uint8_t NodeNum; // Binary node number or 0
string<5> EventTime;
abool EventActive;
abool EventSlide;
char MemorizeNum[4];
char ComPortNumber{'1'}; // ASCII decimal ('0' = none)
char PackFlag{' '};
uint8_t Reserve;
int8_t UseAnsi; // bool
/* used to have 8 bytes for date of last event run and 2 bytes for the time */
Int16 Country;
Int16 CodePage;
char YesChar;
char NoChar;
int8_t Language;
char Reserve2[3]; /* the rest of the date/time used to be used */
int8_t RemoteDOS; // bool
int8_t RunningEvent; //bool, was EventUpComing
int8_t StopUploads; // bool
UInt16 Conference2;
};
struct userSysHeader {
UInt16 Version; /* PCBoard version number */
Int32 RecNo; /* Record number from USER's file */
UInt16 SizeOfRec; /* Size of "fixed" user record */
UInt16 NumOfAreas; /* Number of conference areas (Main=1 thru 65535) */
UInt16 NumOfBitFields; /* Number of Bit Map fields for conferences */
UInt16 SizeOfBitFields; /* Size of each Bit Map field */
char AppName[15]; /* Name of the Third Party Application (if any) */
UInt16 AppVersion; /* Version number for the application (if any) */
UInt16 AppSizeOfRec; /* Size of a "fixed length" record (if any) */
UInt16 AppSizeOfConfRec; /* Size of each conference record (if any) */
Int32 AppRecOffset; /* Offset of AppRec into USERS.INF record (if any) */
int8_t Updated; /* TRUE if the USERS.SYS file has been updated */
};
struct userSysFixed {
// The strings in this struct *are* NUL-terminated
char Name[26]; /* Name (NULL terminated) */
char City[25]; /* City (NULL terminated) */
char Password[13]; /* Password (NULL terminated) */
char BusDataPhone[14]; /* Business or Data Phone (NULL terminated) */
char HomeVoicePhone[14]; /* Home or Voice Phone (NULL terminated) */
UInt16 LastDateOn; /* Julian date for the Last Date On */
char LastTimeOn[6]; /* Last Time On (NULL Terminated) */
int8_t ExpertMode; /* 1=Expert, 0=Novice */
char Protocol; /* Protocol (A thru Z) */
uint8_t PackedFlags; /* Bit packed flags */
UInt16 DateLastDirRead; /* Date for Last DIR Scan (most recent file) */ // DOS format
Int16 SecurityLevel; /* Security Level */
UInt16 NumTimesOn; /* Number of times the caller has connected */
uint8_t PageLen; /* Page Length when display data on the screen */
UInt16 NumUploads; /* Total number of FILES uploaded */
UInt16 NumDownloads; /* Total number of FILES downloaded */
UInt32 DailyDnldBytes; /* Number of BYTES downloaded so far today (was "long") */
char UserComment[31]; /* Comment field #1 (NULL terminated) */
char SysopComment[31]; /* Comment field #1 (NULL terminated) */
Int16 ElapsedTimeOn; /* Number of minutes online */
UInt16 RegExpDate; /* Julian date for Registration Expiration Date */
Int16 ExpSecurityLevel; /* Expired Security Level */
UInt16 LastConference; /* Number of the conference the caller was in */
UInt32 ulTotDnldBytes; /* Total number of BYTES downloaded */
UInt32 ulTotUpldBytes; /* Total number of BYTES uploaded */
int8_t DeleteFlag; /* 1=delete this record, 0=keep */
Int32 RecNum; /* Record Number in USERS.INF file */
uint8_t Flags;
char Reserved[8]; /* Bytes 390-397 from the USERS file */
UInt32 MsgsRead; /* Number of messages the user has read in PCB */
UInt32 MsgsLeft; /* Number of messages the user has left in PCB */
};
struct usersys {
userSysHeader hdr;
userSysFixed fixed;
};
#pragma pack(pop) // original packing
} // namespace PCBoard
#endif // Don't add anything after this line
......@@ -19,8 +19,8 @@
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#ifndef QBBSDEFS_H_
#define QBBSDEFS_H_
#ifndef QBBSDEFS_HPP_
#define QBBSDEFS_HPP_
#include "pascal_types.hpp"
......
This diff is collapsed.