#ifndef ISTRINGS_H
#define ISTRINGS_H

#define IPL_OPEN_BRACE      "{"
#define IPL_CLOSE_BRACE     "}"
#define IPL_OPEN_BRACKET    "("
#define IPL_CLOSE_BRACKET   ")"
#define IPL_COMMA           ","
#define IPL_DOT             "."
#define IPL_SEMICOLON       ";"
#define IPL_BASENAME        "ipl"
#define IPL_COMMENT_CHAR    '#'
#define IPL_DOT_CHAR        ','     /* decimal separator */

EXTERN_STRING(ipl_usage)
EXTERN_STRING(ipl_exit_status)
EXTERN_STRING(ipl_integer)
EXTERN_STRING(ipl_key_global)
EXTERN_STRING(ipl_key_random_seed)
EXTERN_STRING(ipl_key_alias)
EXTERN_STRING(ipl_unable_to_open)
EXTERN_STRING(ipl_success)
EXTERN_STRING(ipl_error)

EXTERN_STRING(ipl_open_brace)
EXTERN_STRING(ipl_close_brace)
EXTERN_STRING(ipl_open_bracket)
EXTERN_STRING(ipl_close_bracket)
EXTERN_STRING(ipl_comma)
EXTERN_STRING(ipl_key_void)
EXTERN_STRING(ipl_key_true)
EXTERN_STRING(ipl_key_false)
EXTERN_STRING(ipl_key_rgb)
EXTERN_STRING(ipl_key_rgba)
EXTERN_STRING(ipl_key_hsv)
EXTERN_STRING(ipl_key_cie)
EXTERN_STRING(ipl_desc_rgb)
EXTERN_STRING(ipl_desc_rgba)
EXTERN_STRING(ipl_desc_hsv)
EXTERN_STRING(ipl_desc_cie)
EXTERN_STRING(ipl_key_red)
EXTERN_STRING(ipl_key_green)
EXTERN_STRING(ipl_key_blue)
EXTERN_STRING(ipl_key_alpha)
EXTERN_STRING(ipl_key_hue)
EXTERN_STRING(ipl_key_saturation)
EXTERN_STRING(ipl_key_value)
EXTERN_STRING(ipl_key_cieX)
EXTERN_STRING(ipl_key_cieY)
EXTERN_STRING(ipl_key_cieZ)
EXTERN_STRING(ipl_key_output)
EXTERN_STRING(ipl_key_targets)
EXTERN_STRING(ipl_key_matrix)
EXTERN_STRING(ipl_desc_matrix)
EXTERN_STRING(ipl_key_vector)
EXTERN_STRING(ipl_desc_vector)
EXTERN_STRING(ipl_key_decomposition)
EXTERN_STRING(ipl_desc_decomposition)
EXTERN_STRING(ipl_key_state)
EXTERN_STRING(ipl_tab_string)
EXTERN_STRING(ipl_eol_string)
/* decomp.c::iplSaveDecompositionDescription */
EXTERN_STRING(ipl_key_source_dimension)
EXTERN_STRING(ipl_key_depth_range)
EXTERN_STRING(ipl_key_area_range)
EXTERN_STRING(ipl_key_value_range)
EXTERN_STRING(ipl_key_at_depth)
EXTERN_STRING(ipl_key_leafs)
EXTERN_STRING(ipl_key_values)
EXTERN_STRING(ipl_key_histogram)
EXTERN_STRING(ipl_run_time_fmt)

/* generic operations */

EXTERN_STRING(ipl_key_generic_constant)
EXTERN_STRING(ipl_desc_generic_constant)
EXTERN_STRING(ipl_key_generic_uniform)
EXTERN_STRING(ipl_desc_generic_uniform)
EXTERN_STRING(ipl_key_generic_gaussian)
EXTERN_STRING(ipl_desc_generic_gaussian)
EXTERN_STRING(ipl_key_generic_puts)
EXTERN_STRING(ipl_desc_generic_puts)
EXTERN_STRING(ipl_key_generic_run_time)
EXTERN_STRING(ipl_desc_generic_run_time)

