You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SQA-Homework/gcov&lcov/common.h

274 lines
7.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef COMMON_H
#define COMMON_H
#pragma GCC diagnostic ignored "-Wstringop-truncation"
#pragma GCC diagnostic ignored "-Wunused-result"
const char* version = (char*)"v2.8.5";
#include <cstdio>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <cassert>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <termios.h>
/* output style: 16 color mode */
#define VT100_STYLE_NORMAL "0"
#define VT100_STYLE_BOLD "1"
#define VT100_STYLE_DARK "2"
#define VT100_STYLE_BACKGROUND "3"
#define VT100_STYLE_UNDERLINE "4"
/* output color: 16 color mode */
#define VT100_COLOR_BLACK "30"
#define VT100_COLOR_RED "31"
#define VT100_COLOR_GREEN "32"
#define VT100_COLOR_YELLOW "33"
#define VT100_COLOR_BLUE "34"
#define VT100_COLOR_PURPLE "35"
#define VT100_COLOR_SKYBLUE "36"
#define VT100_COLOR_WHITE "37"
#define VT100_COLOR_NORMAL "38"
#define log(fmt, ...) \
fprintf(stderr, \
"\033[" VT100_STYLE_NORMAL ";" VT100_COLOR_BLUE "m[LOG] \033[0m" \
"\033[" VT100_STYLE_DARK ";" VT100_COLOR_NORMAL "m%s:%d: \033[0m" \
fmt "\n", __func__, __LINE__, ## __VA_ARGS__)
#define logw(fmt, ...) \
fprintf(stderr, \
"\033[" VT100_STYLE_NORMAL ";" VT100_COLOR_YELLOW "m[WARN] \033[0m" \
"\033[" VT100_STYLE_DARK ";" VT100_COLOR_NORMAL "m%s:%d: \033[0m" \
fmt "\n", __func__, __LINE__, ## __VA_ARGS__)
#define loge(fmt, ...) \
fprintf(stderr, \
"\033[" VT100_STYLE_NORMAL ";" VT100_COLOR_RED "m[ERROR] \033[0m" \
"\033[" VT100_STYLE_DARK ";" VT100_COLOR_NORMAL "m%s:%d: \033[0m" \
fmt "\n", __func__, __LINE__, ## __VA_ARGS__)
// inner log
#define logi(fmt, ...) \
fprintf(stderr, \
"\033[" VT100_STYLE_NORMAL ";" VT100_COLOR_BLUE "m[LOG] \033[0m" \
"\033[" VT100_STYLE_DARK ";" VT100_COLOR_NORMAL "m%s:%d: \033[0m" \
"==> " fmt "\n", __func__, __LINE__, ## __VA_ARGS__)
#define eprintf(...) do { \
loge(__VA_ARGS__); \
exit(0); \
} while(0)
/* detects the width and height of local screen firstly by `ioctl`
*
* usage of ioctl:
* struct winsize ws;
* ioctl(STDIN_FILENO, TIOCGWINSZ, &size);
* ws.ws_col;
* ws.ws_row;
*/
struct pos_t {
uint8_t x;
uint8_t y;
};
// format of messages sended from client to server
typedef struct client_message_t {
uint8_t command;
char user_name[USERNAME_SIZE]; // last byte must be zero
union
{
char message[MSG_SIZE];
char password[PASSWORD_SIZE];
};
} client_message_t;
// format of messages sended from server to client
typedef struct server_message_t {
union {
uint8_t response;
uint8_t message;
};
union {
// support at most five users
char friend_name[USERNAME_SIZE];
struct {
char user_name[USERNAME_SIZE];
uint8_t user_state;
} all_users[USER_CNT];
struct {
uint16_t life, index, bullets_num, color;
pos_t user_pos[USER_CNT];
uint8_t user_color[USER_CNT];
uint8_t map[BATTLE_H][BATTLE_W / 2 + 1];
//pos_t item_pos[MAX_ITEM];
//uint8_t item_kind[MAX_ITEM];
};
struct {
char name[USERNAME_SIZE];
uint8_t namecolor;
uint8_t kill;
uint8_t death;
uint8_t score;
uint16_t life;
} users[USER_CNT];
struct {
char from_user[USERNAME_SIZE];
char msg[MSG_SIZE];
}; // for message
};
} server_message_t;
enum {
CLIENT_COMMAND_USER_QUIT,
CLIENT_COMMAND_USER_REGISTER,
CLIENT_COMMAND_USER_LOGIN,
CLIENT_COMMAND_USER_LOGOUT,
CLIENT_MESSAGE_FATAL,
CLIENT_COMMAND_FETCH_ALL_USERS,
CLIENT_COMMAND_FETCH_ALL_FRIENDS,
CLIENT_COMMAND_LAUNCH_BATTLE,
CLIENT_COMMAND_LAUNCH_FFA,
CLIENT_COMMAND_QUIT_BATTLE,
CLIENT_COMMAND_ACCEPT_BATTLE,
CLIENT_COMMAND_REJECT_BATTLE,
CLIENT_COMMAND_INVITE_USER,
CLIENT_COMMAND_SEND_MESSAGE,
CLIENT_COMMAND_MOVE_UP,
CLIENT_COMMAND_MOVE_DOWN,
CLIENT_COMMAND_MOVE_LEFT,
CLIENT_COMMAND_MOVE_RIGHT,
CLIENT_COMMAND_FIRE_UP,
CLIENT_COMMAND_FIRE_DOWN,
CLIENT_COMMAND_FIRE_LEFT,
CLIENT_COMMAND_FIRE_RIGHT,
CLIENT_COMMAND_FIRE_UP_LEFT,
CLIENT_COMMAND_FIRE_UP_RIGHT,
CLIENT_COMMAND_FIRE_DOWN_LEFT,
CLIENT_COMMAND_FIRE_DOWN_RIGHT,
CLIENT_COMMAND_FIRE_AOE_UP,
CLIENT_COMMAND_FIRE_AOE_DOWN,
CLIENT_COMMAND_FIRE_AOE_LEFT,
CLIENT_COMMAND_FIRE_AOE_RIGHT,
CLIENT_COMMAND_ADMIN_CONTROL,
CLIENT_COMMAND_PUT_LANDMINE,
CLIENT_COMMAND_MELEE,
CLIENT_COMMAND_END,
};
enum {
SERVER_SAY_NOTHING,
SERVER_RESPONSE_REGISTER_SUCCESS,
SERVER_RESPONSE_REGISTER_FAIL,
SERVER_RESPONSE_YOU_HAVE_REGISTERED,
SERVER_RESPONSE_LOGIN_SUCCESS,
SERVER_RESPONSE_YOU_HAVE_LOGINED,
SERVER_RESPONSE_YOU_HAVE_NOT_LOGIN,
SERVER_RESPONSE_LOGIN_FAIL_UNREGISTERED_USERID,
SERVER_RESPONSE_LOGIN_FAIL_ERROR_PASSWORD,
SERVER_RESPONSE_LOGIN_FAIL_DUP_USERID, // user id has been registered by other users
SERVER_RESPONSE_LOGIN_FAIL_SERVER_LIMITS, // server unable to handle more users
SERVER_RESPONSE_ALL_USERS_INFO,
SERVER_RESPONSE_ALL_FRIENDS_INFO,
SERVER_RESPONSE_LAUNCH_BATTLE_FAIL,
SERVER_RESPONSE_LAUNCH_BATTLE_SUCCESS,
SERVER_RESPONSE_YOURE_NOT_IN_BATTLE,
SERVER_RESPONSE_YOURE_ALREADY_IN_BATTLE,
SERVER_RESPONSE_INVITATION_SENT,
SERVER_RESPONSE_NOBODY_INVITE_YOU,
/* ----------------------------------------------- */
SERVER_MESSAGE,
SERVER_STATUS_QUIT,
SERVER_STATUS_FATAL,
SERVER_MESSAGE_DELIM,
SERVER_MESSAGE_FRIEND_LOGIN,
SERVER_MESSAGE_FRIEND_LOGOUT,
SERVER_MESSAGE_FRIEND_ACCEPT_BATTLE,
SERVER_MESSAGE_FRIEND_REJECT_BATTLE,
SERVER_MESSAGE_FRIEND_NOT_LOGIN,
SERVER_MESSAGE_FRIEND_ALREADY_IN_BATTLE,
SERVER_MESSAGE_INVITE_TO_BATTLE,
SERVER_MESSAGE_FRIEND_MESSAGE,
SERVER_MESSAGE_USER_QUIT_BATTLE,
SERVER_MESSAGE_BATTLE_DISBANDED, // since no other users in this battle
SERVER_MESSAGE_BATTLE_INFORMATION,
SERVER_MESSAGE_BATTLE_PLAYER,
SERVER_MESSAGE_YOU_ARE_DEAD,
SERVER_MESSAGE_YOU_ARE_SHOOTED,
SERVER_MESSAGE_YOU_ARE_TRAPPED_IN_MAGMA,
SERVER_MESSAGE_YOU_GOT_BLOOD_VIAL,
SERVER_MESSAGE_YOU_GOT_MAGAZINE,
SERVER_MESSAGE_YOUR_MAGAZINE_IS_EMPTY,
};
/* some special characters(terminal graph):
*
* ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▊ ▌ ▎ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟ ━ ┃
*
* ┏ ┓ ┗ ┛ ┣ ┫ ┳ ┻ ╋ ╸ ╹ ╺
*
* ╻ ╏ ─ ─ │ │ ╴ ╴ ╵ ╵ ╶ ╶ ╵ ╵ ⎢ ⎥ ⎺ ⎻ ⎼ ⎽ ◾ ▪
*
* ■ □ ★ ☆ ◆ ◇ ◣ ◢ ◤ ◥ ▲ △ ▼ ▽ ⊿
*
* ┌─┬─┐
* │ │ │
* ├─┼─┤
* │ │ │
* └─┴─┘
*
* */
// output colored text
// for example:
// printf("\033[{style};{color}mHello World!\n\033[0m");
//
// where {style} is interger range from 0 to 4, {color} is a
// interger range from 30 to 38
//
//
// 256 color support:
// control code: "\033[48;5;{color}m" or "\033[38;5;{color}m"
//
// where {color} is a interger range from 0 to 255, see more
// details in 256-colors.py
//
//
// cursor move:
// control code: "\033" (\033 is ascii code of <esc>)
//
// cursor up: "\033[{count}A"
// moves the cursor up by count rows;
// the default count is 1.
//
// cursor down: "\033[{count}B"
// moves the cursor down by count rows;
// the default count is 1.
//
// cursor forward: "\033[{count}C"
// moves the cursor forward by count columns;
// the default count is 1.
//
// cursor backward: "\033[{count}D"
// moves the cursor backward by count columns;
// the default count is 1.
//
// set cursor position: "\033[{row};{column}f"
//
#endif