neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

mark.h (2191B)


      1 #pragma once
      2 
      3 #include <locale.h>
      4 
      5 #include "nvim/ascii_defs.h"
      6 #include "nvim/ex_cmds_defs.h"  // IWYU pragma: keep
      7 #include "nvim/extmark_defs.h"  // IWYU pragma: keep
      8 #include "nvim/macros_defs.h"
      9 #include "nvim/mark_defs.h"  // IWYU pragma: keep
     10 #include "nvim/os/time.h"
     11 
     12 #include "mark.h.generated.h"
     13 #include "mark.h.inline.generated.h"
     14 
     15 /// Convert mark name to the offset
     16 static inline int mark_global_index(const char name)
     17  FUNC_ATTR_CONST
     18 {
     19  return (ASCII_ISUPPER(name)
     20          ? (name - 'A')
     21          : (ascii_isdigit(name)
     22             ? (NMARKS + (name - '0'))
     23             : -1));
     24 }
     25 
     26 /// Convert local mark name to the offset
     27 static inline int mark_local_index(const char name)
     28  FUNC_ATTR_CONST
     29 {
     30  return (ASCII_ISLOWER(name)
     31          ? (name - 'a')
     32          : (name == '"'
     33             ? NMARKS
     34             : (name == '^'
     35                ? NMARKS + 1
     36                : (name == '.'
     37                   ? NMARKS + 2
     38                   : -1))));
     39 }
     40 
     41 /// Global marks (marks with file number or name)
     42 EXTERN xfmark_T namedfm[NGLOBALMARKS] INIT( = { 0 });
     43 
     44 #define SET_FMARK(fmarkp_, mark_, fnum_, view_) \
     45  do { \
     46    fmark_T *const fmarkp__ = fmarkp_; \
     47    fmarkp__->mark = mark_; \
     48    fmarkp__->fnum = fnum_; \
     49    fmarkp__->timestamp = os_time(); \
     50    fmarkp__->view = view_; \
     51    fmarkp__->additional_data = NULL; \
     52  } while (0)
     53 
     54 /// Free and set fmark using given value
     55 #define RESET_FMARK(fmarkp_, mark_, fnum_, view_) \
     56  do { \
     57    fmark_T *const fmarkp___ = fmarkp_; \
     58    free_fmark(*fmarkp___); \
     59    SET_FMARK(fmarkp___, mark_, fnum_, view_); \
     60  } while (0)
     61 
     62 /// Set given extended mark (regular mark + file name)
     63 #define SET_XFMARK(xfmarkp_, mark_, fnum_, view_, fname_) \
     64  do { \
     65    xfmark_T *const xfmarkp__ = xfmarkp_; \
     66    xfmarkp__->fname = fname_; \
     67    SET_FMARK(&(xfmarkp__->fmark), mark_, fnum_, view_); \
     68  } while (0)
     69 
     70 /// Free and set given extended mark (regular mark + file name)
     71 #define RESET_XFMARK(xfmarkp_, mark_, fnum_, view_, fname_) \
     72  do { \
     73    xfmark_T *const xfmarkp__ = xfmarkp_; \
     74    free_xfmark(*xfmarkp__); \
     75    xfmarkp__->fname = fname_; \
     76    SET_FMARK(&(xfmarkp__->fmark), mark_, fnum_, view_); \
     77  } while (0)