1
2 /*
3 * International Color Consortium Format Library (icclib)
4 * File dump utility.
5 *
6 * Author: Graeme W. Gill
7 * Date: 99/11/29
8 * Version: 2.00
9 *
10 * Copyright 1997, 1998, 1999, 2000, 2001 Graeme W. Gill
11 * Please refer to Licence.txt file for details.
12 */
13
14 /*
15 * TTBD:
16 * Add support for command line offset (or auto signature search ?)
17 * to cope with dumping embeded profiles.
18 *
19 */
20
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <stdarg.h>
25 #include <fcntl.h>
26 #include <string.h>
27 #include "icc.h"
28
29 void error(char *fmt, ...), warning(char *fmt, ...);
30
usage(void)31 void usage(void) {
32 fprintf(stderr,"Dump an ICC file in human readable form, V2.00\n");
33 fprintf(stderr,"Author: Graeme W. Gill\n");
34 fprintf(stderr,"usage: iccdump [-v level] [-t tagname] infile\n");
35 fprintf(stderr," -v level Verbose level 1-3\n");
36 fprintf(stderr," -t tag Dump this tag only\n");
37 exit(1);
38 }
39
40 int
main(int argc,char * argv[])41 main(int argc, char *argv[]) {
42 int fa,nfa; /* argument we're looking at */
43 char in_name[100];
44 char tag_name[40] = { '\000' };
45 int verb = 2;
46 icmFile *fp;
47 icc *icco;
48 int rv = 0;
49
50 if (argc < 2)
51 usage();
52
53 /* Process the arguments */
54 for(fa = 1;fa < argc;fa++) {
55 nfa = fa; /* skip to nfa if next argument is used */
56 if (argv[fa][0] == '-') { /* Look for any flags */
57 char *na = NULL; /* next argument after flag, null if none */
58
59 if (argv[fa][2] != '\000')
60 na = &argv[fa][2]; /* next is directly after flag */
61 else {
62 if ((fa+1) < argc) {
63 if (argv[fa+1][0] != '-') {
64 nfa = fa + 1;
65 na = argv[nfa]; /* next is seperate non-flag argument */
66 }
67 }
68 }
69
70 if (argv[fa][1] == '?')
71 usage();
72
73 /* Verbosity */
74 else if (argv[fa][1] == 'v' || argv[fa][1] == 'V') {
75 fa = nfa;
76 if (na == NULL) usage();
77 verb = atoi(na);
78 }
79 /* Tag name */
80 else if (argv[fa][1] == 't' || argv[fa][1] == 'T') {
81 fa = nfa;
82 if (na == NULL) usage();
83 strcpy(tag_name,na);
84 }
85
86 else
87 usage();
88 }
89 else
90 break;
91 }
92
93 if (fa >= argc || argv[fa][0] == '-') usage();
94 strcpy(in_name,argv[fa]);
95
96 /* Open up the file for reading */
97 if ((fp = new_icmFileStd_name(in_name,"r")) == NULL)
98 error ("Can't open file '%s'",in_name);
99
100 if ((icco = new_icc()) == NULL)
101 error ("Creation of ICC object failed");
102
103 if ((rv = icco->read(icco,fp,0)) != 0)
104 error ("%d, %s",rv,icco->err);
105
106 if (tag_name[0] != '\000') {
107 icTagSignature sig = str2tag(tag_name);
108
109 /* Try and locate that particular tag */
110 if ((rv = icco->find_tag(icco,sig)) != 0) {
111 if (rv == 1)
112 warning ("icc->find_tag() tag '%s' found but unknown", tag_name);
113 else
114 warning ("icc->find_tag() can't find tag '%s' in file", tag2str(sig));
115 } else {
116 icmBase *ob;
117
118 if ((ob = icco->read_tag(icco, sig)) == NULL) {
119 warning("Failed to read tag '%s': %d, %s",tag_name, icco->errc,icco->err);
120 } else {
121 ob->dump(ob, stdout, verb-1);
122 }
123 }
124 } else {
125 icco->dump(icco, stdout, verb);
126 }
127
128 icco->del(icco);
129 fp->del(fp);
130
131 return 0;
132 }
133
134
135 /* Basic printf type error() and warning() routines */
136
137 void
error(char * fmt,...)138 error(char *fmt, ...)
139 {
140 va_list args;
141
142 fprintf(stderr,"iccdump: Error - ");
143 va_start(args, fmt);
144 vfprintf(stderr, fmt, args);
145 va_end(args);
146 fprintf(stderr, "\n");
147 exit (-1);
148 }
149
150 void
warning(char * fmt,...)151 warning(char *fmt, ...)
152 {
153 va_list args;
154
155 fprintf(stderr,"iccdump: Warning - ");
156 va_start(args, fmt);
157 vfprintf(stderr, fmt, args);
158 va_end(args);
159 fprintf(stderr, "\n");
160 }
161