File: mwrite.m

package info (click to toggle)
psychtoolbox-3 3.0.19.14.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 86,796 kB
  • sloc: ansic: 176,245; cpp: 20,103; objc: 5,393; sh: 2,753; python: 1,397; php: 384; makefile: 193; java: 113
file content (142 lines) | stat: -rw-r--r-- 4,778 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
function mwrite( funcp, M, openal )

% MWRITE  Write an M-file wrapper function
%
% mwrite( funcp, M, openal )

% 24-Jan-2005 -- created;  adapted from code in autocode.m (RFM)
% 06-Feb-2007 -- Modified; can now handle OpenAL as well. (MK)
% 24-Mar-2011 -- Modified; More debug output when protected funcs are encountered. (MK)
% 25-Mar-2011 -- Modified; Be more interactive when protected funcs are encountered. (MK)

if nargin < 3
	openal = 0;
end

% set names for temporary files
tmpwrapfile1='/tmp/mogl_wrap1.m';
tmpwrapfile2='/tmp/mogl_wrap2.m';

% write M-file wrapper to a temporary file
fid=fopen(tmpwrapfile1,'w');
fndef='';
% M-file output arguments
if numel(M.arg_out)==1,
	fndef=[ fndef sprintf('%s = ',M.arg_out{1}) ];
elseif numel(M.arg_out)>1,
	fndef=[ fndef sprintf('[ %s ] = ',commalist(M.arg_out{:})) ];
end
% M-file function name
fndef=[ fndef funcp.fname ];
% M-file input arguments
if ~isempty(M.arg_in),
	fndef=[ fndef sprintf('( %s )',commalist(M.arg_in{:})) ];
end
% write
fprintf(fid,'function %s\n\n',fndef);
if openal
	fprintf(fid,'%% %s  Interface to OpenAL function %s\n%%\n',funcp.fname,funcp.fname);
else
	fprintf(fid,'%% %s  Interface to OpenGL function %s\n%%\n',funcp.fname,funcp.fname);
end
fprintf(fid,'%% usage:  %s\n%%\n',fndef);
fprintf(fid,'%% C function:  %s\n\n',funcp.full);
fprintf(fid,'%% %s -- created (generated automatically from header files)\n\n',datestr(now,1));
% flag that at least one input argument to moglcore call is modified,
% and allocation code must be checked manually
if M.allocate,
	fprintf(fid,'%% ---allocate---\n\n');
end
% check number of arguments
fprintf(fid,'if nargin~=%d,\n',numel(M.arg_in));
fprintf(fid,'    error(''invalid number of arguments'');\n');
fprintf(fid,'end\n\n');
% check type of arguments
if ~isempty(M.arg_in_check),
	fprintf(fid,'%s',M.arg_in_check{:});
	fprintf(fid,'\n');
end
% init return arguments
if M.allocate,
	for k=1:numel(M.arg_out_init),
		fprintf(fid,'%s\n',M.arg_out_init{k});
	end
	fprintf(fid,'\n');
end
% call to moglcore
if ~isempty(M.mogl_out),
	fprintf(fid,'%s = ',M.mogl_out{1});
end
if openal
	fprintf(fid,'moalcore( %s );\n\n',commalist(sprintf('''%s''',funcp.fname),M.mogl_in{:}) );
else
	fprintf(fid,'moglcore( %s );\n\n',commalist(sprintf('''%s''',funcp.fname),M.mogl_in{:}) );
end
fprintf(fid,'return\n');
fclose(fid);

% see whether existing M-file wrapper is protected
wrapfile=sprintf('../wrap/%s.m',funcp.fname);
mprotected=filecontains(wrapfile,'---protected---');
mskip = filecontains(wrapfile,'---skip---');

if mskip
    fprintf('File %s has ---skip--- marker. Skipping it.\n', wrapfile);
    return;
end

% if protected, append automatically generated code as comments
if mprotected,
    if 1
        fprintf('File %s is ---protected--- This would be the new code:\n\n', wrapfile);
        system(sprintf('cat %s', tmpwrapfile1));
        
        fprintf('\n\n==== This is the old code: ====\n\n');
        system(sprintf('cat %s', wrapfile));
        fprintf('\n\n');
        
        resp = input('(e)dit modified code in editor? (s)kip permanently? Press enter to skip now: ', 's');
        if strfind(resp, 'e')
            fprintf('File %s is ---protected--- Appending new code as comments.\n', wrapfile);
            % strip existing autocode
            if filecontains(wrapfile,'---autocode---'),
                unix(sprintf('sed -E -n ''1,/---autocode---/p'' %s > %s',wrapfile,tmpwrapfile2));
                unix(sprintf('mv %s %s',tmpwrapfile2,wrapfile));
                % if no autocode, write autocode header
            else
                unix(sprintf('echo >> %s',wrapfile));
                unix(sprintf('echo >> %s',wrapfile));
                unix(sprintf('echo ''%% ---autocode---'' >> %s',wrapfile));
            end

            % append automatically generated code as comments
            unix(sprintf('echo ''%%'' >> %s',wrapfile));
            unix(sprintf('cat %s | sed -E ''s/^/%% /'' >> %s',tmpwrapfile1,wrapfile));
            unix(sprintf('echo ''%%'' >> %s',wrapfile));

            % Open file in editor for further processing:
            edit(wrapfile);
        else
            if strfind(resp, 's')
                fprintf('...skipped permanently...\n');
                unix(sprintf('echo ''%% ---skip---'' >> %s',wrapfile));
            else
                fprintf('...skipped...\n');
            end
        end
    else
        fprintf('File %s is ---protected--- This would have been the new code:\n\n', wrapfile);
        system(sprintf('cat %s', tmpwrapfile1));
    end
	% otherwise, just overwrite the existing file
else

	unix(sprintf('rm %s 2> /dev/null',wrapfile));
	if M.allocate,
		wrapfile=sprintf('../wrap/_%s.m',funcp.fname);
	end
	unix(sprintf('mv %s %s',tmpwrapfile1,wrapfile));

end

return