#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_hsva)
EXTERN_STRING(ipl_key_cie)
EXTERN_STRING(ipl_desc_rgb)
EXTERN_STRING(ipl_desc_rgba)
EXTERN_STRING(ipl_desc_hsv)
EXTERN_STRING(ipl_desc_hsva)
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);
