diff options
-rw-r--r-- | LICENSE.txt | 24 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | README.md | 52 | ||||
-rw-r--r-- | main.c | 7 | ||||
-rw-r--r-- | node.c | 2 | ||||
-rw-r--r-- | ted.png | bin | 0 -> 81487 bytes | |||
-rw-r--r-- | ui.c | 6 | ||||
-rw-r--r-- | unicode.h | 18 | ||||
-rw-r--r-- | util.c | 8 |
9 files changed, 101 insertions, 18 deletions
diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <http://unlicense.org/> @@ -1,5 +1,5 @@ ALL_CFLAGS=$(CFLAGS) -Wall -Wextra -Wshadow -Wconversion -Wpedantic -pedantic -std=gnu11 \ - -Wno-unused-function -Wno-fixed-enum-extension -Wimplicit-fallthrough + -Wno-unused-function -Wno-fixed-enum-extension -Wimplicit-fallthrough -Wno-format-truncation -Wno-unknown-warning-option LIBS=-lSDL2 -lGL -ldl -lm DEBUG_CFLAGS=$(ALL_CFLAGS) -DDEBUG -O0 -g RELEASE_CFLAGS=$(ALL_CFLAGS) -O3 diff --git a/README.md b/README.md new file mode 100644 index 0000000..57fce19 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# ted + +A text editor. + +**ted is still very new, and there are almost certainly bugs. There are also definitely important features missing. I don't recommend using this as your main text editor yet.** + +<img src="ted.png"> + +To install `ted` on Linux, you will need: + +- A C compiler +- SDL2 +- The GL development libraries + +These can be installed on Ubuntu/Debian with: + +``` +sudo apt install gcc libsdl2-dev libgl-dev +``` + +Then run + +``` +sudo make install -j4 +``` + +There is no nice way of installing on Windows yet. + +## Why? + +There are a lot of text editors out there. ted doesn't do anything new. +But in the modern world of text editors running browsers internally, it can be nice to have +a simple editor that starts up practically instantaneously, and performs well on reasonably-sized files. + +## Supported features (more coming soon) + +- Multiple tabs, each with a different file +- Auto-indent +- Customization of (pretty much) all colours and keyboard commands. + +## Building from source + +On Linux, run `make`; on Windows, run `make.bat`. + +## License + +ted is in the public domain (see `LICENSE.txt`). + +## Reporting bugs + +You can report a bug by sending an email to `pommicket at pommicket.com`. + @@ -257,8 +257,11 @@ int main(int argc, char **argv) { char path[TED_PATH_MAX]; if (starting_filename) { // get full path to file - strbuf_printf(path, "%s%s%s", ted->cwd, ted->cwd[strlen(ted->cwd) - 1] == PATH_SEPARATOR ? "" : PATH_SEPARATOR_STR, - starting_filename); + if (!path_is_absolute(starting_filename)) + strbuf_printf(path, "%s%s%s", ted->cwd, ted->cwd[strlen(ted->cwd) - 1] == PATH_SEPARATOR ? "" : PATH_SEPARATOR_STR, + starting_filename); + else + strbuf_printf(path, "%s", starting_filename); } else { strbuf_printf(path, "Untitled"); } @@ -56,7 +56,7 @@ static bool node_tab_close(Ted *ted, Node *node, u16 index) { } else { u16 buffer_index = node->tabs[index]; // remove tab from array - memmove(&node->tabs[index], &node->tabs[index + 1], (ntabs - (index + 1)) * sizeof *node->tabs); + memmove(&node->tabs[index], &node->tabs[index + 1], (size_t)(ntabs - (index + 1)) * sizeof *node->tabs); arr_remove_last(node->tabs); ted_delete_buffer(ted, buffer_index); @@ -186,11 +186,7 @@ static Status file_selector_cd_(Ted const *ted, FileSelector *fs, char const *pa char *const cwd = fs->cwd; if (path[0] == '\0') return true; - if (path[0] == PATH_SEPARATOR - #if _WIN32 - || path[1] == ':' && path[2] == PATH_SEPARATOR - #endif - ) { + if (path_is_absolute(path)) { // absolute path (e.g. /foo, c:\foo) // start out by replacing cwd with the start of the absolute path cwd[0] = '\0'; @@ -119,14 +119,14 @@ static size_t unicode_utf32_to_utf8(char *s, char32_t c32) { return 1; } else if (c32 <= 0x7FF) { // two bytes needed - *p++ = 0xC0 | (u8)(c32 >> 6); - *p = 0x80 | (u8)(c32 & 0x3F); + *p++ = (u8)(0xC0 | (c32 >> 6)); + *p = (u8)(0x80 | (c32 & 0x3F)); return 2; } else if (c32 <= 0x7FFF) { if (c32 < 0xD800 || c32 > 0xDFFF) { - *p++ = 0xE0 | (u8)( c32 >> 12); - *p++ = 0x80 | (u8)((c32 >> 6) & 0x3F); - *p = 0x80 | (u8)( c32 & 0x3F); + *p++ = (u8)(0xE0 | ( c32 >> 12)); + *p++ = (u8)(0x80 | ((c32 >> 6) & 0x3F)); + *p = (u8)(0x80 | ( c32 & 0x3F)); return 3; } else { // UTF-16 surrogate halves @@ -134,10 +134,10 @@ static size_t unicode_utf32_to_utf8(char *s, char32_t c32) { return (size_t)-1; } } else if (c32 <= 0x10FFFF) { - *p++ = 0xF0 | (u8)( c32 >> 18); - *p++ = 0x80 | (u8)((c32 >> 12) & 0x3F); - *p++ = 0x80 | (u8)((c32 >> 6) & 0x3F); - *p = 0x80 | (u8)( c32 & 0x3F); + *p++ = (u8)(0xF0 | ( c32 >> 18)); + *p++ = (u8)(0x80 | ((c32 >> 12) & 0x3F)); + *p++ = (u8)(0x80 | ((c32 >> 6) & 0x3F)); + *p = (u8)(0x80 | ( c32 & 0x3F)); return 4; } else { // code point too big @@ -217,3 +217,11 @@ static char const *path_filename(char const *path) { // (a relative path with no path separators) return path; } + +static bool path_is_absolute(char const *path) { + return path[0] == PATH_SEPARATOR + #if _WIN32 + || path[1] == ':' && path[2] == PATH_SEPARATOR + #endif + ; +} |