Changeset 1fe89bbf2c59cbd0895409389eb9df047e96d692

Show
Ignore:
Timestamp:
02/10/08 16:20:40 (6 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1202660440 +0000
git-parent:

[efa89659d10da4930e2af74b0d0a6ca18c4c74b2]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1202660440 +0000
Message:

userdata for states, track a path and prompt

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/noit_conf.c

    r7192210 r1fe89bb  
    274274} 
    275275 
    276  
     276static void 
     277conf_t_userdata_free(void *data) { 
     278  noit_conf_t_userdata_t *info = data; 
     279  if(info) { 
     280    if(info->path) free(info->path); 
     281    free(info); 
     282  } 
     283
    277284static int 
    278285noit_console_state_conf_terminal(noit_console_closure_t ncct, 
    279286                                 int argc, char **argv, void *state) { 
     287  noit_conf_t_userdata_t *info; 
    280288  if(argc) { 
    281289    nc_printf(ncct, "extra arguments not expected.\n"); 
    282290    return -1; 
    283291  } 
     292  info = calloc(1, sizeof(*info)); 
     293  info->path = strdup("/"); 
     294  noit_console_userdata_set(ncct, NOIT_CONF_T_USERDATA, info, 
     295                            conf_t_userdata_free); 
    284296  noit_console_state_push_state(ncct, state); 
    285297  noit_console_state_init(ncct); 
     
    289301static char * 
    290302conf_t_prompt(EditLine *el) { 
     303  noit_console_closure_t ncct; 
     304  noit_conf_t_userdata_t *info; 
    291305  static char *tl = "noit(conf)# "; 
    292   return tl; 
     306  static char *pfmt = "noit(conf:%s%s)# "; 
     307  int path_len, max_len; 
     308 
     309  el_get(el, EL_USERDATA, (void *)&ncct); 
     310  if(!ncct) return tl; 
     311  info = noit_console_userdata_get(ncct, NOIT_CONF_T_USERDATA); 
     312  if(!info) return tl; 
     313 
     314  path_len = strlen(info->path); 
     315  max_len = strlen(pfmt) - 4 /* %s%s */ - 1 /* \0 */; 
     316  if(path_len > max_len) 
     317    snprintf(info->prompt, sizeof(info->prompt), 
     318             pfmt, "...", info->path + max_len - 3 /* ... */); 
     319  else 
     320    snprintf(info->prompt, sizeof(info->prompt), pfmt, "", info->path); 
     321  return info->prompt; 
    293322} 
    294323 
  • src/noit_conf.h

    re102af3 r1fe89bb  
    1212typedef enum { noit_true, noit_false } noit_conf_boolean; 
    1313typedef void * noit_conf_section_t; 
     14 
     15#define NOIT_CONF_T_USERDATA "noit::state::conf_t" 
     16typedef struct { 
     17  char *path; 
     18  char prompt[40]; 
     19} noit_conf_t_userdata_t; 
    1420 
    1521API_EXPORT(void) noit_conf_init(); 
  • src/noit_console.c

    refa8965 r1fe89bb  
    131131} 
    132132 
     133static void 
     134noit_console_userdata_free(void *data) { 
     135  noit_console_userdata_t *userdata = data; 
     136  if(userdata) { 
     137    if(userdata->name) free(userdata->name); 
     138    if(userdata->freefunc) 
     139      userdata->freefunc(userdata->data); 
     140    free(userdata); 
     141  } 
     142} 
    133143void 
    134144noit_console_closure_free(noit_console_closure_t ncct) { 
     
    139149  if(ncct->outbuf) free(ncct->outbuf); 
    140150  if(ncct->telnet) noit_console_telnet_free(ncct->telnet); 
     151  noit_hash_destroy(&ncct->userdata, NULL, noit_console_userdata_free); 
    141152  while(ncct->state_stack) { 
    142153    noit_console_state_stack_t *tmp; 
     
    152163  noit_console_closure_t new_ncct; 
    153164  new_ncct = calloc(1, sizeof(*new_ncct)); 
     165  noit_hash_init(&new_ncct->userdata); 
    154166  noit_console_state_push_state(new_ncct, noit_console_state_initial()); 
    155167  new_ncct->pty_master = -1; 
     
    157169  return new_ncct; 
    158170} 
     171 
     172void 
     173noit_console_userdata_set(struct __noit_console_closure *ncct, 
     174                          const char *name, void *data, 
     175                          state_userdata_free_func_t freefunc) { 
     176  noit_console_userdata_t *item; 
     177  item = calloc(1, sizeof(*item)); 
     178  item->name = strdup(name); 
     179  item->data = data; 
     180  item->freefunc = freefunc; 
     181  noit_hash_replace(&ncct->userdata, item->name, strlen(item->name), 
     182                    item, free, noit_console_userdata_free); 
     183} 
     184   
     185void * 
     186noit_console_userdata_get(struct __noit_console_closure *ncct, 
     187                          const char *name) { 
     188  noit_console_userdata_t *item; 
     189  if(noit_hash_retrieve(&ncct->userdata, name, strlen(name), 
     190                        (void **)&item)) 
     191    return item->data; 
     192  return NULL; 
     193} 
     194 
    159195 
    160196int 
     
    237273      history(ncct->hist, &ev, H_SETSIZE, 500); 
    238274      ncct->el = el_init("noitd", ncct->pty_master, e->fd, e->fd); 
     275      el_set(ncct->el, EL_USERDATA, ncct); 
    239276      el_set(ncct->el, EL_EDITOR, "emacs"); 
    240277      el_set(ncct->el, EL_HIST, history, ncct->hist); 
  • src/noit_console.h

    r7192210 r1fe89bb  
    2121typedef char *(*console_prompt_func_t)(EditLine *); 
    2222typedef void (*state_free_func_t)(struct _console_state *); 
     23typedef void (*state_userdata_free_func_t)(void *); 
    2324 
    24 typedef struct cmd_info
     25typedef struct
    2526  const char          *name; 
    2627  console_cmd_func_t   func; 
     
    3132extern cmd_info_t console_command_exit; 
    3233 
     34typedef struct { 
     35  char                      *name; 
     36  void                      *data; 
     37  state_userdata_free_func_t freefunc; 
     38} noit_console_userdata_t; 
     39 
     40API_EXPORT(void) 
     41  noit_console_userdata_set(struct __noit_console_closure *, 
     42                            const char *name, void *data, 
     43                            state_userdata_free_func_t freefunc); 
     44API_EXPORT(void *) 
     45  noit_console_userdata_get(struct __noit_console_closure *, 
     46                            const char *name); 
     47 
    3348typedef struct _console_state { 
    34   console_prompt_func_t  console_prompt_function; 
    35   noit_hash_table        cmds; 
    36   state_free_func_t      statefree; 
     49  console_prompt_func_t      console_prompt_function; 
     50  noit_hash_table            cmds; 
     51  state_free_func_t          statefree; 
    3752} noit_console_state_t; 
    3853 
    3954typedef struct _console_state_stack { 
    4055  noit_console_state_t *state; 
     56  void *userdata; 
    4157  struct _console_state_stack *last; 
    4258} noit_console_state_stack_t; 
     
    5066  EditLine *el; 
    5167  History *hist; 
     68  noit_hash_table userdata; 
    5269 
    5370  noit_console_state_stack_t *state_stack;