Setup initial repo

This commit is contained in:
2026-07-27 06:56:01 +01:00
parent f9b969050f
commit 125a6a3d46
7 changed files with 1958 additions and 6 deletions
+7
View File
@@ -0,0 +1,7 @@
result
p.vim
compile_commands.json
bin/
build/
.cache/
+103
View File
@@ -0,0 +1,103 @@
SRC_DIR := src
BIN_DIR := bin
OBJ_DIR := build
INCLUDE_DIR := include
TARGET_DEBUG := $(BIN_DIR)/crib-dbg
TARGET_RELEASE := $(BIN_DIR)/crib
PCH_DEBUG := $(OBJ_DIR)/debug/pch.h.gch
PCH_RELEASE := $(OBJ_DIR)/release/pch.h.gch
CXX ?= g++
CC ?= gcc
PCRE_CFLAGS := $(shell pkg-config --cflags libpcre2-8)
PCRE_LIBS := $(shell pkg-config --static --libs libpcre2-8)
LIBGRAPHEME_CFLAGS := $(shell pkg-config --cflags libgrapheme)
LIBGRAPHEME_LIBS := $(shell pkg-config --static --libs libgrapheme)
MRUBY_CFLAGS ?= ./libs/mruby/build/host/include
MRUBY_LIBS ?= ./libs/mruby/build/host/lib/libmruby.a
CFLAGS_DEBUG :=\
-std=c++20 -Wall -Wextra -static \
-O0 -fno-inline -gsplit-dwarf \
-g -fno-omit-frame-pointer \
-I./include -I./libs/unicode_width
CFLAGS_RELEASE :=\
-std=c++20 -O3 -march=x86-64 -mtune=generic -fno-rtti \
-fvisibility=hidden -static \
-fomit-frame-pointer -DNDEBUG -s \
-I./include -I./libs/unicode_width
CFLAGS_DEBUG += $(PCRE_CFLAGS) $(LIBGRAPHEME_CFLAGS) $(MRUBY_CFLAGS) $(C_SANITIZER)
CFLAGS_RELEASE += $(PCRE_CFLAGS) $(LIBGRAPHEME_CFLAGS) $(MRUBY_CFLAGS)
PCH_CFLAGS_DEBUG := $(CFLAGS_DEBUG) -x c++-header
PCH_CFLAGS_RELEASE := $(CFLAGS_RELEASE) -x c++-header
UNICODE_SRC := $(wildcard libs/unicode_width/*.c)
UNICODE_OBJ_DEBUG := $(patsubst libs/unicode_width/%.c,$(OBJ_DIR)/debug/unicode_width/%.o,$(UNICODE_SRC))
UNICODE_OBJ_RELEASE := $(patsubst libs/unicode_width/%.c,$(OBJ_DIR)/release/unicode_width/%.o,$(UNICODE_SRC))
LIBS := $(PCRE_LIBS) $(LIBGRAPHEME_LIBS) $(MRUBY_LIBS)
SRC := $(wildcard $(SRC_DIR)/**/*.cc) $(wildcard $(SRC_DIR)/*.cc)
OBJ_DEBUG := $(patsubst $(SRC_DIR)/%.cc,$(OBJ_DIR)/debug/%.o,$(SRC))
OBJ_RELEASE := $(patsubst $(SRC_DIR)/%.cc,$(OBJ_DIR)/release/%.o,$(SRC))
DEP_DEBUG := $(OBJ_DEBUG:.o=.d)
DEP_RELEASE := $(OBJ_RELEASE:.o=.d)
.PHONY: all debug release clean
all: release
debug: $(TARGET_DEBUG)
release: $(TARGET_RELEASE)
$(PCH_DEBUG): $(INCLUDE_DIR)/pch.h
mkdir -p $(dir $@)
$(CXX) $(PCH_CFLAGS_DEBUG) -o $@ $<
$(PCH_RELEASE): $(INCLUDE_DIR)/pch.h
mkdir -p $(dir $@)
$(CXX) $(PCH_CFLAGS_RELEASE) -o $@ $<
$(TARGET_DEBUG): $(PCH_DEBUG) $(OBJ_DEBUG) $(UNICODE_OBJ_DEBUG)
mkdir -p $(BIN_DIR)
$(CXX) $(CFLAGS_DEBUG) -o $@ $(OBJ_DEBUG) $(UNICODE_OBJ_DEBUG) $(LIBS)
$(TARGET_RELEASE): $(PCH_RELEASE) $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE)
mkdir -p $(BIN_DIR)
$(CXX) $(CFLAGS_RELEASE) -o $@ $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) $(LIBS)
$(OBJ_DIR)/debug/%.o: $(SRC_DIR)/%.cc $(PCH_DEBUG) $(GENERATED_HEADER)
mkdir -p $(dir $@)
$(CXX) $(CFLAGS_DEBUG) -include $(INCLUDE_DIR)/pch.h -MMD -MP -c $< -o $@
$(OBJ_DIR)/release/%.o: $(SRC_DIR)/%.cc $(PCH_RELEASE) $(GENERATED_HEADER)
mkdir -p $(dir $@)
$(CXX) $(CFLAGS_RELEASE) -include $(INCLUDE_DIR)/pch.h -MMD -MP -c $< -o $@
$(OBJ_DIR)/debug/unicode_width/%.o: libs/unicode_width/%.c
mkdir -p $(dir $@)
$(CC) -MMD -MP -c $< -o $@
$(OBJ_DIR)/release/unicode_width/%.o: libs/unicode_width/%.c
mkdir -p $(dir $@)
$(CC) -MMD -MP -c $< -o $@
DEP_DEBUG += $(UNICODE_OBJ_DEBUG:.o=.d)
DEP_RELEASE += $(UNICODE_OBJ_RELEASE:.o=.d)
-include $(DEP_DEBUG)
-include $(DEP_RELEASE)
clean:
rm -rf $(OBJ_DIR) $(BIN_DIR)
+7 -6
View File
@@ -62,6 +62,7 @@
buildInputs = with pkgs; [ buildInputs = with pkgs; [
libgrapheme libgrapheme
pcre2
mruby mruby
]; ];
@@ -69,8 +70,8 @@
buildPhase = '' buildPhase = ''
make \ make \
MRBC=${mruby}/bin/mrbc \ MRBC=${mruby}/bin/mrbc \
MRUBY_INCLUDE=${mruby}/include \ MRUBY_CFLAGS=-I${mruby}/include \
MRUBY_LIB=${mruby}/lib/libmruby.a MRUBY_LIBS=-L${mruby}/lib -lmruby
''; '';
installPhase = '' installPhase = ''
@@ -105,12 +106,12 @@
]; ];
shellHook = '' shellHook = ''
export CC="ccache gcc" export CC="ccache $CC"
export CXX="ccache g++" export CXX="ccache $CXX"
export MRBC=${mruby}/bin/mrbc export MRBC=${mruby}/bin/mrbc
export MRUBY_INCLUDE=${mruby}/include export MRUBY_CFLAGS=-I${mruby}/include
export MRUBY_LIB=${mruby}/lib/libmruby.a export MRUBY_LIBS="-L${mruby}/lib -lmruby"
''; '';
}; };
}; };
+58
View File
@@ -0,0 +1,58 @@
#ifndef PCH_H
#define PCH_H
#define PCRE2_CODE_UNIT_WIDTH 8
#define PCRE_WORKSPACE_SIZE 512
#include "mruby.h"
#include "mruby/array.h"
#include "mruby/compile.h"
#include "mruby/hash.h"
#include "mruby/irep.h"
#include "mruby/string.h"
#include <pcre2.h>
extern "C" {
#include "unicode_width.h"
#include <grapheme.h>
}
#include <algorithm>
#include <atomic>
#include <cctype>
#include <chrono>
#include <cmath>
#include <cstdarg>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fcntl.h>
#include <filesystem>
#include <fstream>
#include <functional>
#include <immintrin.h>
#include <limits.h>
#include <map>
#include <mutex>
#include <optional>
#include <poll.h>
#include <queue>
#include <set>
#include <shared_mutex>
#include <signal.h>
#include <stack>
#include <string.h>
#include <string>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <termios.h>
#include <thread>
#include <unistd.h>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std::chrono_literals;
#endif
File diff suppressed because it is too large Load Diff
+96
View File
@@ -0,0 +1,96 @@
/* Generated by unicode-width generator.
*
* Unicode 16.0.0 data.
* For terminal width calculation.
*
* Copyright 2025 Dair Aidarkhanov
* SPDX-License-Identifier: 0BSD
*/
#ifndef UNICODE_WIDTH_H
#define UNICODE_WIDTH_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Version of Unicode data.
*/
#define UNICODE_WIDTH_VERSION_MAJOR 16
#define UNICODE_WIDTH_VERSION_MINOR 0
#define UNICODE_WIDTH_VERSION_PATCH 0
/* Width state values.
*/
typedef enum {
WIDTH_STATE_DEFAULT = 0,
WIDTH_STATE_LINE_FEED = 1,
WIDTH_STATE_EMOJI_MODIFIER = 2,
WIDTH_STATE_REGIONAL_INDICATOR = 3,
WIDTH_STATE_SEVERAL_REGIONAL_INDICATOR = 4,
WIDTH_STATE_EMOJI_PRESENTATION = 5,
WIDTH_STATE_ZWJ_EMOJI_PRESENTATION = 6,
WIDTH_STATE_KEYCAP_ZWJ_EMOJI_PRESENTATION = 7,
WIDTH_STATE_REGIONAL_INDICATOR_ZWJ_PRESENTATION = 8,
WIDTH_STATE_TAG_END_ZWJ_EMOJI_PRESENTATION = 9,
WIDTH_STATE_ZWJ_SEQUENCE_MEMBER = 10,
} width_state_t;
/* State for the width calculation state machine.
*/
typedef struct {
width_state_t state;
uint_least32_t previous_codepoint;
} unicode_width_state_t;
/* Initialize a unicode width state.
* Must be called before any other function.
*
* @param state Pointer to state to initialize
*/
void unicode_width_init(unicode_width_state_t *state);
/* Process a Unicode codepoint and return its width.
* Width is 0, 1, 2, or 3, or -1 for control characters.
*
* Control characters (0x00-0x1F except newlines, 0x7F, and 0x80-0x9F) return
* -1, allowing the caller to decide how to display them. For readline-like
* applications, control characters are typically displayed using caret notation
* (^X) with width 2. Use unicode_width_control_char() to get this width.
*
* Newlines (LF, CR, CRLF) return width 0 as they don't consume horizontal space
* in terminal displays.
*
* Note that the width of a codepoint may depend on context (preceding/following
* codepoints), so this function keeps track of context in the provided state.
*
* @param state Pointer to state
* @param codepoint Unicode codepoint to process
* @return Width of the codepoint in columns, or -1 for control characters
*/
int unicode_width_process(unicode_width_state_t *state,
uint_least32_t codepoint);
/* Get the display width of a control character in caret notation (e.g., ^A).
* This is useful for applications like readline that display control chars.
*
* @param codepoint The Unicode codepoint to check
* @return The display width (usually 2 for ^X notation), or -1 if not a control
* char
*/
int unicode_width_control_char(uint_least32_t codepoint);
/* Reset a unicode width state to its initial state.
*
* @param state Pointer to state to reset
*/
void unicode_width_reset(unicode_width_state_t *state);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* UNICODE_WIDTH_H */
+3
View File
@@ -0,0 +1,3 @@
#include "pch.h"
int main() { return 0; }