#include <iostream>
#include <iomanip>
#include <vector>
#include <stdint.h>
struct AE
{
char Internal[16+1];
void Print(std::ostream &os) {
os << Internal;
}
};
typedef enum {
DAY = 'D',
WEEK = 'W',
MONTH = 'M',
YEAR = 'Y'
} DateFormat;
struct AS
{
unsigned short N;
unsigned char Format;
void Print(std::ostream &os) {
if( N < 1000 &&
(Format == 'D' ||
Format == 'W' ||
Format == 'M' ||
Format == 'Y' ))
{
os << std::setw(3) << std::setfill('0') << N << Format;
}
else
{
os << "";
}
}
};
struct AT
{
};
struct CS
{
char Internal[16];
};
struct DA
{
unsigned short Year : 12;
unsigned short Month : 4;
unsigned short Day : 5;
void Print(std::ostream &os)
{
os << std::setw(4) << std::setfill('0') << Year;
os << std::setw(2) << std::setfill('0') << Month;
os << std::setw(2) << std::setfill('0') << Day;
}
};
struct date {
unsigned short day : 5; unsigned short month : 4; unsigned short year : 12;
void Print(std::ostream &os)
{
os << year << "." << (int)month << "." << (int)day;
}
};
struct DS
{
double Internal;
};
struct FL
{
float Internal;
};
struct FD
{
double Internal;
};
struct IS
{
int Internal;
void Print(std::ostream &os)
{
os << Internal;
}
};
struct LO
{
char Internal[64];
void Print(std::ostream &os) {
os << Internal;
}
};
struct LT
{
std::string Internal;
void Print(std::ostream &os) {
os << Internal.size();
os << std::endl;
os << Internal;
}
};
struct OB
{
explicit OB(const char *array = 0, uint32_t length = 0):Internal(array),Length(length) {}
void Print( std::ostream &os )
{
const char *p = Internal;
const char *end = Internal+Length;
while(p != end)
{
os << "\\" << (int)*p++;
}
}
private:
const char *Internal;
uint32_t Length;
};
struct OF;
struct OW;
struct PN
{
char Component[5][64];
void Print(std::ostream &os)
{
os << Component[0] << "^";
os << Component[1] << "^";
os << Component[2] << "^";
os << Component[3] << "^";
os << Component[4];
}
};
struct SH
{
char Internal[16+1];
};
struct SL
{
signed long Internal;
};
struct SQ;
struct SS
{
signed short Internal;
};
struct ST
{
std::string Internal;
};
struct TM
{
unsigned short hours:5;
unsigned short minutes:6;
unsigned short seconds:6;
unsigned int fracseconds:20;
void Print(std::ostream &os) {
os << std::setw(2) << std::setfill('0') << hours;
os << std::setw(2) << std::setfill('0') << minutes;
os << std::setw(2) << std::setfill('0') << seconds;
os << ".";
os << std::setw(6) << std::setfill('0') << fracseconds;
}
};
struct Tri
{
short Internal:2;
operator short () const { return Internal; }
};
struct DT
{
DA da;
TM tm;
Tri OffsetSign;
unsigned short Hours:5;
unsigned short Minutes:6;
void Print ( std::ostream &os)
{
da.Print( os );
tm.Print( os );
if( OffsetSign )
{
if ( OffsetSign == -1 ) os << "-";
else if ( OffsetSign == +1 ) os << "+";
else return;
os << std::setw(2) << std::setfill('0') << Hours;
os << std::setw(2) << std::setfill('0') << Minutes;
}
}
};
struct UI
{
char Internal[64+1];
void Print(std::ostream &os) {
os << strlen(Internal) << std::endl;
os << Internal;
}
};
struct UL
{
unsigned long Internal;
};
struct UN
{
std::vector<char> Internal;
};
struct US
{
unsigned short Internal;
};
struct UT
{
std::string Internal;
};
struct S
{
union { char s[2]; } Internal;
void Print( std::ostream &os )
{
os << strlen( Internal.s ) << std::endl;
os << Internal.s;
}
};
int main()
{
AE ae = { "application enti" };
ae.Print( std::cout );
std::cout << std::endl;
AS as = { 1, 'Y' };
as.Print( std::cout );
std::cout << std::endl;
DA da = { 10978, 11, 32 };
da.Print( std::cout );
std::cout << std::endl;
std::cout << "DA:" << sizeof (DA) << std::endl;
double dd = 10*10*10*10*10*10*10*10;
std::cout << dd << std::endl;
DS ds = { 10*10*10*10*10*10*10*10 + 1 };
std::cout << ds.Internal << std::endl;
DT dt = { 1979, 7, 6 };
dt.Print( std::cout << "DT: " );
std::cout << std::endl;
DT dt1 = { 1979, 7, 6, 23, 59, 59, 999999 };
dt1.Print( std::cout << "DT: " );
std::cout << std::endl;
DT dt2 = { 1979, 7, 6, 23, 59, 59, 999999, -1, 12, 42 };
dt2.Print( std::cout << "DT: " );
std::cout << std::endl;
DT dt3 = { 1979, 7, 6, 23, 59, 59, 999999, +1, 12, 42 };
dt3.Print( std::cout << "DT: " );
std::cout << std::endl;
IS is = { 2 << 30 };
is.Print( std::cout );
std::cout << std::endl;
date d = {31, 12, 1978 };
d.Print( std::cout );
std::cout << std::endl;
std::cout << "date:" << sizeof (date) << std::endl;
LO lo = { "coucou" };
lo.Print( std::cout );
std::cout << std::endl;
LT lt = { "very long text\0hello mathieu" };
lt.Print( std::cout );
std::cout << std::endl;
OB ob("\0\1", 2);
ob.Print( std::cout );
std::cout << std::endl;
PN pn1 = { "abc123", "def", "ghi", "klm", "opq" };
pn1.Print( std::cout );
std::cout << std::endl;
PN pn2 = { "malaterre", "mathieu olivier patrick"};
pn2.Print( std::cout );
std::cout << std::endl;
PN pn3 = { "Adams", "John Robert Quincy", "", "Rev.", "B.A. M.Div." };
pn3.Print( std::cout );
std::cout << std::endl;
PN pn4 = { "Morrison-Jones", "Susan", "", "", "Ph.D., Chief Executive Officer" };
pn4.Print( std::cout );
std::cout << std::endl;
PN pn5 = { "Doe", "John" };
pn5.Print( std::cout );
std::cout << std::endl;
PN pn6 = { "Smith", "Fluffy" };
pn6.Print( std::cout );
std::cout << std::endl;
PN pn7 = { "ABC Farms", "Running on Water" };
pn7.Print( std::cout );
std::cout << std::endl;
std::cout << "TM:" << sizeof (TM) << std::endl;
TM tm1 = { 7, 12, 49, 999999 };
tm1.Print( std::cout );
std::cout << std::endl;
TM tm2 = { 23, 59, 59, 999999 };
tm2.Print( std::cout );
std::cout << std::endl;
TM tm3 = { 0, 0, 0, 0 };
tm3.Print( std::cout );
std::cout << std::endl;
UI ui = {
"1234567890.1234567890.1234567890.1234567890.1234567890.123456789" };
ui.Print( std::cout );
std::cout << std::endl;
S s = { '1' };
s.Print(std::cout);
std::cout << std::endl;
std::cout << "Tri:" << std::endl;
Tri t1 = { 0 };
std::cout << t1.Internal << std::endl;
Tri t2 = { 1 };
std::cout << t2.Internal << std::endl;
Tri t3 = { 2 };
std::cout << t3.Internal << std::endl;
Tri t4 = { 3 };
std::cout << t4.Internal << std::endl;
Tri t5 = { '+' };
std::cout << t5.Internal << std::endl;
Tri t6 = { '-' };
std::cout << t6.Internal << std::endl;
Tri t7 = { -1 };
std::cout << t7.Internal << std::endl;
return 0;
}