/* matrix operations */
EXTERN_STRING(ipl_key_matrix_copy)
EXTERN_STRING(ipl_desc_matrix_copy)
EXTERN_STRING(ipl_key_matrix_input)
EXTERN_STRING(ipl_desc_matrix_input)
EXTERN_STRING(ipl_key_matrix_shift)
EXTERN_STRING(ipl_desc_matrix_shift)
EXTERN_STRING(ipl_key_matrix_mirror)
EXTERN_STRING(ipl_desc_matrix_mirror)
EXTERN_STRING(ipl_key_matrix_transpose)
EXTERN_STRING(ipl_desc_matrix_transpose)
EXTERN_STRING(ipl_key_matrix_expand)
EXTERN_STRING(ipl_desc_matrix_expand)
EXTERN_STRING(ipl_key_matrix_expand_powers2)
EXTERN_STRING(ipl_desc_matrix_expand_powers2)
EXTERN_STRING(ipl_key_matrix_get)
EXTERN_STRING(ipl_desc_matrix_get)
EXTERN_STRING(ipl_key_matrix_set_elem)
EXTERN_STRING(ipl_desc_matrix_set_elem)
EXTERN_STRING(ipl_key_matrix_set_rect)
EXTERN_STRING(ipl_desc_matrix_set_rect)
EXTERN_STRING(ipl_key_matrix_resize)
EXTERN_STRING(ipl_desc_matrix_resize)
EXTERN_STRING(ipl_key_matrix_save)
EXTERN_STRING(ipl_desc_matrix_save)
EXTERN_STRING(ipl_key_matrix_load)
EXTERN_STRING(ipl_desc_matrix_load)
EXTERN_STRING(ipl_key_tga) /* used by matrix_save/load32_op */
EXTERN_STRING(ipl_key_matrix_save32)
EXTERN_STRING(ipl_desc_matrix_save32)
EXTERN_STRING(ipl_key_matrix_load32)
EXTERN_STRING(ipl_desc_matrix_load32)
EXTERN_STRING(ipl_key_matrix_row_linear)
EXTERN_STRING(ipl_desc_matrix_row_linear)
EXTERN_STRING(ipl_key_matrix_col_linear)
EXTERN_STRING(ipl_desc_matrix_col_linear)
EXTERN_STRING(ipl_key_matrix_fourier_forward)
EXTERN_STRING(ipl_desc_matrix_fourier_forward)
EXTERN_STRING(ipl_key_matrix_fourier_inverse)
EXTERN_STRING(ipl_desc_matrix_fourier_inverse)
EXTERN_STRING(ipl_key_matrix_scale)
EXTERN_STRING(ipl_desc_matrix_scale)
EXTERN_STRING(ipl_key_matrix_offset)
EXTERN_STRING(ipl_desc_matrix_offset)
EXTERN_STRING(ipl_key_matrix_mat_offset)
EXTERN_STRING(ipl_desc_matrix_mat_offset)
EXTERN_STRING(ipl_key_matrix_mat_scale)
EXTERN_STRING(ipl_desc_matrix_mat_scale)
EXTERN_STRING(ipl_key_matrix_mat_unscale)
EXTERN_STRING(ipl_desc_matrix_mat_unscale)
EXTERN_STRING(ipl_key_matrix_zero_rows)
EXTERN_STRING(ipl_desc_matrix_zero_rows)
EXTERN_STRING(ipl_key_matrix_zero_cols)
EXTERN_STRING(ipl_desc_matrix_zero_cols)
EXTERN_STRING(ipl_key_matrix_convolve3x3)
EXTERN_STRING(ipl_desc_matrix_convolve3x3)
EXTERN_STRING(ipl_key_matrix_band_reject)
EXTERN_STRING(ipl_desc_matrix_band_reject)
EXTERN_STRING(ipl_key_matrix_band_pass)
EXTERN_STRING(ipl_desc_matrix_band_pass)
EXTERN_STRING(ipl_key_matrix_adjust_contrast)
EXTERN_STRING(ipl_desc_matrix_adjust_contrast)
EXTERN_STRING(ipl_key_matrix_normalize)
EXTERN_STRING(ipl_desc_matrix_normalize)
EXTERN_STRING(ipl_key_matrix_range_normalize)
EXTERN_STRING(ipl_desc_matrix_range_normalize)
EXTERN_STRING(ipl_key_matrix_gamma_correction)
EXTERN_STRING(ipl_desc_matrix_gamma_correction)
EXTERN_STRING(ipl_key_matrix_draw_decomposition)
EXTERN_STRING(ipl_desc_matrix_draw_decomposition)
EXTERN_STRING(ipl_key_matrix_draw_decomposition_scale)
EXTERN_STRING(ipl_desc_matrix_draw_decomposition_scale)
EXTERN_STRING(ipl_key_matrix_draw_decomposition_linear)
EXTERN_STRING(ipl_desc_matrix_draw_decomposition_linear)
EXTERN_STRING(ipl_key_matrix_matrix_transform)
EXTERN_STRING(ipl_desc_matrix_matrix_transform)
EXTERN_STRING(ipl_key_matrix_cartesian_transform)
EXTERN_STRING(ipl_desc_matrix_cartesian_transform)
EXTERN_STRING(ipl_key_matrix_polar_transform)
EXTERN_STRING(ipl_desc_matrix_polar_transform)
EXTERN_STRING(ipl_key_matrix_matrix_pair_transform)
EXTERN_STRING(ipl_desc_matrix_matrix_pair_transform)
EXTERN_STRING(ipl_key_matrix_cartesian_pair_transform)
EXTERN_STRING(ipl_desc_matrix_cartesian_pair_transform)
EXTERN_STRING(ipl_key_matrix_polar_pair_transform)
EXTERN_STRING(ipl_desc_matrix_polar_pair_transform)
EXTERN_STRING(ipl_key_matrix_spectrum)
EXTERN_STRING(ipl_desc_matrix_spectrum)

