/* Parses the NUMERIC command. */ int cmd_numeric (struct lexer *lexer, struct dataset *ds) { size_t i; /* Names of variables to create. */ char **v; size_t nv; do { /* Format spec for variables to create. f.type==-1 if default is to be used. */ struct fmt_spec f; if (!parse_DATA_LIST_vars (lexer, dataset_dict (ds), &v, &nv, PV_NO_DUPLICATE)) return CMD_FAILURE; /* Get the optional format specification. */ if (lex_match (lexer, T_LPAREN)) { if (!parse_format_specifier (lexer, &f)) goto fail; if ( ! fmt_check_output (&f)) goto fail; if (fmt_is_string (f.type)) { char str[FMT_STRING_LEN_MAX + 1]; msg (SE, _("Format type %s may not be used with a numeric " "variable."), fmt_to_string (&f, str)); goto fail; } if (!lex_match (lexer, T_RPAREN)) { lex_error_expecting (lexer, "`)'", NULL_SENTINEL); goto fail; } } else f.type = -1; /* Create each variable. */ for (i = 0; i < nv; i++) { struct variable *new_var = dict_create_var (dataset_dict (ds), v[i], 0); if (!new_var) msg (SE, _("There is already a variable named %s."), v[i]); else { if (f.type != -1) var_set_both_formats (new_var, &f); } } /* Clean up. */ for (i = 0; i < nv; i++) free (v[i]); free (v); } while (lex_match (lexer, T_SLASH)); return CMD_SUCCESS; /* If we have an error at a point where cleanup is required, flow-of-control comes here. */ fail: for (i = 0; i < nv; i++) free (v[i]); free (v); return CMD_FAILURE; }
void EEL_Editor::draw_string(int *ml, int *skipcnt, const char *str, int amt, int *attr, int newAttr, int comment_string_state) { if (amt > 0 && comment_string_state=='"') { while (amt > 0 && *str) { const char *str_scan = str; int varpos,varlen,l=0; while (!l && *str_scan) { while (*str_scan && *str_scan != '%' && str_scan < str+amt) str_scan++; if (str_scan >= str+amt) break; l = parse_format_specifier(str_scan,&varpos,&varlen); if (!l && *str_scan) if (*++str_scan == '%') str_scan++; } if (!*str_scan || str_scan >= str+amt) break; // allow default processing to happen if we reached the end of the string if (l > amt) l=amt; if (str_scan > str) { const int sz=wdl_min(str_scan-str,amt); draw_string_urlchk(ml,skipcnt,str,sz,attr,newAttr); str += sz; amt -= sz; } { const int sz=(varlen>0) ? wdl_min(varpos,amt) : wdl_min(l,amt); if (sz>0) { draw_string_internal(ml,skipcnt,str,sz,attr,SYNTAX_HIGHLIGHT2); str += sz; amt -= sz; } } if (varlen>0) { int sz = wdl_min(varlen,amt); if (sz>0) { draw_string_internal(ml,skipcnt,str,sz,attr,*str == '#' ? SYNTAX_STRINGVAR : SYNTAX_HIGHLIGHT1); amt -= sz; str += sz; } sz = wdl_min(l - varpos - varlen, amt); if (sz>0) { draw_string_internal(ml,skipcnt,str,sz,attr,SYNTAX_HIGHLIGHT2); amt-=sz; str+=sz; } } } } draw_string_urlchk(ml,skipcnt,str,amt,attr,newAttr); }
/* Parses the STRING command. */ int cmd_string (struct lexer *lexer, struct dataset *ds) { size_t i; /* Names of variables to create. */ char **v; size_t nv; /* Format spec for variables to create. */ struct fmt_spec f; /* Width of variables to create. */ int width; do { if (!parse_DATA_LIST_vars (lexer, dataset_dict (ds), &v, &nv, PV_NO_DUPLICATE)) return CMD_FAILURE; if (!lex_force_match (lexer, T_LPAREN) || !parse_format_specifier (lexer, &f) || !lex_force_match (lexer, T_RPAREN)) goto fail; if (!fmt_is_string (f.type)) { char str[FMT_STRING_LEN_MAX + 1]; msg (SE, _("Format type %s may not be used with a string " "variable."), fmt_to_string (&f, str)); goto fail; } if (!fmt_check_output (&f)) goto fail; width = fmt_var_width (&f); /* Create each variable. */ for (i = 0; i < nv; i++) { struct variable *new_var = dict_create_var (dataset_dict (ds), v[i], width); if (!new_var) msg (SE, _("There is already a variable named %s."), v[i]); else var_set_both_formats (new_var, &f); } /* Clean up. */ for (i = 0; i < nv; i++) free (v[i]); free (v); } while (lex_match (lexer, T_SLASH)); return CMD_SUCCESS; /* If we have an error at a point where cleanup is required, flow-of-control comes here. */ fail: for (i = 0; i < nv; i++) free (v[i]); free (v); return CMD_FAILURE; }