/* metaflac - Command-line FLAC metadata editor * Copyright (C) 2001-2009 Josh Coalson * Copyright (C) 2011-2023 Xiph.Org Foundation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef metaflac__options_h #define metaflac__options_h #include "FLAC/format.h" #if 0 /*[JEC] was:#if HAVE_GETOPT_LONG*/ /*[JEC] see flac/include/share/getopt.h as to why the change */ # include #else # include "share/getopt.h" #endif extern struct share__option long_options_[]; typedef enum { OP__SHOW_MD5SUM, OP__SHOW_MIN_BLOCKSIZE, OP__SHOW_MAX_BLOCKSIZE, OP__SHOW_MIN_FRAMESIZE, OP__SHOW_MAX_FRAMESIZE, OP__SHOW_SAMPLE_RATE, OP__SHOW_CHANNELS, OP__SHOW_BPS, OP__SHOW_TOTAL_SAMPLES, OP__SET_MD5SUM, OP__SET_MIN_BLOCKSIZE, OP__SET_MAX_BLOCKSIZE, OP__SET_MIN_FRAMESIZE, OP__SET_MAX_FRAMESIZE, OP__SET_SAMPLE_RATE, OP__SET_CHANNELS, OP__SET_BPS, OP__SET_TOTAL_SAMPLES, OP__SHOW_VC_VENDOR, OP__SHOW_VC_FIELD, OP__REMOVE_VC_ALL, OP__REMOVE_VC_ALL_EXCEPT, OP__REMOVE_VC_FIELD, OP__REMOVE_VC_FIRSTFIELD, OP__SET_VC_FIELD, OP__IMPORT_VC_FROM, OP__EXPORT_VC_TO, OP__IMPORT_CUESHEET_FROM, OP__EXPORT_CUESHEET_TO, OP__IMPORT_PICTURE_FROM, OP__EXPORT_PICTURE_TO, OP__ADD_SEEKPOINT, OP__ADD_REPLAY_GAIN, OP__SCAN_REPLAY_GAIN, OP__ADD_PADDING, OP__LIST, OP__APPEND, OP__REMOVE, OP__REMOVE_ALL, OP__MERGE_PADDING, OP__SORT_PADDING } OperationType; typedef enum { ARG__BLOCK_NUMBER, ARG__BLOCK_TYPE, ARG__EXCEPT_BLOCK_TYPE, ARG__DATA_FORMAT, ARG__FROM_FILE } ArgumentType; typedef struct { FLAC__byte value[16]; } Argument_StreaminfoMD5; typedef struct { FLAC__uint32 value; } Argument_StreaminfoUInt32; typedef struct { FLAC__uint64 value; } Argument_StreaminfoUInt64; typedef struct { char *value; } Argument_VcFieldName; typedef struct { char *field; /* the whole field as passed on the command line, i.e. "NAME=VALUE" */ char *field_name; /* according to the vorbis spec, field values can contain \0 so simple C strings are not enough here */ unsigned field_value_length; char *field_value; FLAC__bool field_value_from_file; /* true if field_value holds a filename for the value, false for plain value */ } Argument_VcField; typedef struct { char *value; } Argument_String; typedef struct { unsigned num_entries; unsigned *entries; } Argument_BlockNumber; typedef struct { FLAC__MetadataType type; char application_id[4]; /* only relevant if type == FLAC__STREAM_METADATA_TYPE_APPLICATION */ FLAC__bool filter_application_by_id; } Argument_BlockTypeEntry; typedef struct { unsigned num_entries; Argument_BlockTypeEntry *entries; } Argument_BlockType; typedef struct { FLAC__bool is_binary; FLAC__bool is_headerless; } Argument_DataFormat; typedef struct { char *file_name; } Argument_FromFile; typedef struct { char *specification; } Argument_AddSeekpoint; typedef struct { char *filename; Argument_AddSeekpoint *add_seekpoint_link; } Argument_ImportCuesheetFrom; typedef struct { char *filename; const Argument_BlockNumber *block_number_link; /* may be NULL to mean 'first PICTURE block' */ } Argument_ExportPictureTo; typedef struct { unsigned length; } Argument_AddPadding; typedef struct { OperationType type; union { Argument_StreaminfoMD5 streaminfo_md5; Argument_StreaminfoUInt32 streaminfo_uint32; Argument_StreaminfoUInt64 streaminfo_uint64; Argument_VcFieldName vc_field_name; Argument_VcField vc_field; Argument_String filename; Argument_String specification; Argument_ImportCuesheetFrom import_cuesheet_from; Argument_ExportPictureTo export_picture_to; Argument_AddSeekpoint add_seekpoint; Argument_AddPadding add_padding; } argument; } Operation; typedef struct { ArgumentType type; union { Argument_BlockNumber block_number; Argument_BlockType block_type; Argument_DataFormat data_format; Argument_FromFile from_file; } value; } Argument; typedef struct { FLAC__bool preserve_modtime; FLAC__bool prefix_with_filename; FLAC__bool utf8_convert; FLAC__bool use_padding; FLAC__bool cued_seekpoints; FLAC__bool show_long_help; FLAC__bool show_version; FLAC__bool data_format_is_binary; FLAC__bool data_format_is_binary_headerless; FLAC__bool application_data_format_is_hexdump; struct { Operation *operations; unsigned num_operations; unsigned capacity; } ops; struct { struct { unsigned num_shorthand_ops; unsigned num_major_ops; FLAC__bool has_block_type; FLAC__bool has_except_block_type; } checks; Argument *arguments; unsigned num_arguments; unsigned capacity; } args; unsigned num_files; char **filenames; } CommandLineOptions; void init_options(CommandLineOptions *options); FLAC__bool parse_options(int argc, char *argv[], CommandLineOptions *options); void free_options(CommandLineOptions *options); #endif