/* vector operations */

EXTERN_STRING(ipl_key_vector_copy)
EXTERN_STRING(ipl_desc_vector_copy)
EXTERN_STRING(ipl_key_vector_shift)
EXTERN_STRING(ipl_desc_vector_shift)
EXTERN_STRING(ipl_key_vector_mirror)
EXTERN_STRING(ipl_desc_vector_mirror)
EXTERN_STRING(ipl_key_vector_save)
EXTERN_STRING(ipl_desc_vector_save)
EXTERN_STRING(ipl_key_vector_load)
EXTERN_STRING(ipl_desc_vector_load)
EXTERN_STRING(ipl_key_vector_linear)
EXTERN_STRING(ipl_desc_vector_linear)
EXTERN_STRING(ipl_key_vector_histogram)
EXTERN_STRING(ipl_desc_vector_histogram)
EXTERN_STRING(ipl_key_vector_range_histogram)
EXTERN_STRING(ipl_desc_vector_range_histogram)
EXTERN_STRING(ipl_key_vector_histogram_with_coords)
EXTERN_STRING(ipl_desc_vector_histogram_with_coords)
EXTERN_STRING(ipl_key_vector_range_histogram_with_coords)
EXTERN_STRING(ipl_desc_vector_range_histogram_with_coords)
EXTERN_STRING(ipl_key_vector_integrate)
EXTERN_STRING(ipl_desc_vector_integrate)
EXTERN_STRING(ipl_key_vector_normalize)
EXTERN_STRING(ipl_desc_vector_normalize)
EXTERN_STRING(ipl_key_vector_range_normalize)
EXTERN_STRING(ipl_desc_vector_range_normalize)
EXTERN_STRING(ipl_key_vector_vector_transform)
EXTERN_STRING(ipl_desc_vector_vector_transform)
EXTERN_STRING(ipl_key_vector_vector_pair_transform)
EXTERN_STRING(ipl_desc_vector_vector_pair_transform)

