comm-ql.ch
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. This is the change file for CWEB's COMMON under QSOD/SMSQ
  2. (Contributed by Robert H. Klein, September 1994)
  3. This change file is intended for use with C68 v4.13 (or later).
  4. compile with
  5. ex <dev_>cc;'-v -h -c -=500000 -DCWEBINPUTS=flp2_ common_c'
  6. @x
  7. defv{char'174} % vertical (|) in typewriter font
  8. deftitle{Common code for CTANGLE and CWEAVE (Version 3.3)}
  9. deftopofcontents{nullvfill
  10.   centerline{titlefont Common code for {ttitlefont CTANGLE} and
  11.     {ttitlefont CWEAVE}}
  12.   vskip 15pt
  13.   centerline{(Version 3.3)}
  14.   vfill}
  15. defbotofcontents{vfill
  16. noindent
  17. @y
  18. defv{char'174} % vertical (|) in typewriter font
  19. deftitle{Common code for CTANGLE and CWEAVE (QL Version 3.4)}
  20. deftopofcontents{nullvfill
  21.   centerline{titlefont Common code for {ttitlefont CTANGLE} and
  22.     {ttitlefont CWEAVE}}
  23.   vskip 15pt
  24.   centerline{(Version 3.4)}
  25.   vfill}
  26. defbotofcontents{vfill
  27. noindent
  28. @z
  29. @x
  30. The line number of each open file is also kept for error reporting and
  31. for the benefit of .{CTANGLE}.
  32. @f line x /* make |line| an unreserved word */
  33. @d max_include_depth 10 /* maximum number of source files open
  34.   simultaneously, not counting the change file */
  35. @d max_file_name_length 60
  36. @d cur_file file[include_depth] /* current file */
  37. @d cur_file_name file_name[include_depth] /* current file name */
  38. @d cur_line line[include_depth] /* number of current line in current file */
  39. @d web_file file[0] /* main source file */
  40. @d web_file_name file_name[0] /* main source file name */
  41. @y
  42. The line number of each open file is also kept for error reporting and
  43. for the benefit of .{CTANGLE}.
  44. For use on QDOS/SMSQ systems the variable |max_file_name_length| is shortened
  45. to 42 characters, i.e. 5 characters for the device name, 36 characters
  46. for the file name plus one character as string terminator. (Note that
  47. (current) QDOS/SMSQ file systems have a limitation of 36 characters as
  48. maximum length for a file name.
  49. @f line x /* make |line| an unreserved word */
  50. @d max_include_depth 10 /* maximum number of source files open
  51.   simultaneously, not counting the change file */
  52. @d max_file_name_length 42
  53. @d cur_file file[include_depth] /* current file */
  54. @d cur_file_name file_name[include_depth] /* current file name */
  55. @d cur_line line[include_depth] /* number of current line in current file */
  56. @d web_file file[0] /* main source file */
  57. @d web_file_name file_name[0] /* main source file name */
  58. @z
  59. @x
  60.     cur_file_name[l]='/'; /* UNIX/ pathname separator */
  61. @y
  62.     cur_file_name[l]='_'; /* QDOS/SMSQ pathname separator */
  63. @z
  64. @x
  65. @ We now must look at the command line arguments and set the file names
  66. accordingly.  At least one file name must be present: the .{CWEB}
  67. file.  It may have an extension, or it may omit the extension to get |".w"| or
  68. |".web"| added.  The TEX/ output file name is formed by replacing the .{CWEB}
  69. file name extension by |".tex"|, and the CEE/ file name by replacing
  70. the extension by |".c"|, after removing the directory name (if any).
  71. If there is a second file name present among the arguments, it is the
  72. change file, again either with an extension or without one to get |".ch"|.
  73. An omitted change file argument means that |"/dev/null"| should be used,
  74. when no changes are desired.
  75. @^system dependencies@>
  76. If there's a third file name, it will be the output file.
  77. @<Pred...@>=
  78. void scan_args();
  79. @ @c
  80. void
  81. scan_args()
  82. {
  83.   char *dot_pos; /* position of |'.'| in the argument */
  84.   char *name_pos; /* file name beginning, sans directory */
  85.   register char *s; /* register for scanning strings */
  86.   boolean found_web=0,found_change=0,found_out=0;
  87.              /* have these names have been seen? */
  88.   boolean flag_change;
  89.   while (--argc > 0) {
  90.     if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@;
  91.     else {
  92.       s=name_pos=*argv;@+dot_pos=NULL;
  93.       while (*s) {
  94.         if (*s=='.') dot_pos=s++;
  95.         else if (*s=='/') dot_pos=NULL,name_pos=++s;
  96.         else s++;
  97.       }
  98.       if (!found_web) @<Make
  99.        |web_file_name|, |tex_file_name| and |C_file_name|@>@;
  100.       else if (!found_change) @<Make |change_file_name| from |fname|@>@;
  101.       else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@;
  102.         else @<Print usage error message and quit@>;
  103.     }
  104.   }
  105.   if (!found_web) @<Print usage error message and quit@>;
  106.   if (found_change<=0) strcpy(change_file_name,"/dev/null");
  107. }
  108. @ We use all of |*argv| for the |web_file_name| if there is a |'.'| in it,
  109. otherwise we add |".w"|. If this file can't be opened, we prepare an
  110. |alt_web_file_name| by adding |"web"| after the dot.
  111. The other file names come from adding other things
  112. after the dot.  We must check that there is enough room in
  113. |web_file_name| and the other arrays for the argument.
  114. @<Make |web_file_name|...@>=
  115. {
  116.   if (s-*argv > max_file_name_length-5)
  117.     @<Complain about argument length@>;
  118.   if (dot_pos==NULL)
  119.     sprintf(web_file_name,"%s.w",*argv);
  120.   else {
  121.     strcpy(web_file_name,*argv);
  122.     *dot_pos=0; /* string now ends where the dot was */
  123.   }
  124.   sprintf(alt_web_file_name,"%s.web",*argv);
  125.   sprintf(tex_file_name,"%s.tex",name_pos); /* strip off directory name */
  126.   sprintf(idx_file_name,"%s.idx",name_pos);
  127.   sprintf(scn_file_name,"%s.scn",name_pos);
  128.   sprintf(C_file_name,"%s.c",name_pos);
  129.   found_web=1;
  130. }
  131. @ @<Make |change_file_name|...@>=
  132. {
  133.   if (strcmp(*argv,"-")==0) found_change=-1;
  134.   else {
  135.     if (s-*argv > max_file_name_length-4)
  136.       @<Complain about argument length@>;
  137.     if (dot_pos==NULL)
  138.       sprintf(change_file_name,"%s.ch",*argv);
  139.     else strcpy(change_file_name,*argv);
  140.     found_change=1;
  141.   }
  142. }
  143. @ @<Override...@>=
  144. {
  145.   if (s-*argv > max_file_name_length-5)
  146.     @<Complain about argument length@>;
  147.   if (dot_pos==NULL) {
  148.     sprintf(tex_file_name,"%s.tex",*argv);
  149.     sprintf(idx_file_name,"%s.idx",*argv);
  150.     sprintf(scn_file_name,"%s.scn",*argv);
  151.     sprintf(C_file_name,"%s.c",*argv);
  152.   } else {
  153.     strcpy(tex_file_name,*argv);
  154.     if (flags['x']) { /* indexes will be generated */
  155.       if (program==cweave && strcmp(*argv+strlen(*argv)-4,".tex")!=0)
  156.         fatal("! Output file name should end with .texn",*argv);
  157. @.Output file name...tex@>
  158.       strcpy(idx_file_name,*argv);
  159.       strcpy(idx_file_name+strlen(*argv)-4,".idx");
  160.       strcpy(scn_file_name,*argv);
  161.       strcpy(scn_file_name+strlen(*argv)-4,".scn");
  162.     }
  163.     strcpy(C_file_name,*argv);
  164.   }
  165.   found_out=1;
  166. }
  167. @y
  168. @ We now must look at the command line arguments and set the file names
  169. accordingly.  At least one file name must be present: the .{CWEB}
  170. file.  It may have an extension, or it may omit the extension to get |"_w"| or
  171. |"_web"| added.  The TEX/ output file name is formed by replacing the .{CWEB}
  172. file name extension by |"_tex"|, and the CEE/ file name by replacing
  173. the extension by |"_c"|, after removing the directory name (if any).
  174. If there is a second file name present among the arguments, it is the
  175. change file, again either with an extension or without one to get |"_ch"|.
  176. An omitted change file argument means that |"NUL"| should be used,
  177. when no changes are desired.
  178. @^system dependencies@>
  179. If there's a third file name, it will be the output file.
  180. Because |"_"| is a directory {em and} extension separator, .{CWEB} will
  181. always use the {em full} name (i.e. with full path).  Fortunately the
  182. routine has been written to search for the last ``dot'', so the altered
  183. version will search for the last |"_"| (including directory separators),
  184. so we have what we want.
  185. @<Pred...@>=
  186. void scan_args();
  187. @ @c
  188. void
  189. scan_args()
  190. {
  191.   char *dot_pos; /* position of |'_'| in the argument */
  192.   char *name_pos; /* file name beginning, sans directory */
  193.   register char *s; /* register for scanning strings */
  194.   boolean found_web=0,found_change=0,found_out=0;
  195.              /* have these names have been seen? */
  196.   boolean flag_change;
  197.   while (--argc > 0) {
  198.     if ((**(++argv)=='-'||**argv=='+')&&*(*argv+1)) @<Handle flag argument@>@;
  199.     else {
  200.       s=name_pos=*argv;@+dot_pos=NULL;
  201.       while (*s) {
  202.         if (*s=='_') dot_pos=s++;
  203.         else if (*s=='_') dot_pos=NULL,name_pos=++s;
  204.         else s++;
  205.       }
  206.       if (!found_web) @<Make
  207.        |web_file_name|, |tex_file_name| and |C_file_name|@>@;
  208.       else if (!found_change) @<Make |change_file_name| from |fname|@>@;
  209.       else if (!found_out) @<Override |tex_file_name| and |C_file_name|@>@;
  210.         else @<Print usage error message and quit@>;
  211.     }
  212.   }
  213.   if (!found_web) @<Print usage error message and quit@>;
  214.   if (found_change<=0) strcpy(change_file_name,"NUL");
  215. }
  216. @ We use all of |*argv| for the |web_file_name| if there is a |'_'| in it,
  217. otherwise we add |"_w"|. If this file can't be opened, we prepare an
  218. |alt_web_file_name| by adding |"web"| after the dot.
  219. The other file names come from adding other things
  220. after the dot.  We must check that there is enough room in
  221. |web_file_name| and the other arrays for the argument.
  222. If you've read the section before carefully you'll have noticed, that
  223. QDOS/SMSQ file names contain almost a |"_"|, so this routine will not work,
  224. i.e. you'll {em have} to add the |"_w"| always.  Nevertheless I adapted
  225. the routine as if it would work.
  226. @<Make |web_file_name|...@>=
  227. {
  228.   if (s-*argv > max_file_name_length-5)
  229.     @<Complain about argument length@>;
  230.   if (dot_pos==NULL)
  231.     sprintf(web_file_name,"%s_w",*argv);
  232.   else {
  233.     strcpy(web_file_name,*argv);
  234.     *dot_pos=0; /* string now ends where the dot was */
  235.   }
  236.   sprintf(alt_web_file_name,"%s_web",*argv);
  237.   sprintf(tex_file_name,"%s_tex",name_pos); /* strip off directory name */
  238.   sprintf(idx_file_name,"%s_idx",name_pos);
  239.   sprintf(scn_file_name,"%s_scn",name_pos);
  240.   sprintf(C_file_name,"%s_c",name_pos);
  241.   found_web=1;
  242. }
  243. @ @<Make |change_file_name|...@>=
  244. {
  245.   if (strcmp(*argv,"-")==0) found_change=-1;
  246.   else {
  247.     if (s-*argv > max_file_name_length-4)
  248.       @<Complain about argument length@>;
  249.     if (dot_pos==NULL)
  250.       sprintf(change_file_name,"%s_ch",*argv);
  251.     else strcpy(change_file_name,*argv);
  252.     found_change=1;
  253.   }
  254. }
  255. @ @<Override...@>=
  256. {
  257.   if (s-*argv > max_file_name_length-5)
  258.     @<Complain about argument length@>;
  259.   if (dot_pos==NULL) {
  260.     sprintf(tex_file_name,"%s_tex",*argv);
  261.     sprintf(idx_file_name,"%s_idx",*argv);
  262.     sprintf(scn_file_name,"%s_scn",*argv);
  263.     sprintf(C_file_name,"%s_c",*argv);
  264.   } else {
  265.     strcpy(tex_file_name,*argv);
  266.     if (flags['x']) { /* indexes will be generated */
  267.       if (program==cweave && strcmp(*argv+strlen(*argv)-4,"_tex")!=0)
  268.         fatal("! Output file name should end with _texn",*argv);
  269. @.Output file name...tex@>
  270.       strcpy(idx_file_name,*argv);
  271.       strcpy(idx_file_name+strlen(*argv)-4,"_idx");
  272.       strcpy(scn_file_name,*argv);
  273.       strcpy(scn_file_name+strlen(*argv)-4,"_scn");
  274.     }
  275.     strcpy(C_file_name,*argv);
  276.   }
  277.   found_out=1;
  278. }
  279. @z
  280. @x
  281. @ @<Print usage error message and quit@>=
  282. {
  283. if (program==ctangle)
  284.   fatal(
  285. "! Usage: ctangle [options] webfile[.w] [{changefile[.ch]|-} [outfile[.c]]]n"
  286.    ,"");
  287. @.Usage:@>
  288. else fatal(
  289. "! Usage: cweave [options] webfile[.w] [{changefile[.ch]|-} [outfile[.tex]]]n"
  290.    ,"");
  291. }
  292. @y
  293. @ @<Print usage error message and quit@>=
  294. {
  295. if (program==ctangle)
  296.   fatal(
  297. "! Usage: ctangle [options] webfile[_w] [{changefile[_ch]|-} [outfile[_c]]]n"
  298.    ,"");
  299. @.Usage:@>
  300. else fatal(
  301. "! Usage: cweave [options] webfile[_w] [{changefile[_ch]|-} [outfile[_tex]]]n"
  302.    ,"");
  303. }
  304. @z