/* * retrieve hscale,hoffset,usfoffset and usfheight from EEPROM */ void get_config(void) { if(get_config_word(&cfgMagic)==MAGIC) { hscale= get_config_float(&cfgHScale); hoffset= get_config_float(&cfgHOffset); usfoffset= get_config_float(&cfgUSFOffset); usfheight= get_config_float(&cfgUSFHeight); } else { set_hconfig(HSCALE_DEFAULT, HOFFSET_DEFAULT); set_usfconfig(USFOFFSET_DEFAULT, USFHEIGHT_DEFAULT); set_config_word(&cfgMagic, MAGIC); } }
cmd_rec *pr_parser_parse_line(pool *p, const char *text, size_t text_len) { register unsigned int i; char *arg = "", *ptr, *word = NULL; cmd_rec *cmd = NULL; pool *sub_pool = NULL; array_header *arr = NULL; if (p == NULL || text == NULL) { errno = EINVAL; return NULL; } if (text_len == 0) { text_len = strlen(text); } if (text_len == 0) { errno = ENOENT; return NULL; } ptr = (char *) text; /* Build a new pool for the command structure and array */ sub_pool = make_sub_pool(p); pr_pool_tag(sub_pool, "parser cmd subpool"); cmd = pcalloc(sub_pool, sizeof(cmd_rec)); cmd->pool = sub_pool; cmd->stash_index = -1; cmd->stash_hash = 0; /* Add each word to the array */ arr = make_array(cmd->pool, 4, sizeof(char **)); while ((word = pr_str_get_word(&ptr, 0)) != NULL) { char *ptr2; pr_signals_handle(); ptr2 = get_config_word(cmd->pool, word); *((char **) push_array(arr)) = ptr2; cmd->argc++; } /* Terminate the array with a NULL. */ *((char **) push_array(arr)) = NULL; /* The array header's job is done, we can forget about it and * it will get purged when the command's pool is destroyed. */ cmd->argv = (void **) arr->elts; /* Perform a fixup on configuration directives so that: * * -argv[0]-- -argv[1]-- ----argv[2]----- * <Option /etc/adir /etc/anotherdir> * * becomes: * * -argv[0]-- -argv[1]- ----argv[2]---- * <Option> /etc/adir /etc/anotherdir */ if (cmd->argc && *((char *) cmd->argv[0]) == '<') { char *cp; size_t cp_len; cp = cmd->argv[cmd->argc-1]; cp_len = strlen(cp); if (*(cp + cp_len-1) == '>' && cmd->argc > 1) { if (strncmp(cp, ">", 2) == 0) { cmd->argv[cmd->argc-1] = NULL; cmd->argc--; } else { *(cp + cp_len-1) = '\0'; } cp = cmd->argv[0]; cp_len = strlen(cp); if (*(cp + cp_len-1) != '>') { cmd->argv[0] = pstrcat(cmd->pool, cp, ">", NULL); } } } if (cmd->argc < 2) { arg = pstrdup(cmd->pool, arg); } for (i = 1; i < cmd->argc; i++) { arg = pstrcat(cmd->pool, arg, *arg ? " " : "", cmd->argv[i], NULL); } cmd->arg = arg; return cmd; }
cmd_rec *pr_parser_parse_line(pool *p) { register unsigned int i; char buf[PR_TUNABLE_BUFFER_SIZE+1], *arg = "", *word = NULL; cmd_rec *cmd = NULL; pool *sub_pool = NULL; array_header *arr = NULL; if (p == NULL) { errno = EINVAL; return NULL; } memset(buf, '\0', sizeof(buf)); while (pr_parser_read_line(buf, sizeof(buf)-1) != NULL) { char *bufp = buf; pr_signals_handle(); /* Build a new pool for the command structure and array */ sub_pool = make_sub_pool(p); pr_pool_tag(sub_pool, "parser cmd subpool"); cmd = pcalloc(sub_pool, sizeof(cmd_rec)); cmd->pool = sub_pool; cmd->stash_index = -1; cmd->stash_hash = 0; /* Add each word to the array */ arr = make_array(cmd->pool, 4, sizeof(char **)); while ((word = pr_str_get_word(&bufp, 0)) != NULL) { char *tmp; tmp = get_config_word(cmd->pool, word); *((char **) push_array(arr)) = tmp; cmd->argc++; } /* Terminate the array with a NULL. */ *((char **) push_array(arr)) = NULL; /* The array header's job is done, we can forget about it and * it will get purged when the command's pool is destroyed. */ cmd->argv = (char **) arr->elts; /* Perform a fixup on configuration directives so that: * * -argv[0]-- -argv[1]-- ----argv[2]----- * <Option /etc/adir /etc/anotherdir> * * becomes: * * -argv[0]-- -argv[1]- ----argv[2]---- * <Option> /etc/adir /etc/anotherdir */ if (cmd->argc && *(cmd->argv[0]) == '<') { char *cp = cmd->argv[cmd->argc-1]; if (*(cp + strlen(cp)-1) == '>' && cmd->argc > 1) { if (strncmp(cp, ">", 2) == 0) { cmd->argv[cmd->argc-1] = NULL; cmd->argc--; } else { *(cp + strlen(cp)-1) = '\0'; } cp = cmd->argv[0]; if (*(cp + strlen(cp)-1) != '>') { cmd->argv[0] = pstrcat(cmd->pool, cp, ">", NULL); } } } if (cmd->argc < 2) { arg = pstrdup(cmd->pool, arg); } for (i = 1; i < cmd->argc; i++) { arg = pstrcat(cmd->pool, arg, *arg ? " " : "", cmd->argv[i], NULL); } cmd->arg = arg; return cmd; } return NULL; }