Subversion Repositories filter_foundry

Rev

Rev 85 | Rev 145 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 toby 1
/*
18 toby 2
    This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
85 toby 3
    Copyright (C) 2003-7 Toby Thain, toby@telegraphics.com.au
2 toby 4
 
5
    This program is free software; you can redistribute it and/or modify
131 dmarschall 6
    it under the terms of the GNU General Public License as published by
2 toby 7
    the Free Software Foundation; either version 2 of the License, or
8
    (at your option) any later version.
9
 
10
    This program is distributed in the hope that it will be useful,
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
    GNU General Public License for more details.
14
 
131 dmarschall 15
    You should have received a copy of the GNU General Public License
2 toby 16
    along with this program; if not, write to the Free Software
17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
*/
19
 
20
#include "ff.h"
21
 
22
#include "file_compat.h"
23
 
24
enum{
85 toby 25
        BUFSIZE = 4L<<10,
2 toby 26
        MAXLINE = 0x200,
27
};
28
 
29
Boolean readparams(Handle h,Boolean alerts,char **reason){
30
        Boolean res = false;
31
        char linebuf[MAXLINE+1],curexpr[MAXEXPR+1],*p,*dataend,*q;
32
        int c,linecnt,lineptr,exprcnt;
33
 
15 toby 34
        if(!h){
35
                *reason = "readparams: Null parameter handle.";
36
                return false;
37
        }
38
 
2 toby 39
        p = PILOCKHANDLE(h,false);
40
        dataend = p + PIGETHANDLESIZE(h);
131 dmarschall 41
 
2 toby 42
        q = curexpr;
43
        linecnt = exprcnt = lineptr = 0;
44
 
45
        *reason = "File was too short.";
85 toby 46
        while(p < dataend){
2 toby 47
 
48
                c = *p++;
49
 
50
                if(c==CR || c==LF){ /* detected end of line */
131 dmarschall 51
 
2 toby 52
                        /* look ahead to see if we need to skip a line feed (DOS EOL convention) */
131 dmarschall 53
                        if(c == CR && *p == LF && p < dataend)
2 toby 54
                                ++p;
131 dmarschall 55
 
2 toby 56
                        linebuf[lineptr] = 0; /* add terminating NUL to line buffer */
57
 
58
                        /* process complete line */
59
                        if(linecnt==0){
60
                                if(strcmp(linebuf,"%RGB-1.0")){
61
                                        if(alerts)
85 toby 62
                                                *reason = "This doesn't look like a Filter Factory file (first line is not \"%RGB-1.0\").";
2 toby 63
                                        break;
64
                                }
65
                        }else if(linecnt<=8){
66
                                slider[linecnt-1] = atoi(linebuf);
67
                        }else{
131 dmarschall 68
                                if(lineptr){
2 toby 69
                                        /* it's not an empty line; append it to current expr string */
70
                                        if( q+lineptr > curexpr+MAXEXPR ){
85 toby 71
                                                *reason = "Found an expression longer than 1024 characters.";
2 toby 72
                                                break;
73
                                        }
74
                                        q = cat(q,linebuf);
75
                                }else{
76
                                        /* it's an empty line: we've completed the expr string */
131 dmarschall 77
                                        if(expr[exprcnt])
2 toby 78
                                                free(expr[exprcnt]);
79
                                        *q = 0;
80
                                        if(!(expr[exprcnt] = my_strdup(curexpr))){
85 toby 81
                                                *reason = "Could not get memory for expression.";
2 toby 82
                                                break;
83
                                        }
84
 
85
                                        if(++exprcnt == 4){
86
                                                res = true;
87
                                                break; /* got everything we want */
88
                                        }
89
 
90
                                        q = curexpr; /* empty current expr, ready for next one */
91
                                }
92
                        }
131 dmarschall 93
 
2 toby 94
                        ++linecnt;
95
                        lineptr = 0;
96
                }else{
97
                        /* store character */
98
                        if(c=='\\'){ /* escape sequence */
99
                                if(p < dataend){
100
                                        c = *p++;
101
                                        switch(c){
102
                                        case 'r': c = CR;
103
                                        case '\\': break;
131 dmarschall 104
                                        default:
2 toby 105
                                                if(alerts) alertuser("Warning:","Unknown escape sequence in input.");
106
                                        }
131 dmarschall 107
                                }//else if(alerts) alertuser("Warning:","truncated escape sequence ends input");
2 toby 108
                        }
109
 
110
                        if(lineptr < MAXLINE)
111
                                linebuf[lineptr++] = c;
112
                }
113
        }
131 dmarschall 114
 
2 toby 115
        PIUNLOCKHANDLE(h);
116
 
117
        return res;
118
}
119
 
45 toby 120
Boolean readPARM(Ptr p,PARM_T *pparm,char **reasonstr,int fromwin){
2 toby 121
        int i;
122
 
123
        memcpy(pparm,p,sizeof(PARM_T));
124
 
45 toby 125
        if(fromwin){
126
                /* Windows PARM resource stores C strings - convert to Pascal strings  */
127
                myc2pstr((char*)pparm->category);
128
                myc2pstr((char*)pparm->title);
129
                myc2pstr((char*)pparm->copyright);
130
                myc2pstr((char*)pparm->author);
85 toby 131
                for(i = 0; i < 4; ++i)
45 toby 132
                        myc2pstr((char*)pparm->map[i]);
85 toby 133
                for(i = 0; i < 8; ++i)
45 toby 134
                        myc2pstr((char*)pparm->ctl[i]);
135
        }
136
 
85 toby 137
        for(i = 0; i < 4; ++i){
2 toby 138
                if(expr[i]) free(expr[i]);
139
                expr[i] = my_strdup(pparm->formula[i]);
140
        }
141
 
85 toby 142
        for(i = 0; i < 8; ++i)
2 toby 143
                slider[i] = pparm->val[i];
144
 
45 toby 145
        return true;
2 toby 146
}
147
 
148
Handle readfileintohandle(FILEREF r){
149
        long n;
150
        Handle h;
151
        Ptr p;
152
 
153
        if( !GetEOF(r,&n) && (h = PINEWHANDLE(n)) ){
154
                p = PILOCKHANDLE(h,false);
45 toby 155
                if(!SetFPos(r,fsFromStart,0) && !FSRead(r,&n,p)){
2 toby 156
                        PIUNLOCKHANDLE(h);
157
                        return h;
158
                }
159
                PIDISPOSEHANDLE(h);
160
        }
161
        return NULL;
162
}
163
 
164
Boolean readfile(StandardFileReply *sfr,char **reason){
165
        FILEREF r;
166
        Handle h;
167
        Boolean res = false;
168
 
169
        if(!FSpOpenDF(&sfr->sfFile,fsRdPerm,&r)){
23 toby 170
                if( (h = readfileintohandle(r)) ){
171
                        if( (res = readparams(h,true,reason)) )
2 toby 172
                                gdata->standalone = false; // so metadata fields will default, if user chooses Make...
173
                        PIDISPOSEHANDLE(h);
174
                }
175
                FSClose(r);
176
        }else
85 toby 177
                *reason = "Could not open the file.";
2 toby 178
 
179
        return res;
180
}