Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/extern/isocline/src/stringbuf.h
2727 views
1
/* ----------------------------------------------------------------------------
2
Copyright (c) 2021, Daan Leijen
3
This is free software; you can redistribute it and/or modify it
4
under the terms of the MIT License. A copy of the license can be
5
found in the "LICENSE" file at the root of this distribution.
6
-----------------------------------------------------------------------------*/
7
#pragma once
8
#ifndef IC_STRINGBUF_H
9
#define IC_STRINGBUF_H
10
11
#include <stdarg.h>
12
#include "common.h"
13
14
//-------------------------------------------------------------
15
// string buffer
16
// in-place modified buffer with edit operations
17
// that grows on demand.
18
//-------------------------------------------------------------
19
20
// abstract string buffer
21
struct stringbuf_s;
22
typedef struct stringbuf_s stringbuf_t;
23
24
ic_private stringbuf_t* sbuf_new( alloc_t* mem );
25
ic_private void sbuf_free( stringbuf_t* sbuf );
26
ic_private char* sbuf_free_dup(stringbuf_t* sbuf);
27
ic_private ssize_t sbuf_len(const stringbuf_t* s);
28
29
ic_private const char* sbuf_string_at( stringbuf_t* sbuf, ssize_t pos );
30
ic_private const char* sbuf_string( stringbuf_t* sbuf );
31
ic_private char sbuf_char_at(stringbuf_t* sbuf, ssize_t pos);
32
ic_private char* sbuf_strdup_at( stringbuf_t* sbuf, ssize_t pos );
33
ic_private char* sbuf_strdup( stringbuf_t* sbuf );
34
ic_private char* sbuf_strdup_from_utf8(stringbuf_t* sbuf); // decode to locale
35
36
37
ic_private ssize_t sbuf_appendf(stringbuf_t* sb, const char* fmt, ...);
38
ic_private ssize_t sbuf_append_vprintf(stringbuf_t* sb, const char* fmt, va_list args);
39
40
ic_private stringbuf_t* sbuf_split_at( stringbuf_t* sb, ssize_t pos );
41
42
// primitive edit operations (inserts return the new position)
43
ic_private void sbuf_clear(stringbuf_t* sbuf);
44
ic_private void sbuf_replace(stringbuf_t* sbuf, const char* s);
45
ic_private void sbuf_delete_at(stringbuf_t* sbuf, ssize_t pos, ssize_t count);
46
ic_private void sbuf_delete_from_to(stringbuf_t* sbuf, ssize_t pos, ssize_t end);
47
ic_private void sbuf_delete_from(stringbuf_t* sbuf, ssize_t pos );
48
ic_private ssize_t sbuf_insert_at_n(stringbuf_t* sbuf, const char* s, ssize_t n, ssize_t pos );
49
ic_private ssize_t sbuf_insert_at(stringbuf_t* sbuf, const char* s, ssize_t pos );
50
ic_private ssize_t sbuf_insert_char_at(stringbuf_t* sbuf, char c, ssize_t pos );
51
ic_private ssize_t sbuf_insert_unicode_at(stringbuf_t* sbuf, unicode_t u, ssize_t pos);
52
ic_private ssize_t sbuf_append_n(stringbuf_t* sbuf, const char* s, ssize_t n);
53
ic_private ssize_t sbuf_append(stringbuf_t* sbuf, const char* s);
54
ic_private ssize_t sbuf_append_char(stringbuf_t* sbuf, char c);
55
56
// high level edit operations (return the new position)
57
ic_private ssize_t sbuf_next( stringbuf_t* sbuf, ssize_t pos, ssize_t* cwidth );
58
ic_private ssize_t sbuf_prev( stringbuf_t* sbuf, ssize_t pos, ssize_t* cwidth );
59
ic_private ssize_t sbuf_next_ofs(stringbuf_t* sbuf, ssize_t pos, ssize_t* cwidth);
60
61
ic_private ssize_t sbuf_delete_char_before( stringbuf_t* sbuf, ssize_t pos );
62
ic_private void sbuf_delete_char_at( stringbuf_t* sbuf, ssize_t pos );
63
ic_private ssize_t sbuf_swap_char( stringbuf_t* sbuf, ssize_t pos );
64
65
ic_private ssize_t sbuf_find_line_start( stringbuf_t* sbuf, ssize_t pos );
66
ic_private ssize_t sbuf_find_line_end( stringbuf_t* sbuf, ssize_t pos );
67
ic_private ssize_t sbuf_find_word_start( stringbuf_t* sbuf, ssize_t pos );
68
ic_private ssize_t sbuf_find_word_end( stringbuf_t* sbuf, ssize_t pos );
69
ic_private ssize_t sbuf_find_ws_word_start( stringbuf_t* sbuf, ssize_t pos );
70
ic_private ssize_t sbuf_find_ws_word_end( stringbuf_t* sbuf, ssize_t pos );
71
72
// parse a decimal
73
ic_private bool ic_atoz(const char* s, ssize_t* i);
74
// parse two decimals separated by a semicolon
75
ic_private bool ic_atoz2(const char* s, ssize_t* i, ssize_t* j);
76
ic_private bool ic_atou32(const char* s, uint32_t* pu);
77
78
// row/column info
79
typedef struct rowcol_s {
80
ssize_t row;
81
ssize_t col;
82
ssize_t row_start;
83
ssize_t row_len;
84
bool first_on_row;
85
bool last_on_row;
86
} rowcol_t;
87
88
// find row/col position
89
ic_private ssize_t sbuf_get_pos_at_rc( stringbuf_t* sbuf, ssize_t termw, ssize_t promptw, ssize_t cpromptw,
90
ssize_t row, ssize_t col );
91
// get row/col for a given position
92
ic_private ssize_t sbuf_get_rc_at_pos( stringbuf_t* sbuf, ssize_t termw, ssize_t promptw, ssize_t cpromptw,
93
ssize_t pos, rowcol_t* rc );
94
95
ic_private ssize_t sbuf_get_wrapped_rc_at_pos( stringbuf_t* sbuf, ssize_t termw, ssize_t newtermw, ssize_t promptw, ssize_t cpromptw,
96
ssize_t pos, rowcol_t* rc );
97
98
// row iteration
99
typedef bool (row_fun_t)(const char* s,
100
ssize_t row, ssize_t row_start, ssize_t row_len,
101
ssize_t startw, // prompt width
102
bool is_wrap, const void* arg, void* res);
103
104
ic_private ssize_t sbuf_for_each_row( stringbuf_t* sbuf, ssize_t termw, ssize_t promptw, ssize_t cpromptw,
105
row_fun_t* fun, void* arg, void* res );
106
107
108
//-------------------------------------------------------------
109
// Strings
110
//-------------------------------------------------------------
111
112
// skip a single CSI sequence (ESC [ ...)
113
ic_private bool skip_csi_esc( const char* s, ssize_t len, ssize_t* esclen ); // used in term.c
114
115
ic_private ssize_t str_column_width( const char* s );
116
ic_private ssize_t str_prev_ofs( const char* s, ssize_t pos, ssize_t* cwidth );
117
ic_private ssize_t str_next_ofs( const char* s, ssize_t len, ssize_t pos, ssize_t* cwidth );
118
ic_private ssize_t str_skip_until_fit( const char* s, ssize_t max_width); // tail that fits
119
ic_private ssize_t str_take_while_fit( const char* s, ssize_t max_width); // prefix that fits
120
121
#endif // IC_STRINGBUF_H
122
123