/* decomposition operations */

EXTERN_STRING(ipl_key_decomposition_decompose)
EXTERN_STRING(ipl_desc_decomposition_decompose)
EXTERN_STRING(ipl_key_decomposition_save)
EXTERN_STRING(ipl_desc_decomposition_save)

/* help strings */

EXTERN_STRING(ipl_valid_class_ops_fmt)

/* built-in functions */

EXTERN_STRING(ipl_key_width_of)
EXTERN_STRING(ipl_desc_width_of)
EXTERN_STRING(ipl_key_height_of)
EXTERN_STRING(ipl_desc_height_of)
EXTERN_STRING(ipl_key_size_of)
EXTERN_STRING(ipl_desc_size_of)
EXTERN_STRING(ipl_key_depth_of)
EXTERN_STRING(ipl_desc_depth_of)
EXTERN_STRING(ipl_key_user_input)
EXTERN_STRING(ipl_desc_user_input)

/*
 * Keys and descriptions for ipltrans.c. The global string can't be used
 * because of definition of the nsl_var_entry_t.
 */

/* Built-in variables */
 
#define IPL_MAX_IDX_KEY     "$MAX_IDX"
#define IPL_MAX_IDX_DESC    "maximal index of element"

#define IPL_IDX_KEY         "$IDX"
#define IPL_IDX_DESC        "index of element"

#define IPL_ELEM_KEY        "$ELEM"
#define IPL_ELEM_DESC       "value of current element"

#define IPL_ELEM1_KEY       "$ELEM1"
#define IPL_ELEM1_DESC      "value of element of current vector"

#define IPL_ELEM2_KEY       "$ELEM2"
#define IPL_ELEM2_DESC      "value of element of other vector"

#define IPL_MAX_ROW_KEY     "$MAX_ROW"
#define IPL_MAX_ROW_DESC    "maximal index of row"

#define IPL_MAX_COL_KEY     "$MAX_COL"
#define IPL_MAX_COL_DESC    "maximal index of column"

#define IPL_ROW_KEY         "$ROW"
#define IPL_ROW_DESC        "current row"

#define IPL_COL_KEY         "$COL"
#define IPL_COL_DESC        "current column"

#define IPL_CELL_KEY        "$CELL"
#define IPL_CELL_DESC       "value of current cell"

#define IPL_CELL1_KEY       "$CELL1"
#define IPL_CELL1_DESC      "value of element of current matrix"

#define IPL_CELL2_KEY       "$CELL2"
#define IPL_CELL2_DESC      "value of element of other matrix"

#define IPL_NEG_FREQ_KEY    "$NEG_FREQ"
#define IPL_NEG_FREQ_DESC   "one means negative frequency"

#define IPL_RE_KEY          "$RE"
#define IPL_RE_DESC         "real part of current FT cell"

#define IPL_IM_KEY          "$IM"
#define IPL_IM_DESC         "imaginary part of current FT cell"

#define IPL_RE1_KEY         "$RE1"
#define IPL_RE1_DESC        "real part of cell of current FT"

#define IPL_IM1_KEY         "$IM1"
#define IPL_IM1_DESC        "imaginary part of cell of current FT"

#define IPL_RE2_KEY         "$RE2"
#define IPL_RE2_DESC        "real part of cell of other FT"

#define IPL_IM2_KEY         "$IM2"
#define IPL_IM2_DESC        "imaginary part of cell of other FT"

#define IPL_MAG_KEY         "$MAG"
#define IPL_MAG_DESC        "magnitude of current FT cell"

#define IPL_PHASE_KEY       "$PHASE"
#define IPL_PHASE_DESC      "phase of current FT cell"

#define IPL_MAG1_KEY        "$MAG1"
#define IPL_MAG1_DESC       "magnitude of cell of current FT"

#define IPL_PHASE1_KEY      "$PHASE1"
#define IPL_PHASE1_DESC     "phase of cell of current FT"

#define IPL_MAG2_KEY        "$MAG2"
#define IPL_MAG2_DESC       "magnitude of cell of other FT"

