ledit

Text editor (WIP)
git clone git://lumidify.org/ledit.git (fast, but not encrypted)
git clone https://lumidify.org/ledit.git (encrypted, but very slow)
git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ledit.git (over tor)
Log | Files | Refs | README | LICENSE

memory.h (2595B)


      1 #ifndef _MEMORY_H_
      2 #define _MEMORY_H_
      3 
      4 #include <stddef.h>
      5 #include <stdint.h>
      6 #include <stdarg.h>
      7 
      8 /*
      9  * These functions all wrap the regular functions but exit on error.
     10  */
     11 char *ledit_strdup(const char *s);
     12 char *ledit_strndup(const char *s, size_t n);
     13 void *ledit_malloc(size_t size);
     14 void *ledit_calloc(size_t nmemb, size_t size);
     15 void *ledit_realloc(void *ptr, size_t size);
     16 
     17 /*
     18  * This is different than the normal strcat - it allocates memory for
     19  * a new string to hold the concatenation of str1 and str2.
     20  */
     21 char *ledit_strcat(const char *str1, const char *str2);
     22 
     23 /* This acts like snprintf but automatically allocates
     24    a string of the appropriate size.
     25    Like the other functions here, it exits on error. */
     26 char *print_fmt(char *fmt, ...);
     27 
     28 /*
     29  * This is like OpenBSD's reallocarray but exits on error.
     30  */
     31 void *ledit_reallocarray(void *optr, size_t nmemb, size_t size);
     32 
     33 /*
     34  * Move the gap of a gap buffer with elements of size 'elem_size' to 'index'.
     35  * 'index' is also written to 'new_gap_ret' if it is not NULL. This is just
     36  * for convenience because it usually has to be set anyways.
     37  */
     38 void move_gap(
     39     void *array, size_t elem_size, size_t index,
     40     size_t gap, size_t cap, size_t len,
     41     size_t *new_gap_ret
     42 );
     43 
     44 /*
     45  * Resize a generic gap buffer with elements of size 'elem_size' to hold at least
     46  * 'min_size' elements and move the gap to element position 'index'.
     47  * The array size may be increased or decreased.
     48  * 'old_gap' is the old index of the gap buffer, 'old_cap' is the total length of the
     49  * array (number of elements, not bytes), and 'len' is the number of valid elements.
     50  * 'index' is also written to 'new_gap_ret' if it is not NULL. This is just
     51  * for convenience because it usually has to be set anyways.
     52  * The new total length of the array is also written to 'new_cap_ret', if it is not
     53  * NULL. If it is NULL, you're doing something wrong.
     54  * Returns the final array (might be same as the old one).
     55  */
     56 void *resize_and_move_gap(
     57     void *array, size_t elem_size,
     58     size_t old_gap, size_t old_cap, size_t len,
     59     size_t min_size, size_t index,
     60     size_t *new_gap_ret, size_t *new_cap_ret
     61 );
     62 
     63 /* FIXME: not sure if this really belongs here */
     64 void err_overflow_impl(const char *file, int line, const char *func);
     65 #define err_overflow() err_overflow_impl(__FILE__, __LINE__, __func__)
     66 
     67 /*
     68  * Return the ideal new size for an array of size 'old' when resizing it
     69  * so it fits at least 'needed' elements. The return value may be smaller
     70  * than 'old' if 'needed' is smaller.
     71  */
     72 size_t ideal_array_size(size_t old, size_t needed);
     73 
     74 #endif