annotate ffmpeg/tools/ffeval.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * Copyright (c) 2012 Stefano Sabatini
yading@11 3 *
yading@11 4 * This file is part of FFmpeg.
yading@11 5 *
yading@11 6 * FFmpeg is free software; you can redistribute it and/or
yading@11 7 * modify it under the terms of the GNU Lesser General Public
yading@11 8 * License as published by the Free Software Foundation; either
yading@11 9 * version 2.1 of the License, or (at your option) any later version.
yading@11 10 *
yading@11 11 * FFmpeg is distributed in the hope that it will be useful,
yading@11 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 14 * Lesser General Public License for more details.
yading@11 15 *
yading@11 16 * You should have received a copy of the GNU Lesser General Public
yading@11 17 * License along with FFmpeg; if not, write to the Free Software
yading@11 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 19 */
yading@11 20
yading@11 21 #include "config.h"
yading@11 22 #if HAVE_UNISTD_H
yading@11 23 #include <unistd.h> /* getopt */
yading@11 24 #endif
yading@11 25
yading@11 26 #include "libavutil/eval.h"
yading@11 27
yading@11 28 #if !HAVE_GETOPT
yading@11 29 #include "compat/getopt.c"
yading@11 30 #endif
yading@11 31
yading@11 32 /**
yading@11 33 * @file
yading@11 34 * simple arithmetic expression evaluator
yading@11 35 */
yading@11 36
yading@11 37 static void usage(void)
yading@11 38 {
yading@11 39 printf("Simple expression evalutor, please *don't* turn me to a feature-complete language interpreter\n");
yading@11 40 printf("usage: ffeval [OPTIONS]\n");
yading@11 41 printf("\n"
yading@11 42 "Options:\n"
yading@11 43 "-e echo each input line on output\n"
yading@11 44 "-h print this help\n"
yading@11 45 "-i INFILE set INFILE as input file, stdin if omitted\n"
yading@11 46 "-o OUTFILE set OUTFILE as output file, stdout if omitted\n"
yading@11 47 "-p PROMPT set output prompt\n");
yading@11 48 }
yading@11 49
yading@11 50 #define MAX_BLOCK_SIZE SIZE_MAX
yading@11 51
yading@11 52 int main(int argc, char **argv)
yading@11 53 {
yading@11 54 size_t buf_size = 256;
yading@11 55 char *buf = av_malloc(buf_size);
yading@11 56 const char *outfilename = NULL, *infilename = NULL;
yading@11 57 FILE *outfile = NULL, *infile = NULL;
yading@11 58 const char *prompt = "=> ";
yading@11 59 int count = 0, echo = 0;
yading@11 60 int c;
yading@11 61
yading@11 62 av_max_alloc(MAX_BLOCK_SIZE);
yading@11 63
yading@11 64 while ((c = getopt(argc, argv, "ehi:o:p:")) != -1) {
yading@11 65 switch (c) {
yading@11 66 case 'e':
yading@11 67 echo = 1;
yading@11 68 break;
yading@11 69 case 'h':
yading@11 70 usage();
yading@11 71 return 0;
yading@11 72 case 'i':
yading@11 73 infilename = optarg;
yading@11 74 break;
yading@11 75 case 'o':
yading@11 76 outfilename = optarg;
yading@11 77 break;
yading@11 78 case 'p':
yading@11 79 prompt = optarg;
yading@11 80 break;
yading@11 81 case '?':
yading@11 82 return 1;
yading@11 83 }
yading@11 84 }
yading@11 85
yading@11 86 if (!infilename || !strcmp(infilename, "-")) {
yading@11 87 infilename = "stdin";
yading@11 88 infile = stdin;
yading@11 89 } else {
yading@11 90 infile = fopen(infilename, "r");
yading@11 91 }
yading@11 92 if (!infile) {
yading@11 93 fprintf(stderr, "Impossible to open input file '%s': %s\n", infilename, strerror(errno));
yading@11 94 return 1;
yading@11 95 }
yading@11 96
yading@11 97 if (!outfilename || !strcmp(outfilename, "-")) {
yading@11 98 outfilename = "stdout";
yading@11 99 outfile = stdout;
yading@11 100 } else {
yading@11 101 outfile = fopen(outfilename, "w");
yading@11 102 }
yading@11 103 if (!outfile) {
yading@11 104 fprintf(stderr, "Impossible to open output file '%s': %s\n", outfilename, strerror(errno));
yading@11 105 return 1;
yading@11 106 }
yading@11 107
yading@11 108 while ((c = fgetc(infile)) != EOF) {
yading@11 109 if (c == '\n') {
yading@11 110 double d;
yading@11 111
yading@11 112 buf[count] = 0;
yading@11 113 if (buf[0] != '#') {
yading@11 114 av_expr_parse_and_eval(&d, buf,
yading@11 115 NULL, NULL,
yading@11 116 NULL, NULL, NULL, NULL, NULL, 0, NULL);
yading@11 117 if (echo)
yading@11 118 fprintf(outfile, "%s ", buf);
yading@11 119 fprintf(outfile, "%s%f\n", prompt, d);
yading@11 120 }
yading@11 121 count = 0;
yading@11 122 } else {
yading@11 123 if (count >= buf_size-1) {
yading@11 124 if (buf_size == MAX_BLOCK_SIZE) {
yading@11 125 av_log(NULL, AV_LOG_ERROR, "Memory allocation problem, "
yading@11 126 "max block size '%zd' reached\n", MAX_BLOCK_SIZE);
yading@11 127 return 1;
yading@11 128 }
yading@11 129 buf_size = FFMIN(buf_size, MAX_BLOCK_SIZE / 2) * 2;
yading@11 130 buf = av_realloc_f((void *)buf, buf_size, 1);
yading@11 131 if (!buf) {
yading@11 132 av_log(NULL, AV_LOG_ERROR, "Memory allocation problem occurred\n");
yading@11 133 return 1;
yading@11 134 }
yading@11 135 }
yading@11 136 buf[count++] = c;
yading@11 137 }
yading@11 138 }
yading@11 139
yading@11 140 av_free(buf);
yading@11 141 return 0;
yading@11 142 }