The wrap support for IKI (using open and close brackets '[' (U+005B) ']' (U+005D)) has been recently added to the specification.
This updates the project to be in compliance.
const f_array_length_t delimits_used = data->delimits.used;
uint8_t quote = 0;
+ uint8_t wrapped = F_false; // 0x0 (false) = not wapped, 0x1 (true) = wrapped, 0x2 = valid wrapped.
do {
}
if (state->status == F_true) {
- found_vocabulary.start = range->start;
- found_vocabulary.stop = range->start;
+ if (!wrapped) {
+ found_vocabulary.start = range->start;
+ found_vocabulary.stop = range->start;
+ }
state->status = f_utf_buffer_increment(*buffer, range, 1);
if (F_status_is_error(state->status)) break;
break;
}
+ // Wrapped must be followed by a valid vocabulary name.
+ if (buffer->string[range->start] == f_iki_syntax_wrap_open_s.string[0]) {
+ found_vocabulary.start = range->start;
+ found_vocabulary.stop = range->start;
+
+ wrapped = F_true;
+ }
+ else if (wrapped) {
+ wrapped = F_false;
+ }
+
state->status = f_utf_buffer_increment(*buffer, range, 1);
if (F_status_is_error(state->status)) break;
} // while
}
if (buffer->string[range->start] == f_iki_syntax_separator_s.string[0]) {
+
+ // Wrapped must close in a wrap close before the seperator.
+ if (wrapped == F_true) {
+ state->status = F_next;
+
+ break;
+ }
+
do {
state->status = f_utf_buffer_increment(*buffer, range, 1);
} while (F_status_is_fine(state->status) && buffer->string[range->start] == f_iki_syntax_placeholder_s.string[0] && range->start <= range->stop && range->start < buffer->used);
if (state->status == F_true) break;
if (F_status_is_error(state->status) || range->start > range->stop || range->start >= buffer->used || state->status == F_next) break;
}
+ else if (buffer->string[range->start] == f_iki_syntax_wrap_open_s.string[0]) {
+ state->status = F_next;
+
+ break;
+ }
+ else if (wrapped == F_true && buffer->string[range->start] == f_iki_syntax_wrap_close_s.string[0]) {
+ wrapped = 0x2;
+ found_vocabulary.stop = range->start;
+ }
+ else if (wrapped == 0x2) {
+
+ // Wrapped close must be immediately before a separator (ignoring any placeholders in between).
+ state->status = F_next;
+
+ break;
+ }
else {
width_max = buffer->used - range->start;
if (state->status == F_true) {
found_vocabulary.stop = range->start;
}
-
- // Not a valid IKI vocabulary name.
else {
+
+ // Not a valid IKI vocabulary name.
state->status = f_utf_buffer_increment(*buffer, range, 1);
if (F_status_is_error(state->status)) break;
if (state->status == F_next) {
quote = 0;
+ wrapped = F_false;
continue;
}
data->variable.array[data->variable.used].start = found_vocabulary.start;
data->variable.array[data->variable.used++].stop = range->start;
- data->vocabulary.array[data->vocabulary.used].start = found_vocabulary.start;
- data->vocabulary.array[data->vocabulary.used++].stop = found_vocabulary.stop;
+ data->vocabulary.array[data->vocabulary.used].start = wrapped ? found_vocabulary.start + f_iki_syntax_wrap_open_s.used : found_vocabulary.start;
+ data->vocabulary.array[data->vocabulary.used++].stop = wrapped ? found_vocabulary.stop - f_iki_syntax_wrap_close_s.used : found_vocabulary.stop;
data->content.array[data->content.used].start = found_content;
data->content.array[data->content.used++].stop = range->start - 1;
data->variable.array[data->variable.used].start = found_vocabulary.start;
data->variable.array[data->variable.used++].stop = range->start;
- data->vocabulary.array[data->vocabulary.used].start = found_vocabulary.start;
- data->vocabulary.array[data->vocabulary.used++].stop = found_vocabulary.stop;
+ data->vocabulary.array[data->vocabulary.used].start = wrapped ? found_vocabulary.start + f_iki_syntax_wrap_open_s.used : found_vocabulary.start;
+ data->vocabulary.array[data->vocabulary.used++].stop = wrapped ? found_vocabulary.stop - f_iki_syntax_wrap_close_s.used : found_vocabulary.stop;
data->content.array[data->content.used].start = found_content;
data->content.array[data->content.used++].stop = range->start - 1;
} // while
quote = 0;
+ wrapped = F_false;
}
if (F_status_is_error(state->status) || range->start > range->stop || range->start >= buffer->used) break;
#ifndef _di_f_iki_syntax_slash_s_
const f_string_static_t f_iki_syntax_slash_s = macro_f_string_static_t_initialize(F_iki_syntax_slash_s, 0, F_iki_syntax_slash_s_length);
#endif // _di_f_iki_syntax_slash_s_
+
+ #ifndef _di_f_iki_syntax_wrap_open_s_
+ const f_string_static_t f_iki_syntax_wrap_open_s = macro_f_string_static_t_initialize(F_iki_syntax_wrap_open_s, 0, F_iki_syntax_wrap_open_s_length);
+ #endif // _di_f_iki_syntax_wrap_open_s_
+
+ #ifndef _di_f_iki_syntax_wrap_close_s_
+ const f_string_static_t f_iki_syntax_wrap_close_s = macro_f_string_static_t_initialize(F_iki_syntax_wrap_close_s, 0, F_iki_syntax_wrap_close_s_length);
+ #endif // _di_f_iki_syntax_wrap_close_s_
#endif //_di_f_iki_syntax_s_
#ifndef _di_f_iki_vocabulary_0001_s_
#define F_iki_syntax_quote_double_s F_string_ascii_quote_double_s
#define F_iki_syntax_quote_single_s F_string_ascii_quote_single_s
#define F_iki_syntax_slash_s F_string_ascii_slash_backward_s
+ #define F_iki_syntax_wrap_open_s F_string_ascii_bracket_open_s
+ #define F_iki_syntax_wrap_close_s F_string_ascii_bracket_close_s
#define F_iki_syntax_separator_s_length F_string_ascii_colon_s_length
#define F_iki_syntax_placeholder_s_length F_string_placeholder_s_length
#define F_iki_syntax_quote_double_s_length F_string_ascii_quote_double_s_length
#define F_iki_syntax_quote_single_s_length F_string_ascii_quote_single_s_length
#define F_iki_syntax_slash_s_length F_string_ascii_slash_backward_s_length
+ #define F_iki_syntax_wrap_open_s_length F_string_ascii_bracket_open_s_length
+ #define F_iki_syntax_wrap_close_s_length F_string_ascii_bracket_close_s_length
#ifndef _di_f_iki_syntax_separator_s_
extern const f_string_static_t f_iki_syntax_separator_s;
#ifndef _di_f_iki_syntax_slash_s_
extern const f_string_static_t f_iki_syntax_slash_s;
#endif // _di_f_iki_syntax_slash_s_
+
+ #ifndef _di_f_iki_syntax_wrap_open_s_
+ extern const f_string_static_t f_iki_syntax_wrap_open_s;
+ #endif // _di_f_iki_syntax_wrap_open_s_
+
+ #ifndef _di_f_iki_syntax_wrap_close_s_
+ extern const f_string_static_t f_iki_syntax_wrap_close_s;
+ #endif // _di_f_iki_syntax_wrap_close_s_
#endif //_di_f_iki_syntax_s_
#ifndef _di_f_iki_vocabulary_0001_s_
return;
}
+ if (main->parameters.array[iki_write_parameter_wrap_e].result & f_console_result_found_e) {
+ setting->flag |= iki_write_main_flag_wrap_e;
+ }
+
setting->quote = f_iki_syntax_quote_double_s;
if (main->parameters.array[iki_write_parameter_double_e].result & f_console_result_found_e) {
const f_string_static_t iki_write_short_file_s = macro_f_string_static_t_initialize(IKI_WRITE_short_file_s, 0, IKI_WRITE_short_file_s_length);
const f_string_static_t iki_write_short_object_s = macro_f_string_static_t_initialize(IKI_WRITE_short_object_s, 0, IKI_WRITE_short_object_s_length);
const f_string_static_t iki_write_short_single_s = macro_f_string_static_t_initialize(IKI_WRITE_short_single_s, 0, IKI_WRITE_short_single_s_length);
+ const f_string_static_t iki_write_short_wrap_s = macro_f_string_static_t_initialize(IKI_WRITE_short_wrap_s, 0, IKI_WRITE_short_wrap_s_length);
const f_string_static_t iki_write_long_backtick_s = macro_f_string_static_t_initialize(IKI_WRITE_long_backtick_s, 0, IKI_WRITE_long_backtick_s_length);
const f_string_static_t iki_write_long_content_s = macro_f_string_static_t_initialize(IKI_WRITE_long_content_s, 0, IKI_WRITE_long_content_s_length);
const f_string_static_t iki_write_long_file_s = macro_f_string_static_t_initialize(IKI_WRITE_long_file_s, 0, IKI_WRITE_long_file_s_length);
const f_string_static_t iki_write_long_object_s = macro_f_string_static_t_initialize(IKI_WRITE_long_object_s, 0, IKI_WRITE_long_object_s_length);
const f_string_static_t iki_write_long_single_s = macro_f_string_static_t_initialize(IKI_WRITE_long_single_s, 0, IKI_WRITE_long_single_s_length);
+ const f_string_static_t iki_write_long_wrap_s = macro_f_string_static_t_initialize(IKI_WRITE_long_wrap_s, 0, IKI_WRITE_long_wrap_s_length);
#endif // _di_iki_write_parameter_s_
#ifdef __cplusplus
#define IKI_WRITE_short_file_s "f"
#define IKI_WRITE_short_object_s "o"
#define IKI_WRITE_short_single_s "s"
+ #define IKI_WRITE_short_wrap_s "w"
#define IKI_WRITE_long_backtick_s "backtick"
#define IKI_WRITE_long_content_s "content"
#define IKI_WRITE_long_file_s "file"
#define IKI_WRITE_long_object_s "object"
#define IKI_WRITE_long_single_s "single"
+ #define IKI_WRITE_long_wrap_s "wrap"
#define IKI_WRITE_short_backtick_s_length 1
#define IKI_WRITE_short_content_s_length 1
#define IKI_WRITE_short_file_s_length 1
#define IKI_WRITE_short_object_s_length 1
#define IKI_WRITE_short_single_s_length 1
+ #define IKI_WRITE_short_wrap_s_length 1
#define IKI_WRITE_long_backtick_s_length 8
#define IKI_WRITE_long_content_s_length 7
#define IKI_WRITE_long_file_s_length 4
#define IKI_WRITE_long_object_s_length 6
#define IKI_WRITE_long_single_s_length 6
+ #define IKI_WRITE_long_wrap_s_length 4
extern const f_string_static_t iki_write_short_backtick_s;
extern const f_string_static_t iki_write_short_content_s;
extern const f_string_static_t iki_write_short_file_s;
extern const f_string_static_t iki_write_short_object_s;
extern const f_string_static_t iki_write_short_single_s;
+ extern const f_string_static_t iki_write_short_wrap_s;
extern const f_string_static_t iki_write_long_backtick_s;
extern const f_string_static_t iki_write_long_content_s;
extern const f_string_static_t iki_write_long_file_s;
extern const f_string_static_t iki_write_long_object_s;
extern const f_string_static_t iki_write_long_single_s;
+ extern const f_string_static_t iki_write_long_wrap_s;
#endif // _di_iki_write_parameter_s_
#ifdef __cplusplus
* - object: The Object being written is specified.
* - print_first: When set, the first character printing logic is to be processed (this is usually automatic).
* - version: Print version.
+ * - wrap: Wrap the vocabulary.
*/
#ifndef _di_iki_write_main_flag_e_
enum {
iki_write_main_flag_object_e = 0x10,
iki_write_main_flag_print_first_e = 0x20,
iki_write_main_flag_version_e = 0x40,
+ iki_write_main_flag_wrap_e = 0x80,
}; // enum
#endif // _di_iki_write_main_flag_e_
iki_write_parameter_file_e,
iki_write_parameter_object_e,
iki_write_parameter_single_e,
+ iki_write_parameter_wrap_e,
}; // enum
#define iki_write_console_parameter_t_initialize \
macro_f_console_parameter_t_initialize_3(iki_write_short_file_s, iki_write_long_file_s, 1, f_console_flag_normal_e), \
macro_f_console_parameter_t_initialize_3(iki_write_short_object_s, iki_write_long_object_s, 1, f_console_flag_normal_e), \
macro_f_console_parameter_t_initialize_3(iki_write_short_single_s, iki_write_long_single_s, 0, f_console_flag_normal_e), \
+ macro_f_console_parameter_t_initialize_3(iki_write_short_wrap_s, iki_write_long_wrap_s, 0, f_console_flag_normal_e), \
}
- #define iki_write_total_parameters_d 19
+ #define iki_write_total_parameters_d 20
#endif // _di_iki_write_parameter_e_
/**
fll_program_print_help_option(print, iki_write_short_file_s, iki_write_long_file_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Specify a file to send data to.");
fll_program_print_help_option(print, iki_write_short_object_s, iki_write_long_object_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " The Object to write.");
fll_program_print_help_option(print, iki_write_short_single_s, iki_write_long_single_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Use single quotes.");
+ fll_program_print_help_option(print, iki_write_short_wrap_s, iki_write_long_wrap_s, f_console_symbol_short_normal_s, f_console_symbol_long_normal_s, " Wrap the vocabulary name.");
f_print_dynamic_raw(f_string_eol_s, print.to);
f_print_dynamic_raw(f_string_eol_s, print.to);
return;
}
- fl_print_format("%Q%r%r%Q%r", main->output.to, object, f_iki_syntax_separator_s, setting->quote, setting->escaped, setting->quote);
+ if (setting->flag & iki_write_main_flag_wrap_e) {
+ fl_print_format("%r%Q%r%r%r%Q%r", main->output.to, f_iki_syntax_wrap_open_s, object, f_iki_syntax_wrap_close_s, f_iki_syntax_separator_s, setting->quote, setting->escaped, setting->quote);
+ }
+ else {
+ fl_print_format("%Q%r%r%Q%r", main->output.to, object, f_iki_syntax_separator_s, setting->quote, setting->escaped, setting->quote);
+ }
}
#endif // _di_iki_write_process_