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