1*b2055c35SXin Li // Copyright 2012 Google Inc. All Rights Reserved.
2*b2055c35SXin Li //
3*b2055c35SXin Li // Use of this source code is governed by a BSD-style license
4*b2055c35SXin Li // that can be found in the COPYING file in the root of the source
5*b2055c35SXin Li // tree. An additional intellectual property rights grant can be found
6*b2055c35SXin Li // in the file PATENTS. All contributing project authors may
7*b2055c35SXin Li // be found in the AUTHORS file in the root of the source tree.
8*b2055c35SXin Li // -----------------------------------------------------------------------------
9*b2055c35SXin Li //
10*b2055c35SXin Li // Utility functions used by the example programs.
11*b2055c35SXin Li //
12*b2055c35SXin Li
13*b2055c35SXin Li #include "./example_util.h"
14*b2055c35SXin Li
15*b2055c35SXin Li #include <assert.h>
16*b2055c35SXin Li #include <stdio.h>
17*b2055c35SXin Li #include <stdlib.h>
18*b2055c35SXin Li #include <string.h>
19*b2055c35SXin Li
20*b2055c35SXin Li #include "webp/mux_types.h"
21*b2055c35SXin Li #include "../imageio/imageio_util.h"
22*b2055c35SXin Li
23*b2055c35SXin Li //------------------------------------------------------------------------------
24*b2055c35SXin Li // String parsing
25*b2055c35SXin Li
ExUtilGetUInt(const char * const v,int base,int * const error)26*b2055c35SXin Li uint32_t ExUtilGetUInt(const char* const v, int base, int* const error) {
27*b2055c35SXin Li char* end = NULL;
28*b2055c35SXin Li const uint32_t n = (v != NULL) ? (uint32_t)strtoul(v, &end, base) : 0u;
29*b2055c35SXin Li if (end == v && error != NULL && !*error) {
30*b2055c35SXin Li *error = 1;
31*b2055c35SXin Li fprintf(stderr, "Error! '%s' is not an integer.\n",
32*b2055c35SXin Li (v != NULL) ? v : "(null)");
33*b2055c35SXin Li }
34*b2055c35SXin Li return n;
35*b2055c35SXin Li }
36*b2055c35SXin Li
ExUtilGetInt(const char * const v,int base,int * const error)37*b2055c35SXin Li int ExUtilGetInt(const char* const v, int base, int* const error) {
38*b2055c35SXin Li return (int)ExUtilGetUInt(v, base, error);
39*b2055c35SXin Li }
40*b2055c35SXin Li
ExUtilGetInts(const char * v,int base,int max_output,int output[])41*b2055c35SXin Li int ExUtilGetInts(const char* v, int base, int max_output, int output[]) {
42*b2055c35SXin Li int n, error = 0;
43*b2055c35SXin Li for (n = 0; v != NULL && n < max_output; ++n) {
44*b2055c35SXin Li const int value = ExUtilGetInt(v, base, &error);
45*b2055c35SXin Li if (error) return -1;
46*b2055c35SXin Li output[n] = value;
47*b2055c35SXin Li v = strchr(v, ',');
48*b2055c35SXin Li if (v != NULL) ++v; // skip over the trailing ','
49*b2055c35SXin Li }
50*b2055c35SXin Li return n;
51*b2055c35SXin Li }
52*b2055c35SXin Li
ExUtilGetFloat(const char * const v,int * const error)53*b2055c35SXin Li float ExUtilGetFloat(const char* const v, int* const error) {
54*b2055c35SXin Li char* end = NULL;
55*b2055c35SXin Li const float f = (v != NULL) ? (float)strtod(v, &end) : 0.f;
56*b2055c35SXin Li if (end == v && error != NULL && !*error) {
57*b2055c35SXin Li *error = 1;
58*b2055c35SXin Li fprintf(stderr, "Error! '%s' is not a floating point number.\n",
59*b2055c35SXin Li (v != NULL) ? v : "(null)");
60*b2055c35SXin Li }
61*b2055c35SXin Li return f;
62*b2055c35SXin Li }
63*b2055c35SXin Li
64*b2055c35SXin Li //------------------------------------------------------------------------------
65*b2055c35SXin Li
ResetCommandLineArguments(int argc,const char * argv[],CommandLineArguments * const args)66*b2055c35SXin Li static void ResetCommandLineArguments(int argc, const char* argv[],
67*b2055c35SXin Li CommandLineArguments* const args) {
68*b2055c35SXin Li assert(args != NULL);
69*b2055c35SXin Li args->argc_ = argc;
70*b2055c35SXin Li args->argv_ = argv;
71*b2055c35SXin Li args->own_argv_ = 0;
72*b2055c35SXin Li WebPDataInit(&args->argv_data_);
73*b2055c35SXin Li }
74*b2055c35SXin Li
ExUtilDeleteCommandLineArguments(CommandLineArguments * const args)75*b2055c35SXin Li void ExUtilDeleteCommandLineArguments(CommandLineArguments* const args) {
76*b2055c35SXin Li if (args != NULL) {
77*b2055c35SXin Li if (args->own_argv_) {
78*b2055c35SXin Li WebPFree((void*)args->argv_);
79*b2055c35SXin Li WebPDataClear(&args->argv_data_);
80*b2055c35SXin Li }
81*b2055c35SXin Li ResetCommandLineArguments(0, NULL, args);
82*b2055c35SXin Li }
83*b2055c35SXin Li }
84*b2055c35SXin Li
85*b2055c35SXin Li #define MAX_ARGC 16384
ExUtilInitCommandLineArguments(int argc,const char * argv[],CommandLineArguments * const args)86*b2055c35SXin Li int ExUtilInitCommandLineArguments(int argc, const char* argv[],
87*b2055c35SXin Li CommandLineArguments* const args) {
88*b2055c35SXin Li if (args == NULL || argv == NULL) return 0;
89*b2055c35SXin Li ResetCommandLineArguments(argc, argv, args);
90*b2055c35SXin Li if (argc == 1 && argv[0][0] != '-') {
91*b2055c35SXin Li char* cur;
92*b2055c35SXin Li const char sep[] = " \t\r\n\f\v";
93*b2055c35SXin Li
94*b2055c35SXin Li #if defined(_WIN32) && defined(_UNICODE)
95*b2055c35SXin Li fprintf(stderr,
96*b2055c35SXin Li "Error: Reading arguments from a file is a feature unavailable "
97*b2055c35SXin Li "with Unicode binaries.\n");
98*b2055c35SXin Li return 0;
99*b2055c35SXin Li #endif
100*b2055c35SXin Li
101*b2055c35SXin Li if (!ExUtilReadFileToWebPData(argv[0], &args->argv_data_)) {
102*b2055c35SXin Li return 0;
103*b2055c35SXin Li }
104*b2055c35SXin Li args->own_argv_ = 1;
105*b2055c35SXin Li args->argv_ = (const char**)WebPMalloc(MAX_ARGC * sizeof(*args->argv_));
106*b2055c35SXin Li if (args->argv_ == NULL) {
107*b2055c35SXin Li ExUtilDeleteCommandLineArguments(args);
108*b2055c35SXin Li return 0;
109*b2055c35SXin Li }
110*b2055c35SXin Li
111*b2055c35SXin Li argc = 0;
112*b2055c35SXin Li for (cur = strtok((char*)args->argv_data_.bytes, sep);
113*b2055c35SXin Li cur != NULL;
114*b2055c35SXin Li cur = strtok(NULL, sep)) {
115*b2055c35SXin Li if (argc == MAX_ARGC) {
116*b2055c35SXin Li fprintf(stderr, "ERROR: Arguments limit %d reached\n", MAX_ARGC);
117*b2055c35SXin Li ExUtilDeleteCommandLineArguments(args);
118*b2055c35SXin Li return 0;
119*b2055c35SXin Li }
120*b2055c35SXin Li assert(strlen(cur) != 0);
121*b2055c35SXin Li args->argv_[argc++] = cur;
122*b2055c35SXin Li }
123*b2055c35SXin Li args->argc_ = argc;
124*b2055c35SXin Li }
125*b2055c35SXin Li return 1;
126*b2055c35SXin Li }
127*b2055c35SXin Li
128*b2055c35SXin Li //------------------------------------------------------------------------------
129*b2055c35SXin Li
ExUtilReadFileToWebPData(const char * const filename,WebPData * const webp_data)130*b2055c35SXin Li int ExUtilReadFileToWebPData(const char* const filename,
131*b2055c35SXin Li WebPData* const webp_data) {
132*b2055c35SXin Li const uint8_t* data;
133*b2055c35SXin Li size_t size;
134*b2055c35SXin Li if (webp_data == NULL) return 0;
135*b2055c35SXin Li if (!ImgIoUtilReadFile(filename, &data, &size)) return 0;
136*b2055c35SXin Li webp_data->bytes = data;
137*b2055c35SXin Li webp_data->size = size;
138*b2055c35SXin Li return 1;
139*b2055c35SXin Li }
140