1/* metaflac - Command-line FLAC metadata editor 2 * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 */ 18 19#ifndef metaflac__options_h 20#define metaflac__options_h 21 22#include "FLAC/format.h" 23 24#if 0 25/*[JEC] was:#if HAVE_GETOPT_LONG*/ 26/*[JEC] see flac/include/share/getopt.h as to why the change */ 27# include <getopt.h> 28#else 29# include "share/getopt.h" 30#endif 31 32extern struct share__option long_options_[]; 33 34typedef enum { 35 OP__SHOW_MD5SUM, 36 OP__SHOW_MIN_BLOCKSIZE, 37 OP__SHOW_MAX_BLOCKSIZE, 38 OP__SHOW_MIN_FRAMESIZE, 39 OP__SHOW_MAX_FRAMESIZE, 40 OP__SHOW_SAMPLE_RATE, 41 OP__SHOW_CHANNELS, 42 OP__SHOW_BPS, 43 OP__SHOW_TOTAL_SAMPLES, 44 OP__SET_MD5SUM, 45 OP__SET_MIN_BLOCKSIZE, 46 OP__SET_MAX_BLOCKSIZE, 47 OP__SET_MIN_FRAMESIZE, 48 OP__SET_MAX_FRAMESIZE, 49 OP__SET_SAMPLE_RATE, 50 OP__SET_CHANNELS, 51 OP__SET_BPS, 52 OP__SET_TOTAL_SAMPLES, 53 OP__SHOW_VC_VENDOR, 54 OP__SHOW_VC_FIELD, 55 OP__REMOVE_VC_ALL, 56 OP__REMOVE_VC_FIELD, 57 OP__REMOVE_VC_FIRSTFIELD, 58 OP__SET_VC_FIELD, 59 OP__IMPORT_VC_FROM, 60 OP__EXPORT_VC_TO, 61 OP__IMPORT_CUESHEET_FROM, 62 OP__EXPORT_CUESHEET_TO, 63 OP__IMPORT_PICTURE_FROM, 64 OP__EXPORT_PICTURE_TO, 65 OP__ADD_SEEKPOINT, 66 OP__ADD_REPLAY_GAIN, 67 OP__ADD_PADDING, 68 OP__LIST, 69 OP__APPEND, 70 OP__REMOVE, 71 OP__REMOVE_ALL, 72 OP__MERGE_PADDING, 73 OP__SORT_PADDING 74} OperationType; 75 76typedef enum { 77 ARG__BLOCK_NUMBER, 78 ARG__BLOCK_TYPE, 79 ARG__EXCEPT_BLOCK_TYPE, 80 ARG__DATA_FORMAT, 81 ARG__FROM_FILE 82} ArgumentType; 83 84typedef struct { 85 FLAC__byte value[16]; 86} Argument_StreaminfoMD5; 87 88typedef struct { 89 FLAC__uint32 value; 90} Argument_StreaminfoUInt32; 91 92typedef struct { 93 FLAC__uint64 value; 94} Argument_StreaminfoUInt64; 95 96typedef struct { 97 char *value; 98} Argument_VcFieldName; 99 100typedef struct { 101 char *field; /* the whole field as passed on the command line, i.e. "NAME=VALUE" */ 102 char *field_name; 103 /* according to the vorbis spec, field values can contain \0 so simple C strings are not enough here */ 104 unsigned field_value_length; 105 char *field_value; 106 FLAC__bool field_value_from_file; /* true if field_value holds a filename for the value, false for plain value */ 107} Argument_VcField; 108 109typedef struct { 110 char *value; 111} Argument_String; 112 113typedef struct { 114 unsigned num_entries; 115 unsigned *entries; 116} Argument_BlockNumber; 117 118typedef struct { 119 FLAC__MetadataType type; 120 char application_id[4]; /* only relevant if type == FLAC__STREAM_METADATA_TYPE_APPLICATION */ 121 FLAC__bool filter_application_by_id; 122} Argument_BlockTypeEntry; 123 124typedef struct { 125 unsigned num_entries; 126 Argument_BlockTypeEntry *entries; 127} Argument_BlockType; 128 129typedef struct { 130 FLAC__bool is_binary; 131} Argument_DataFormat; 132 133typedef struct { 134 char *file_name; 135} Argument_FromFile; 136 137typedef struct { 138 char *specification; 139} Argument_AddSeekpoint; 140 141typedef struct { 142 char *filename; 143 Argument_AddSeekpoint *add_seekpoint_link; 144} Argument_ImportCuesheetFrom; 145 146typedef struct { 147 char *filename; 148 const Argument_BlockNumber *block_number_link; /* may be NULL to mean 'first PICTURE block' */ 149} Argument_ExportPictureTo; 150 151typedef struct { 152 unsigned length; 153} Argument_AddPadding; 154 155typedef struct { 156 OperationType type; 157 union { 158 Argument_StreaminfoMD5 streaminfo_md5; 159 Argument_StreaminfoUInt32 streaminfo_uint32; 160 Argument_StreaminfoUInt64 streaminfo_uint64; 161 Argument_VcFieldName vc_field_name; 162 Argument_VcField vc_field; 163 Argument_String filename; 164 Argument_String specification; 165 Argument_ImportCuesheetFrom import_cuesheet_from; 166 Argument_ExportPictureTo export_picture_to; 167 Argument_AddSeekpoint add_seekpoint; 168 Argument_AddPadding add_padding; 169 } argument; 170} Operation; 171 172typedef struct { 173 ArgumentType type; 174 union { 175 Argument_BlockNumber block_number; 176 Argument_BlockType block_type; 177 Argument_DataFormat data_format; 178 Argument_FromFile from_file; 179 } value; 180} Argument; 181 182typedef struct { 183 FLAC__bool preserve_modtime; 184 FLAC__bool prefix_with_filename; 185 FLAC__bool utf8_convert; 186 FLAC__bool use_padding; 187 FLAC__bool cued_seekpoints; 188 FLAC__bool show_long_help; 189 FLAC__bool show_version; 190 FLAC__bool application_data_format_is_hexdump; 191 struct { 192 Operation *operations; 193 unsigned num_operations; 194 unsigned capacity; 195 } ops; 196 struct { 197 struct { 198 unsigned num_shorthand_ops; 199 unsigned num_major_ops; 200 FLAC__bool has_block_type; 201 FLAC__bool has_except_block_type; 202 } checks; 203 Argument *arguments; 204 unsigned num_arguments; 205 unsigned capacity; 206 } args; 207 unsigned num_files; 208 char **filenames; 209} CommandLineOptions; 210 211void init_options(CommandLineOptions *options); 212FLAC__bool parse_options(int argc, char *argv[], CommandLineOptions *options); 213void free_options(CommandLineOptions *options); 214 215#endif 216