+/** The different sorting methods of the ls command. */
+enum ls_sorting_method {
+ /** -sp (default) */
+ LS_SORT_BY_PATH,
+ /** -ss */
+ LS_SORT_BY_SCORE,
+ /** -sl */
+ LS_SORT_BY_LAST_PLAYED,
+ /** -sn */
+ LS_SORT_BY_NUM_PLAYED,
+ /** -sf */
+ LS_SORT_BY_FREQUENCY,
+ /** -sc */
+ LS_SORT_BY_CHANNELS,
+ /** -si */
+ LS_SORT_BY_IMAGE_ID,
+ /** -sy */
+ LS_SORT_BY_LYRICS_ID,
+ /** -sb */
+ LS_SORT_BY_BITRATE,
+ /** -sd */
+ LS_SORT_BY_DURATION,
+ /** -sa */
+ LS_SORT_BY_AUDIO_FORMAT,
+ /** -sh */
+ LS_SORT_BY_HASH,
+};
+
+/** The different listing modes of the ls command. */
+enum ls_listing_mode {
+ /** Default listing mode. */
+ LS_MODE_SHORT,
+ /** -l or -ll */
+ LS_MODE_LONG,
+ /** -lv */
+ LS_MODE_VERBOSE,
+ /** -lm */
+ LS_MODE_MBOX
+};
+
+/** The flags accepted by the ls command. */
+enum ls_flags {
+ /** -p */
+ LS_FLAG_FULL_PATH = 1,
+ /** -a */
+ LS_FLAG_ADMISSIBLE_ONLY = 2,
+ /** -r */
+ LS_FLAG_REVERSE = 4,
+};
+
+/**
+ * The size of the individual output fields of the ls command.
+ *
+ * These depend on the actual content being listed. If, for instance only files
+ * with duration less than an hour are being listed, then the duration with is
+ * made smaller because then the duration is listed as mm:ss rather than
+ * hh:mm:ss.
+ */
+struct ls_widths {
+ /** size of the score field. */
+ unsigned short score_width;
+ /** size of the image id field. */
+ unsigned short image_id_width;
+ /** size of the lyrics id field. */
+ unsigned short lyrics_id_width;
+ /** size of the bitrate field. */
+ unsigned short bitrate_width;
+ /** size of the frequency field. */
+ unsigned short frequency_width;
+ /** size of the duration field. */
+ unsigned short duration_width;
+ /** size of the num played field. */
+ unsigned short num_played_width;
+};
+
+/** Data passed from the ls command handler to its callback function. */
+struct ls_options {
+ /** The given command line flags. */
+ unsigned flags;
+ /** The sorting method given at the command line. */
+ enum ls_sorting_method sorting;
+ /** The given listing mode (short, long, verbose, mbox). */
+ enum ls_listing_mode mode;
+ /** The arguments passed to the ls command. */
+ char **patterns;
+ /** Number of non-option arguments. */
+ int num_patterns;
+ /** Used for long listing mode to align the output fields. */
+ struct ls_widths widths;
+ /** Size of the \a data array. */
+ uint32_t array_size;
+ /** Number of used entries in the data array. */
+ uint32_t num_matching_paths;
+ /** Array of matching entries. */
+ struct ls_data *data;
+ /** Used to sort the array. */
+ struct ls_data **data_ptr;
+};
+