Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Version 3.0 #137

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 71 additions & 16 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
# CMake build system for CMatrix
# CMake build system for cmatrix

cmake_minimum_required(VERSION 2.8)

project(CMatrix LANGUAGES C)
set(VERSION "2.0")
cmake_minimum_required(VERSION 2.8.12)
project(cmatrix LANGUAGES C)
include(GNUInstallDirs)
add_definitions(-DPACKAGE="${CMAKE_PROJECT_NAME}")
set(VERSION "3.0")

# These are relative to CMAKE_INSTALL_PREFIX
# which by default is "/usr/local"
set(CONSOLE_FONTS_DIRS "share/consolefonts" "lib/kbd/consolefonts")
set(X_FONTS_DIRS "lib/X11/fonts/misc" "X11R6/lib/X11/fonts/misc" "share/fonts/X11/misc")

set(MKFONTDIR "/usr/bin/mkfontdir")
set(MKFONTDIR_BIN "/usr/bin/mkfontdir")
set(OTFFONTDIR "share/fonts")
option(USE_GETTEXT "Whether to use gettext (libintl) for i18n if available" OFF)
option(FORCE_INSTALL_X_FONTS "Whether to create X_FONTS_DIRS (${X_FONTS_DIRS}) if they don't exist" OFF)
option(INSTALL_OTF_FONTS "Whether to install OpenType fonts" ON)

message(STATUS "Looking for include file config.h")
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/config.h")
add_definitions(-DEXCLUDE_CONFIG_H)
message(STATUS "Looking for include file config.h - missing")
else()
add_definitions(-DHAVE_CMATRIX_CONFIG_H)
message(STATUS "Looking for include file config.h - found")
endif()

Expand All @@ -28,6 +33,10 @@ if (NOT WIN32)
endif ()

include(CheckIncludeFiles)
check_include_files("locale.h" HAVE_LOCALE_H)
if (HAVE_LOCALE_H)
add_definitions(-DHAVE_LOCALE_H)
endif ()
check_include_files("sys/ioctl.h" HAVE_SYS_IOCTL_H)
if (HAVE_SYS_IOCTL_H)
add_definitions(-DHAVE_SYS_IOCTL_H)
Expand All @@ -49,16 +58,45 @@ if (HAVE_GETOPT_H)
add_definitions(-DHAVE_GETOPT_H)
endif ()

Set(CURSES_NEED_NCURSES TRUE)
set(CURSES_NEED_NCURSES TRUE)
find_package(Curses)
include(CheckLibraryExists)
include(CheckSymbolExists)
include_directories(${CURSES_INCLUDE_DIR})
add_definitions(-DHAVE_NCURSES_H)
check_library_exists("${CURSES_CURSES_LIBRARY}" wresize "" HAVE_WRESIZE)
check_library_exists("${CURSES_CURSES_LIBRARY}" resizeterm "" HAVE_RESIZETERM)
check_library_exists("${CURSES_CURSES_LIBRARY}" color_content "" HAVE_COLORCONTENT)
check_library_exists("${CURSES_CURSES_LIBRARY}" init_color "" HAVE_INITCOLOR)
if (HAVE_COLORCONTENT AND HAVE_INITCOLOR)
add_definitions(-DHAVE_256COLOR)
endif ()
if (HAVE_WRESIZE)
add_definitions(-DHAVE_WRESIZE)
endif()
if (HAVE_RESIZETERM)
add_definitions(-DHAVE_RESIZETERM)
endif()

find_package(Intl)
if (Intl_FOUND AND USE_GETTEXT)
include_directories(AFTER ${Intl_INCLUDE_DIRS})
add_definitions(-DHAVE_LIBINTL_H)
add_definitions(-DLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}")
endif ()

add_executable(cmatrix cmatrix.c)

target_link_libraries(cmatrix ${CURSES_LIBRARIES})

install(TARGETS cmatrix DESTINATION bin)
install(TARGETS cmatrix DESTINATION ${CMAKE_INSTALL_BINDIR})

if (INSTALL_OTF_FONTS)
message(STATUS "Installing matrix OTF font to ${CMAKE_INSTALL_PREFIX}/${OTFFONTDIR}")
install(FILES
"${CMAKE_SOURCE_DIR}/mtx.otb"
DESTINATION "${OTFFONTDIR}")
endif()

