summaryrefslogtreecommitdiffstats
path: root/src/metaflac/options.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/metaflac/options.h221
1 files changed, 221 insertions, 0 deletions
diff --git a/src/metaflac/options.h b/src/metaflac/options.h
new file mode 100644
index 0000000..984f2e1
--- /dev/null
+++ b/src/metaflac/options.h
@@ -0,0 +1,221 @@
+/* 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 <getopt.h>
+#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