/* link files according to flist */#include "clinkg"link(flist)char *flist;$(int files,sporg,mainv,i,j;char fname[cifn],fout[cifn];errcnt=sptr=fptr=i=0;while(flist[i]!=0 & flist[i]!='.')++i;strcpy(fout,flist);strcpy(fout+i,".COM");printf("%s->%s\n",flist,fout);pc=begtok+9;clear(vtab,vtsize);clear(ctab,ctsize);clear(stab,stsize);clear(type,maxsym);clear(slink,maxsym);if((files=copen(flist,'r'))<0)$(ioerror("can't find",flist,files);return;$)if((output=copen(fout,'w'))<0)$(ioerror("can't write ",fout,output);cclose(files);return;$)vbp=vtab;cbp=ctab;while(errcnt==0& gfname(fname,files))$(if((input=copen(fname,'r'))<0)$(ioerror("can't find",fname,input);break;$)eof=0;/* check file type */if((j=find(fname,20,'.'))<0)error("unknown file type");/* skip binary files this pass */else if(streq(fname+j,".OBJ"));else if(streq(fname+j,".CCC"))$(pass1();++fptr;/* look for free space */while(*vbp++);vbase[fptr] = --vbp;/* look for free space */while(*cbp++);cbase[fptr] = --cbp;$)else error("unknown file type");cclose(input);$)cclose(files);if(errcnt)$(cclose(output);return;$)printf("Statistics:\n%d\tSymbols\n",vbp-vtab);printf("%d\tLabels\n",cbp-ctab);printf("%d\tGlobals\n",sptr);printf("Code starts  $%x\n",begtok);printf("Stack starts $%x\n",pc);pl("linking. . .");resolve();if(errcnt)$(cclose(output);return;$)pl("pass 2");if((files=copen(flist,'r'))<0)$(ioerror("Can't re-read",flist,files);cclose(output);return;$)sporg=pc;pc=bad=begtok;bptr=fptr=0;if((mainv=lookup("main")) < 0)$(error("No main()\n");cclose(files);cclose(output);return;$)pby(0xff);pby(0xff);ws("dbc");wb(revnum);wb(0);wa(vtab[slink[mainv]]);wa(sporg);vbp=vtab;cbp=ctab;while(errcnt==0& gfname(fname,files))$(if((input=copen(fname,'r'))<0)$(ioerror("can't re-open file",fname,input);break;$)eof=0;/* check file type */if((j=find(fname,20,'.'))<0)error("unknown file type");/* copy binary files this pass */else if(streq(fname+j,".OBJ"))fcopy(input,output);else if(streq(fname+j,".CCC"))$(pass2();flush();++fptr;vbp=vbase[fptr];cbp=cbase[fptr];$)else error("unknown file type");cclose(input);$)cclose(files);cclose(output);if(errcnt==0)pl("no errors");return;$)