if (UNIX)
foreach (CONSOLE_FONTS_DIR ${CONSOLE_FONTS_DIRS})
Expand All @@ -70,18 +108,35 @@ if (UNIX)
DESTINATION "${CONSOLE_FONTS_DIR}")
endif ()
endforeach ()
list(LENGTH X_FONTS_DIRS x_dirs_len)
list(GET X_FONTS_DIRS -1 last_x_dir)
if (x_dirs_len GREATER 1 AND FORCE_INSTALL_X_FONTS)
message(WARNING "Only force installing X fonts to last `X_FONTS_DIRS' directory (${CMAKE_INSTALL_PREFIX}/${last_x_dir})")
message(DEPRECATION "You should migrate to the OTF font and a terminal that supports it if you rely on the mtx.pcf font")
endif ()
foreach (X_FONTS_DIR ${X_FONTS_DIRS})
if (IS_DIRECTORY "${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR}")
set(is_last ${X_FONTS_DIR} STREQUAL ${last_x_dir})
if(IS_DIRECTORY "${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR}")
set(is_dir TRUE)
else()
set(is_dir FALSE)
endif()
message(DEBUG "IS_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR}: ${is_dir}")
if ((NOT FORCE_INSTALL_X_FONTS AND is_dir) OR (FORCE_INSTALL_X_FONTS AND X_FONTS_DIR STREQUAL last_x_dir))
message(STATUS "Installing matrix X window fonts to ${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR}")
install(FILES
"${CMAKE_SOURCE_DIR}/mtx.pcf"
DESTINATION "${X_FONTS_DIR}")
install(CODE
"message(STATUS \"Running mkfontdir ${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR} ...\")")
install(CODE
"execute_process(COMMAND \"${MKFONTDIR}\" \"${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR}\")")
install(CODE
"message(STATUS \"If this is the first time you have installed CMatrix you will probably have to restart X window in order to use the mtx.pcf font.\")")
if (NOT EXISTS "${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR}/fonts.dir")
install(CODE
"message(STATUS \"Running mkfontdir ${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR} ...\")")
install(CODE
"execute_process(COMMAND \"${MKFONTDIR_BIN}\" \"${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR}\")")
install(CODE
"message(STATUS \"If this is the first time you have installed `${CMAKE_PROJECT_NAME}` you will probably have to restart X window in order to use the mtx.pcf font.\")")
else ()
message(STATUS "${CMAKE_INSTALL_PREFIX}/${X_FONTS_DIR} already an X11 font directory")
endif ()
endif ()
endforeach ()
endif ()
111 changes: 111 additions & 0 deletions charset.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
enum CHARSET {
CHARSET_INVALID = -2,
CHARSET_USERDEFINED = -1,
CHARSET_DEFAULT = 0, CHARSET_ASCII = 0,
CHARSET_KATAKANA, CHARSET_SYMBOLS, CHARSET_LAMBDA, CHARSET_FONT,
CHARSET_MAX
};

// Order determined by CHARSET enum above, starting at 0.
static const uint32_t CHARSETS[CHARSET_MAX][2] = {
// DEFAULT/ASCII
// (! })
{0x21, 0x7D},
// KATAKANA
// (ヲ ン)
{0xFF66, 0xFF9D},
// SYMBOLS
// (、 〾)
{0x3001, 0x303E},
// LAMBDA (λ)
{0x3BB, 0x3BB},
// FONT
// (¦ Ù)
{0xA6, 0xD9}
};

char* codepoint_to_str(uint32_t ch) {
short len = 1;
if (ch > 0x80) len++;
if (ch > 0x800) len++;
if (ch > 0x10000) len++;
if (ch > 0x110000) return NULL;

char* dest = calloc(len+1, sizeof(char));

switch (len) {
case 1:
dest[0] = (char)ch;
break;
case 2:
dest[0] = (ch>>6) | 0xC0;
dest[1] = (ch & 0x3F) | 0x80;
break;
case 3:
dest[0] = (ch>>12) | 0xE0;
dest[1] = ((ch>>6) & 0x3F) | 0x80;
dest[2] = (ch & 0x3F) | 0x80;
break;
case 4:
dest[0] = (ch>>18) | 0xF0;
dest[1] = ((ch>>12) & 0x3F) | 0x80;
dest[2] = ((ch>>6) & 0x3F) | 0x80;
dest[3] = (ch & 0x3F) | 0x80;
break;
}

return dest;
}

char** expand_charset(char* charset) {
char** ret = calloc(strlen(charset)+1, sizeof(char**));
char** pt = ret;
char* tok = strtok(charset, " ");
while (tok != NULL) {
char* new_tok = calloc(5, sizeof(char*));
strcpy(new_tok, tok);
*pt = new_tok;
pt++;
tok = strtok(NULL, " ");
}
if (pt == ret) {
char* new_tok = calloc(5, sizeof(char*));
strcpy(new_tok, charset);
*pt = new_tok;
pt++;
}
*pt = "";
return ret;
}

char* charset_to_string(const uint32_t charset[2]) {
const uint32_t minc = charset[0];
const uint32_t maxc = charset[1];
uint32_t maxlen = maxc - minc;
maxlen *= 5;
maxlen += 2;
char* ret = calloc(maxlen, sizeof(char));
char* pt = ret;
for (uint32_t i = minc; i <= maxc; i++) {
ctrlcctrlv marked this conversation as resolved.
Show resolved Hide resolved
char* cp = codepoint_to_str(i);
strcpy(pt, cp);
while (*pt != '\0') pt++;
if (i != maxc - 1) {
*pt++ = ' ';
}
}
return ret;
}

void usage_charsets() {
printf("\nCHARSETS:\n");
printf(" -A: Use ASCII (default)\n");
printf("\t%s\n", charset_to_string(CHARSETS[CHARSET_DEFAULT]));
printf(" -c: Use Japanese half-width katakana, similar to original matrix. Requires appropriate fonts\n");
printf("\t%s\n", charset_to_string(CHARSETS[CHARSET_KATAKANA]));
printf(" -l: Linux mode (uses Linux tty font)\n");
printf(" -m: lambda mode (equivalent to -u λ)\n");
printf(" -S: CJK symbols mode. Requires appropriate fonts\n");
printf("\t%s\n", charset_to_string(CHARSETS[CHARSET_SYMBOLS]));
printf(" -U [charset]: user-defined (space separated values, e.g. 'あ い お')\n");
}
Loading