example_util: add ExUtilSetBinaryMode

use it in dwebp when dealing with 'stdout'

Change-Id: I8b8a0b0de9e73731e913ac3c83b5e2b33c693175
This commit is contained in:
James Zern 2014-08-29 19:07:17 -07:00
parent 30f3b75b33
commit 5927e15bc7
3 changed files with 21 additions and 14 deletions

View File

@ -38,11 +38,6 @@
#include <wincodec.h> #include <wincodec.h>
#endif #endif
#if defined(_WIN32)
#include <fcntl.h> // for _O_BINARY
#include <io.h> // for _setmode()
#endif
#include "webp/decode.h" #include "webp/decode.h"
#include "./example_util.h" #include "./example_util.h"
#include "./stopwatch.h" #include "./stopwatch.h"
@ -482,15 +477,8 @@ static int SaveOutput(const WebPDecBuffer* const buffer,
needs_open_file = (format != PNG); needs_open_file = (format != PNG);
#endif #endif
#if defined(_WIN32)
if (use_stdout && _setmode(_fileno(stdout), _O_BINARY) == -1) {
fprintf(stderr, "Failed to reopen stdout in O_BINARY mode.\n");
return -1;
}
#endif
if (needs_open_file) { if (needs_open_file) {
fout = use_stdout ? stdout : fopen(out_file, "wb"); fout = use_stdout ? ExUtilSetBinaryMode(stdout) : fopen(out_file, "wb");
if (fout == NULL) { if (fout == NULL) {
fprintf(stderr, "Error opening output file %s\n", out_file); fprintf(stderr, "Error opening output file %s\n", out_file);
return 0; return 0;

View File

@ -11,6 +11,11 @@
// //
#include "./example_util.h" #include "./example_util.h"
#if defined(_WIN32)
#include <fcntl.h> // for _O_BINARY
#include <io.h> // for _setmode()
#endif
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -21,9 +26,18 @@
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// File I/O // File I/O
static const size_t kBlockSize = 16384; // default initial size FILE* ExUtilSetBinaryMode(FILE* file) {
#if defined(_WIN32)
if (_setmode(_fileno(file), _O_BINARY) == -1) {
fprintf(stderr, "Failed to reopen file in O_BINARY mode.\n");
return NULL;
}
#endif
return file;
}
int ExUtilReadFromStdin(const uint8_t** data, size_t* data_size) { int ExUtilReadFromStdin(const uint8_t** data, size_t* data_size) {
static const size_t kBlockSize = 16384; // default initial size
size_t max_size = 0; size_t max_size = 0;
size_t size = 0; size_t size = 0;
uint8_t* input = NULL; uint8_t* input = NULL;

View File

@ -13,12 +13,17 @@
#ifndef WEBP_EXAMPLES_EXAMPLE_UTIL_H_ #ifndef WEBP_EXAMPLES_EXAMPLE_UTIL_H_
#define WEBP_EXAMPLES_EXAMPLE_UTIL_H_ #define WEBP_EXAMPLES_EXAMPLE_UTIL_H_
#include <stdio.h>
#include "webp/decode.h" #include "webp/decode.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
// Reopen file in binary (O_BINARY) mode.
// Returns 'file' on success, NULL otherwise.
FILE* ExUtilSetBinaryMode(FILE* file);
// Allocates storage for entire file 'file_name' and returns contents and size // Allocates storage for entire file 'file_name' and returns contents and size
// in 'data' and 'data_size'. Returns 1 on success, 0 otherwise. '*data' should // in 'data' and 'data_size'. Returns 1 on success, 0 otherwise. '*data' should
// be deleted using free(). // be deleted using free().