#define IPL_PHASE2_KEY      "$PHASE2"
#define IPL_PHASE2_DESC     "phase of cell of other FT"

/* constants */

#define IPL_PI_KEY          "Pi"
#define IPL_PI_DESC         "Pi = 3.14159265358979312..."

#define IPL_E_KEY           "E"
#define IPL_E_DESC          "e = 2.71828182845904509..."

#define IPL_MAXREAL_KEY     "MAXREAL"
#define IPL_MAXREAL_DESC    "maximal value of 'real' variable"
#define IPL_REAL_ZERO_KEY   "REAL_ZERO"
#define IPL_REAL_ZERO_DESC  "small, but still invertible value of 'real' variable"

EXTERN_STRING(ipl_key_step)
EXTERN_STRING(ipl_key_pass)

#define IPL_VECTOR_TRANSFORM_KEY    "vector_transform"
#define IPL_VECTOR_TRANSFORM_DESC \
    "iterates through elements of vector"

#define IPL_VECTOR_PAIR_TRANSFORM_KEY   "vector_pair_transform"
#define IPL_VECTOR_PAIR_TRANSFORM_DESC \
    "iterates through elements of two vectors"

#define IPL_MATRIX_TRANSFORM_KEY    "matrix_transform"
#define IPL_MATRIX_TRANSFORM_DESC \
    "iterates through elements of matrix"

#define IPL_MATRIX_PAIR_TRANSFORM_KEY   "matrix_pair_transform"
#define IPL_MATRIX_PAIR_TRANSFORM_DESC \
    "iterates through elements of two matrices"

#define IPL_CARTESIAN_TRANSFORM_KEY "cartesian_transform"
#define IPL_CARTESIAN_TRANSFORM_DESC \
    "iterates through elements of Fourier transform,\n" \
    "\t\tpassing the (Re,Im) pairs"

#define IPL_CARTESIAN_PAIR_TRANSFORM_KEY    "cartesian_pair_transform"
#define IPL_CARTESIAN_PAIR_TRANSFORM_DESC \
    "iterates through elements of two Fourier\n" \
    "\t\ttransforms, passing the (Re,Im) pairs"

#define IPL_POLAR_TRANSFORM_KEY     "polar_transform"
#define IPL_POLAR_TRANSFORM_DESC \
    "iterates through elements of Fourier transform,\n" \
    "\t\tpassing the (Magnitude,Phase) pairs"

#define IPL_POLAR_PAIR_TRANSFORM_KEY    "polar_pair_transform"
#define IPL_POLAR_PAIR_TRANSFORM_DESC \
    "iterates through elements of two Fourier\n" \
    "\t\ttransforms, passing the (Magnitude,Phase) pairs"

/* efunc.c */

EXTERN_STRING(ipl_key_function)

/* state.c */

EXTERN_STRING(ipl_key_custom_width)
EXTERN_STRING(ipl_desc_custom_width)
EXTERN_STRING(ipl_key_custom_size)
EXTERN_STRING(ipl_desc_custom_size)
EXTERN_STRING(ipl_key_custom_height)
EXTERN_STRING(ipl_desc_custom_height)
EXTERN_STRING(ipl_key_input_powers2)
EXTERN_STRING(ipl_desc_input_powers2)
EXTERN_STRING(ipl_key_input_square)
EXTERN_STRING(ipl_desc_input_square)
EXTERN_STRING(ipl_key_frequency_domain)
EXTERN_STRING(ipl_desc_frequency_domain)
EXTERN_STRING(ipl_key_pad_value)
EXTERN_STRING(ipl_desc_pad_value)
EXTERN_STRING(ipl_key_signed)
EXTERN_STRING(ipl_key_unsigned)
EXTERN_STRING(ipl_key_boolean)
EXTERN_STRING(ipl_key_real)
EXTERN_STRING(ipl_key_unknown_type)
EXTERN_STRING(ipl_key_dump)

#endif  /* !ISTRINGS_H */

void iplHelp(void);
