ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/resolu.h
Revision: 2.13
Committed: Thu Aug 2 18:33:42 2018 UTC (5 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2
Changes since 2.12: +4 -3 lines
Log Message:
Created MAXFMTLEN to guard against buffer overrun attacks in header input

File Contents

# User Rev Content
1 greg 2.13 /* RCSid $Id: resolu.h,v 2.12 2017/05/10 18:02:08 greg Exp $ */
2 greg 1.1 /*
3     * Definitions for resolution line in image file.
4     *
5 greg 2.10 * Include after <stdio.h>
6 greg 2.3 *
7 greg 1.1 * True image orientation is defined by an xy coordinate system
8     * whose origin is at the lower left corner of the image, with
9     * x increasing to the right and y increasing in the upward direction.
10     * This true orientation is independent of how the pixels are actually
11     * ordered in the file, which is indicated by the resolution line.
12     * This line is of the form "{+-}{XY} xyres {+-}{YX} yxres\n".
13     * A typical line for a 1024x600 image might be "-Y 600 +X 1024\n",
14     * indicating that the scanlines are in English text order (PIXSTANDARD).
15     */
16 schorsch 2.5 #ifndef _RAD_RESOLU_H_
17     #define _RAD_RESOLU_H_
18 schorsch 2.8
19     #include <time.h>
20    
21    
22 greg 2.3 #ifdef __cplusplus
23     extern "C" {
24     #endif
25    
26 greg 1.1 /* flags for scanline ordering */
27     #define XDECR 1
28     #define YDECR 2
29     #define YMAJOR 4
30    
31     /* standard scanline ordering */
32     #define PIXSTANDARD (YMAJOR|YDECR)
33     #define PIXSTDFMT "-Y %d +X %d\n"
34    
35     /* structure for image dimensions */
36     typedef struct {
37 greg 2.3 int rt; /* orientation (from flags above) */
38 greg 1.1 int xr, yr; /* x and y resolution */
39     } RESOLU;
40    
41     /* macros to get scanline length and number */
42 greg 2.3 #define scanlen(rs) ((rs)->rt & YMAJOR ? (rs)->xr : (rs)->yr)
43     #define numscans(rs) ((rs)->rt & YMAJOR ? (rs)->yr : (rs)->xr)
44 greg 1.1
45     /* resolution string buffer and its size */
46     #define RESOLU_BUFLEN 32
47     extern char resolu_buf[RESOLU_BUFLEN];
48    
49     /* macros for reading/writing resolution struct */
50     #define fputsresolu(rs,fp) fputs(resolu2str(resolu_buf,rs),fp)
51     #define fgetsresolu(rs,fp) str2resolu(rs, \
52     fgets(resolu_buf,RESOLU_BUFLEN,fp))
53    
54     /* reading/writing of standard ordering */
55     #define fprtresolu(sl,ns,fp) fprintf(fp,PIXSTDFMT,ns,sl)
56     #define fscnresolu(sl,ns,fp) (fscanf(fp,PIXSTDFMT,ns,sl)==2)
57    
58 greg 2.11 /* identify header lines */
59 greg 2.13 #define MAXFMTLEN 64
60 greg 2.11 #define isheadid(s) headidval(NULL,s)
61     #define isformat(s) formatval(NULL,s)
62     #define isdate(s) dateval(NULL,s)
63     #define isgmt(s) gmtval(NULL,s)
64    
65     #define LATLONSTR "LATLONG="
66     #define LLATLONSTR 8
67     #define islatlon(hl) (!strncmp(hl,LATLONSTR,LLATLONSTR))
68     #define latlonval(ll,hl) sscanf((hl)+LLATLONSTR, "%f %f", \
69     &(ll)[0],&(ll)[1])
70     #define fputlatlon(lat,lon,fp) fprintf(fp,"%s %.6f %.6f\n",LATLONSTR,lat,lon)
71    
72 greg 2.3 /* defined in resolu.c */
73     extern void fputresolu(int ord, int sl, int ns, FILE *fp);
74     extern int fgetresolu(int *sl, int *ns, FILE *fp);
75     extern char * resolu2str(char *buf, RESOLU *rp);
76     extern int str2resolu(RESOLU *rp, char *buf);
77     /* defined in header.c */
78 greg 2.12 extern void newheader(const char *t, FILE *fp);
79     extern int headidval(char *r, const char *s);
80     extern int dateval(time_t *t, const char *s);
81     extern int gmtval(time_t *t, const char *s);
82 greg 2.3 extern void fputdate(time_t t, FILE *fp);
83     extern void fputnow(FILE *fp);
84     extern void printargs(int ac, char **av, FILE *fp);
85 greg 2.13 extern int formatval(char fmt[MAXFMTLEN], const char *s);
86 greg 2.12 extern void fputformat(const char *s, FILE *fp);
87 schorsch 2.9 typedef int gethfunc(char *s, void *p); /* callback to process header lines */
88     extern int getheader(FILE *fp, gethfunc *f, void *p);
89 greg 2.12 extern int globmatch(const char *pat, const char *str);
90 greg 2.13 extern int checkheader(FILE *fin, char fmt[MAXFMTLEN], FILE *fout);
91 greg 2.3
92     #ifdef __cplusplus
93     }
94     #endif
95 schorsch 2.5 #endif /* _RAD_RESOLU_H_ */
96