📄 comm-ql.ch
字号:
This is the change file for CWEB's COMMON under QSOD/SMSQ(Contributed by Robert H. Klein, September 1994)This change file is intended for use with C68 v4.13 (or later).compile withex <dev_>cc;'-v -h -c -=500000 -DCWEBINPUTS=flp2_ common_c'@x\def\v{\char'174} % vertical (|) in typewriter font\def\title{Common code for CTANGLE and CWEAVE (Version 3.61)}\def\topofcontents{\null\vfill \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and {\ttitlefont CWEAVE}} \vskip 15pt \centerline{(Version 3.61)} \vfill}\def\botofcontents{\vfill\noindent@y\def\v{\char'174} % vertical (|) in typewriter font\def\title{Common code for CTANGLE and CWEAVE (QL Version 3.61)}\def\topofcontents{\null\vfill \centerline{\titlefont Common code for {\ttitlefont CTANGLE} and {\ttitlefont CWEAVE}} \vskip 15pt \centerline{(Version 3.61)} \vfill}\def\botofcontents{\vfill\noindent@z@xThe line number of each open file is also kept for error reporting andfor the benefit of \.{CTANGLE}.@f line x /* make |line| an unreserved word */@d max_include_depth 10 /* maximum number of source files open simultaneously, not counting the change file */@d max_file_name_length 60@d cur_file file[include_depth] /* current file */@d cur_file_name file_name[include_depth] /* current file name */@d cur_line line[include_depth] /* number of current line in current file */@d web_file file[0] /* main source file */@d web_file_name file_name[0] /* main source file name */@yThe line number of each open file is also kept for error reporting andfor the benefit of \.{CTANGLE}.For use on QDOS/SMSQ systems the variable |max_file_name_length| is shortenedto 42 characters, i.e. 5 characters for the device name, 36 charactersfor the file name plus one character as string terminator. (Note that(current) QDOS/SMSQ file systems have a limitation of 36 characters asmaximum length for a file name.@f line x /* make |line| an unreserved word */@d max_include_depth 10 /* maximum number of source files open simultaneously, not counting the change file */@d max_file_name_length 42@d cur_file file[include_depth] /* current file */@d cur_file_name file_name[include_depth] /* current file name */@d cur_line line[include_depth] /* number of current line in current file */@d web_file file[0] /* main source file */@d web_file_name file_name[0] /* main source file name */@z@x cur_file_name[l]='/'; /* \UNIX/ pathname separator */@y cur_file_name[l]='_'; /* QDOS/SMSQ pathname separator */@z@x@ We now must look at the command line arguments and set the file namesaccordingly. At least one file name must be present: the \.{CWEB}file. It may have an extension, or it may omit the extension to get |".w"| or|".web"| added. The \TEX/ output file name is formed by replacing the \.{CWEB}file name extension by |".tex"|, and the \CEE/ file name by replacingthe extension by |".c"|, after removing the directory name (if any).If there is a second file name present among the arguments, it is thechange file, again either with an extension or without one to get |".ch"|.An omitted change file argument means that |"/dev/null"| should be used,when no changes are desired.@^system dependencies@>If there's a third file name, it will be the output file.@<Pred...@>=void scan_args();@ @cvoidscan_args(){ char *dot_pos; /* position of |'.'| in the argument */ char *name_pos; /* file name beginning, sans directory */ register char *s; /* register for scanning strings */ boolean found_web=0,found_change=0,found_out=0; /* have these names have been seen? */ boolean flag_change; while (--argc > 0) { if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@; else { s=name_pos=*argv;@+dot_pos=NULL; while (*s) { if (*s=='.') dot_pos=s++; else if (*s=='/') dot_pos=NULL,name_pos=++s; else s++; } if (!found_web) @<Make |web_file_name|, |tex_file_name| and |C_file_name|@>@; else if (!found_change) @<Make |change_file_name| from |fname|@>@; else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@; else @<Print usage error message and quit@>; } } if (!found_web) @<Print usage error message and quit@>; if (found_change<=0) strcpy(change_file_name,"/dev/null");}@ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,otherwise we add |".w"|. If this file can't be opened, we prepare an|alt_web_file_name| by adding |"web"| after the dot.The other file names come from adding other thingsafter the dot. We must check that there is enough room in|web_file_name| and the other arrays for the argument.@<Make |web_file_name|...@>={ if (s-*argv > max_file_name_length-5) @<Complain about argument length@>; if (dot_pos==NULL) sprintf(web_file_name,"%s.w",*argv); else { strcpy(web_file_name,*argv); *dot_pos=0; /* string now ends where the dot was */ } sprintf(alt_web_file_name,"%s.web",*argv); sprintf(tex_file_name,"%s.tex",name_pos); /* strip off directory name */ sprintf(idx_file_name,"%s.idx",name_pos); sprintf(scn_file_name,"%s.scn",name_pos); sprintf(C_file_name,"%s.c",name_pos); found_web=1;}@ @<Make |change_file_name|...@>={ if (strcmp(*argv,"-")==0) found_change=-1; else { if (s-*argv > max_file_name_length-4) @<Complain about argument length@>; if (dot_pos==NULL) sprintf(change_file_name,"%s.ch",*argv); else strcpy(change_file_name,*argv); found_change=1; }}@ @<Override...@>={ if (s-*argv > max_file_name_length-5) @<Complain about argument length@>; if (dot_pos==NULL) { sprintf(tex_file_name,"%s.tex",*argv); sprintf(idx_file_name,"%s.idx",*argv); sprintf(scn_file_name,"%s.scn",*argv); sprintf(C_file_name,"%s.c",*argv); } else { strcpy(tex_file_name,*argv); strcpy(C_file_name,*argv); if (flags['x']) { /* indexes will be generated */ *dot_pos=0; sprintf(idx_file_name,"%s.idx",*argv); sprintf(scn_file_name,"%s.scn",*argv); } } found_out=1;}@y@ We now must look at the command line arguments and set the file namesaccordingly. At least one file name must be present: the \.{CWEB}file. It may have an extension, or it may omit the extension to get |"_w"| or|"_web"| added. The \TEX/ output file name is formed by replacing the \.{CWEB}file name extension by |"_tex"|, and the \CEE/ file name by replacingthe extension by |"_c"|, after removing the directory name (if any).If there is a second file name present among the arguments, it is thechange file, again either with an extension or without one to get |"_ch"|.An omitted change file argument means that |"NUL"| should be used,when no changes are desired.@^system dependencies@>If there's a third file name, it will be the output file.Because |"_"| is a directory {\em and} extension separator, \.{CWEB} willalways use the {\em full} name (i.e. with full path). Fortunately theroutine has been written to search for the last ``dot'', so the alteredversion will search for the last |"_"| (including directory separators),so we have what we want.@<Pred...@>=void scan_args();@ @cvoidscan_args(){ char *dot_pos; /* position of |'_'| in the argument */ char *name_pos; /* file name beginning, sans directory */ register char *s; /* register for scanning strings */ boolean found_web=0,found_change=0,found_out=0; /* have these names have been seen? */ boolean flag_change; while (--argc > 0) { if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@; else { s=name_pos=*argv;@+dot_pos=NULL; while (*s) { if (*s=='_') dot_pos=s++; else if (*s=='_') dot_pos=NULL,name_pos=++s; else s++; } if (!found_web) @<Make |web_file_name|, |tex_file_name| and |C_file_name|@>@; else if (!found_change) @<Make |change_file_name| from |fname|@>@; else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@; else @<Print usage error message and quit@>; } } if (!found_web) @<Print usage error message and quit@>; if (found_change<=0) strcpy(change_file_name,"NUL");}@ We use all of |*argv| for the |web_file_name| if there is a |'_'| in it,otherwise we add |"_w"|. If this file can't be opened, we prepare an|alt_web_file_name| by adding |"web"| after the dot.The other file names come from adding other thingsafter the dot. We must check that there is enough room in|web_file_name| and the other arrays for the argument.If you've read the section before carefully you'll have noticed, thatQDOS/SMSQ file names contain almost a |"_"|, so this routine will not work,i.e. you'll {\em have} to add the |"_w"| always. Nevertheless I adaptedthe routine as if it would work.@<Make |web_file_name|...@>={ if (s-*argv > max_file_name_length-5) @<Complain about argument length@>; if (dot_pos==NULL) sprintf(web_file_name,"%s_w",*argv); else { strcpy(web_file_name,*argv); *dot_pos=0; /* string now ends where the dot was */ } sprintf(alt_web_file_name,"%s_web",*argv); sprintf(tex_file_name,"%s_tex",name_pos); /* strip off directory name */ sprintf(idx_file_name,"%s_idx",name_pos); sprintf(scn_file_name,"%s_scn",name_pos); sprintf(C_file_name,"%s_c",name_pos); found_web=1;}@ @<Make |change_file_name|...@>={ if (strcmp(*argv,"-")==0) found_change=-1; else { if (s-*argv > max_file_name_length-4) @<Complain about argument length@>; if (dot_pos==NULL) sprintf(change_file_name,"%s_ch",*argv); else strcpy(change_file_name,*argv); found_change=1; }}@ @<Override...@>={ if (s-*argv > max_file_name_length-5) @<Complain about argument length@>; if (dot_pos==NULL) { sprintf(tex_file_name,"%s_tex",*argv); sprintf(idx_file_name,"%s_idx",*argv); sprintf(scn_file_name,"%s_scn",*argv); sprintf(C_file_name,"%s_c",*argv); } else { strcpy(tex_file_name,*argv); strcpy(C_file_name,*argv); if (flags['x']) { /* indexes will be generated */ *dot_pos=0; sprintf(idx_file_name,"%s_idx",*argv); sprintf(scn_file_name,"%s_scn",*argv); } } found_out=1;}@z@x@ @<Print usage error message and quit@>={if (program==ctangle) fatal("! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]\n" ,"");@.Usage:@>else fatal("! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]\n" ,"");}@y@ @<Print usage error message and quit@>={if (program==ctangle) fatal("! Usage: ctangle [options] webfile[_w] [{changefile[_ch]|-} [outfile[_c]]]\n" ,"");@.Usage:@>else fatal("! Usage: cweave [options] webfile[_w] [{changefile[_ch]|-} [outfile[_tex]]]\n" ,"");}@z
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -