コード例 #1
0
ファイル: THXSCAN.CPP プロジェクト: jpaulm/threadn
   int thxscan(FILE *fp, cnxt_ent *cnxt_tab, proc_ent *proc_tab,
		       label_ent *label_tab, char file_name[10],
                        int *label_cp, int* proc_cp, int* cnxt_cp)
    {
       char *o_ptr;
       char out_str[255];
       char fname[256];
       char out_num[5];
       int i, IIPlen, ret_code;
       int proc_cnt;
       int proc_start = 0;
       int proc_hold, proc_last;
       int label_count, proc_count, cnxt_count;
       proc_ent *curr_proc;
       cnxt_ent *curr_cnxt;
       int label_ct;
       unsigned cnxt_open, eq_arrow;
       IIP *IIP_ptr;
       FILE *fp2;


       label_count = *label_cp;
       proc_count = *proc_cp;
       cnxt_count = *cnxt_cp;
       proc_hold = proc_count;
       ret_code = 0;
       do {curr_char = getc(fp);} while (curr_char == '\n');

 netloop:
       cnxt_open = FALSE;

       o_ptr = out_str;
       scan_blanks(fp);
       TCO(nEOF,EOF);  
       printf("End of Network Definition\n");
       goto exit;
 nEOF: TCO(NQ,'\'');
       strcpy(label_tab[label_count].label," ");
       strcpy(label_tab[label_count].file, file_name);
       label_tab[label_count].cnxt_ptr = &cnxt_tab[cnxt_count];
       label_tab[label_count].proc_ptr = &proc_tab[proc_count];
       label_tab[label_count].ent_type = 'L';
       printf("Scanning Main Network\n");
       proc_start = proc_count;
       proc_tab[proc_count].proc_name[0] = '\0';
       label_count++;
       label_tab[label_count].label[0] = '\0';
       goto TQ;
 NQ:   if (scan_sym(fp, o_ptr) != 0) {
	  printf("Name error\n");
	  ret_code = 4;
          goto exit;  }
       scan_blanks(fp);
       TCO(ncol,':');
       strcpy(label_tab[label_count].label,out_str);
       strcpy(label_tab[label_count].file, file_name);
       label_tab[label_count].cnxt_ptr = &cnxt_tab[cnxt_count];
       label_tab[label_count].proc_ptr = &proc_tab[proc_count];
       label_tab[label_count].ent_type = 'L';
       printf("Scanning Network: %s\n",out_str);
       proc_start = proc_count;
       label_count++;
       label_tab[label_count].label[0] = '\0';

       scan_blanks(fp);

loop:
       o_ptr = out_str;
       scan_blanks(fp);
       TCO(X1,'\'');
TQ:    
       TCO(tbsl,EOF);  
       printf("EOF encountered within quoted string\n");
       ret_code = 4;
       goto exit;
tbsl:  TCO(copy,'\'');
       TC(NQ2,'\'');
       goto TQ;
copy:  CC;
       goto TQ;
NQ2:   IIPlen = o_ptr - out_str;
       strcpy(cnxt_tab[cnxt_count].upstream_name,"!");
       IIP_ptr = (IIP *)malloc(IIPlen + sizeof(IIP_ptr -> IIP_len));
       IIP_ptr -> IIP_len = IIPlen;
       memcpy(IIP_ptr -> datapart, out_str, IIPlen);
       cnxt_tab[cnxt_count].gen.IIPptr = IIP_ptr;
       scan_blanks(fp);
       goto tArrow;

X1:    if (scan_sym(fp, o_ptr) != 0) {
	  printf("Name error\n");
	  ret_code = 4;
          goto exit;  }
       scan_blanks(fp);
       goto topen;

ncol:   strcpy(label_tab[label_count].label," ");
       strcpy(label_tab[label_count].file, file_name);
       label_tab[label_count].cnxt_ptr = &cnxt_tab[cnxt_count];
       label_tab[label_count].proc_ptr = &proc_tab[proc_count];
       label_tab[label_count].ent_type = 'L';
       proc_start = proc_count;
       label_count++;
       label_tab[label_count].label[0] = '\0';

topen:  if (cnxt_open) {
	  strcpy(cnxt_tab[cnxt_count].downstream_name,out_str);
	  cnxt_open = FALSE;
	  curr_cnxt = &cnxt_tab[cnxt_count];
	  if (curr_cnxt -> upstream_name[0] != '!')
             printf(" Connection: %s %s[%d] -> %s[%d] %s\n",
	     curr_cnxt -> upstream_name,
	     curr_cnxt -> upstream_port_name,
	     curr_cnxt -> upstream_elem_no,
	     curr_cnxt -> downstream_port_name,
	     curr_cnxt -> downstream_elem_no,
	     curr_cnxt -> downstream_name);
	   else {
             printf(" IIP: -> %s[%d] %s\n",
	     curr_cnxt -> downstream_port_name,
	     curr_cnxt -> downstream_elem_no,
	     curr_cnxt -> downstream_name);
             IIP_ptr = curr_cnxt -> gen.IIPptr;
             printf("    \'");
             for (i = 0; i < IIP_ptr -> IIP_len; i++)
	          printf("%c",IIP_ptr -> datapart[i]);
             printf("\'\n");
             }
	  cnxt_count++;
	  }
        else {
	TCO(NIP,'=');
	TCO(NIP,'>');
	scan_blanks(fp);

        strcpy(cnxt_tab[cnxt_count].upstream_name, "*");
	strcpy(cnxt_tab[cnxt_count].upstream_port_name,out_str);
        cnxt_tab[cnxt_count].upstream_elem_no = 0;
        goto ncap;
       }
	/* look up in proc list for subnet */
 NIP:  i = proc_start;
       while (proc_tab[i].proc_name[0] != '\0') {
         if (strcmp(proc_tab[i].proc_name,out_str) == 0) break;
	 i++;
         }
       proc_cnt = i;
       if (proc_tab[proc_cnt].proc_name[0] == '\0')  {
	 strcpy(proc_tab[proc_cnt].proc_name,out_str);
	 proc_tab[proc_cnt].trace = 0;
	 proc_tab[proc_cnt + 1].proc_name[0] = '\0';
	 proc_count = proc_cnt;
	 }

       TCO(NB1,'(');
       scan_blanks(fp);
       o_ptr = proc_tab[proc_cnt].comp_name;
Y1:    TA(NA2);
       goto Y1;
NA2:   TN(NN2);
       goto Y1;
NN2:   *o_ptr = '\0';
       scan_blanks(fp);
       TCO(NB1,')');
       curr_proc = &proc_tab[proc_cnt];
       printf(" Process: %s (%s)\n",curr_proc -> proc_name,
	  curr_proc -> comp_name);
NB1:   scan_blanks(fp);
       TCO(NQ1,'?');
       proc_tab[proc_cnt].trace = 1;

NQ1:   scan_blanks(fp);
       TCO(NSC1,';');
       cnxt_tab[cnxt_count].upstream_name[0] = '\0';
       cnxt_count++;
       proc_count++;
       proc_count++;
       label_count++;
       goto netloop;
NSC1:  TCO(NC1,',');
       goto loop;

NC1:   strcpy(cnxt_tab[cnxt_count].upstream_name,out_str);
       o_ptr = out_str;
X2:    TC(X2a,'*');     /* automatic port */
       *o_ptr = '\0';
       goto is_inport;
X2a:   if (scan_sym(fp, o_ptr) != 0) {
	  printf("Upstream port name error for %s\n",
	    cnxt_tab[cnxt_count].upstream_name);
	  ret_code = 4;
          goto exit;  }
is_inport:
       strcpy(cnxt_tab[cnxt_count].upstream_port_name,out_str);


       scan_blanks(fp);
       cnxt_tab[cnxt_count].upstream_elem_no = 0;
       TCO(tArrow,'[');
       o_ptr = out_num;
GNx:   TN(NNx);
       goto GNx;
NNx:   TCO(elemerr,']');
       *o_ptr = '\0';
       cnxt_tab[cnxt_count].upstream_elem_no = atoi(out_num);
       scan_blanks(fp);

tArrow: eq_arrow = FALSE;
       TCO(tEq,'-');
       goto tGr;
tEq:   TCO(nArrow,'=');
       eq_arrow = TRUE;
tGr:   TCO(nArrow,'>');

       cnxt_tab[cnxt_count].capacity = -1;
       scan_blanks(fp);
       TCO(ncap,'(');
       o_ptr = out_num;
GNz:   TN(NNz);
       goto GNz;
NNz:   TCO(caperr,')');
       *o_ptr = '\0';
       cnxt_tab[cnxt_count].capacity = atoi(out_num);
       scan_blanks(fp);
       goto ncap;
caperr: printf("Capacity error\n");
       ret_code = 4;
       goto exit;
ncap:  cnxt_tab[cnxt_count].downstream_elem_no = 0;

/* Scan off downstream port name */
       o_ptr = out_str;
       TC(Y2a,'*');       /* automatic port */
       *o_ptr = '\0';
       goto is_outport;
Y2a:   if (scan_sym(fp, o_ptr) != 0) {
	  printf("Downstream port name error for %s %s\n",
	  cnxt_tab[cnxt_count].upstream_name,
	  cnxt_tab[cnxt_count].upstream_port_name);
	  ret_code = 4;
          goto exit;  }
is_outport:
       strcpy(cnxt_tab[cnxt_count].downstream_port_name,out_str);
       strcpy(cnxt_tab[cnxt_count].downstream_name, "*");  /* ext. conn */
       cnxt_open = TRUE;

       scan_blanks(fp);
       TCO(CSC2,'[');
       o_ptr = out_num;
GNy:   TN(NNy);
       goto GNy;
NNy:   TCO(elemerr,']');
       *o_ptr = '\0';
       cnxt_tab[cnxt_count].downstream_elem_no = atoi(out_num);

CSC2:  scan_blanks(fp);
       TCO(NSC2,';');
       if (!eq_arrow)
	  printf("Port name %s not an external port\n", out_str);
       curr_cnxt = &cnxt_tab[cnxt_count];
       if (curr_cnxt -> upstream_name[0] != '!')
             printf(" Connection: %s %s[%d] -> %s[%d] %s\n",
	     curr_cnxt -> upstream_name,
	     curr_cnxt -> upstream_port_name,
	     curr_cnxt -> upstream_elem_no,
	     curr_cnxt -> downstream_port_name,
	     curr_cnxt -> downstream_elem_no,
	     curr_cnxt -> downstream_name);
	   else {
             printf(" IIP: -> %s[%d] %s\n",
	     curr_cnxt -> downstream_port_name,
	     curr_cnxt -> downstream_elem_no,
	     curr_cnxt -> downstream_name);
             IIP_ptr = curr_cnxt -> gen.IIPptr;
             printf("    \'");
             for (i = 0; i < IIP_ptr -> IIP_len; i++)
	          printf("%c",IIP_ptr -> datapart[i]);
             printf("\'\n");
             }


       cnxt_count++;
       cnxt_tab[cnxt_count].upstream_name[0] = '\0';
       cnxt_count++;
       proc_count++;
       proc_count++;
       label_count++;
       goto netloop;

NSC2:  TCO(loop,',');

       if (!eq_arrow)
	  printf("Port name %s not an external port\n", out_str);
       curr_cnxt = &cnxt_tab[cnxt_count];
       if (curr_cnxt -> upstream_name[0] != '!')
             printf(" Connection: %s %s[%d] -> %s[%d] %s\n",
	     curr_cnxt -> upstream_name,
	     curr_cnxt -> upstream_port_name,
	     curr_cnxt -> upstream_elem_no,
	     curr_cnxt -> downstream_port_name,
	     curr_cnxt -> downstream_elem_no,
	     curr_cnxt -> downstream_name);
	   else {
             printf(" IIP: -> %s[%d] %s\n",
	     curr_cnxt -> downstream_port_name,
	     curr_cnxt -> downstream_elem_no,
	     curr_cnxt -> downstream_name);
             IIP_ptr = curr_cnxt -> gen.IIPptr;
             printf("    \'");
             for (i = 0; i < IIP_ptr -> IIP_len; i++)
	          printf("%c",IIP_ptr -> datapart[i]);
             printf("\'\n");
             }


       cnxt_count++;
       cnxt_open = FALSE;
       goto loop;

elemerr: printf("Port element error\n");
       ret_code = 4;
       goto exit;

nArrow: printf("No arrow found\n");
       ret_code = 4;
exit:
   if (fclose(fp) != 0) {
         printf("Close error\n");
         if (ret_code == 0)
            ret_code = 2;
	 }
       if (ret_code > 0) {
          printf("Scan error\n");
          return(ret_code);
          }

         proc_last = proc_count;
         for (i = proc_hold; i < proc_last; i++) {
	  curr_proc = &proc_tab[i];
	  if (curr_proc -> proc_name[0] == '\0') continue;
         label_ct = find_label(label_tab, curr_proc -> comp_name, file_name, label_count);
          curr_proc -> composite = (label_ct > 0);
          if (curr_proc -> composite)
             curr_proc -> label_count = label_ct;
           else {
            strcpy(fname, curr_proc -> comp_name);
            if ((fp2 = fopen(strcat(fname, ".net"),"r"))
                   != NULL) {
                 label_ct = label_count;
                 strcpy(fname, curr_proc -> comp_name);
	         thxscan(fp2, cnxt_tab, proc_tab, label_tab, fname,
                    &label_count, &proc_count, &cnxt_count);
                 fclose(fp2);
                 curr_proc -> composite = TRUE;
                 curr_proc -> label_count = label_ct;
                 }
                else {
                   curr_proc -> must_run =
                        (thxgatrs(curr_proc -> comp_name) > 0);
                   curr_proc -> composite = FALSE;
		   curr_proc -> faddr = 0;
                 }
	    }
          }
       *label_cp = label_count;
       *proc_cp = proc_count;
       *cnxt_cp = cnxt_count;
       printf("Scan finished\n");
       return (ret_code);
    }
コード例 #2
0
ファイル: Thxgen.cpp プロジェクト: jpaulm/cppfbp
void main(int argc, char *argv[]) {

	cnxt_ent *cnxt_ptr;
	proc_ent *proc_ptr;

	label_ent *label_tab, *label_ptr;
	char gen_area[200];
	//char gen_comp_area[200];
	char * gen_ptr;
	FILE *fp, *fpo = 0;
	IIP *IIPptr;
	int proc_count, cnxt_count, iip_count;
	int label_count = 0;
	int proc_ct = 0;
	char fname[256];
	char file_name[10];

	struct modent {
		char name[32 + 1];
	}   modents[400];

	int modentnas = 0;
	int res = 0;

	if (argc != 2) {
		printf("You forgot to enter the file name\n");
		res = 8; goto retn;;
	}
	strcpy(fname, argv[1]);
	strcat(fname, ".fbp");

#ifdef WIN32
	errno_t err;
	if ((err = fopen_s(&fp, fname, "r")) != 0) {
#else
	if ((f = fopen(fname, "r")) == NULL) {
#endif
		fprintf(stderr, "Cannot open file %s!\n", fname);
		res = 8; goto retn;
	}
	//char target[255];

	char sep[2];
#ifdef _WIN32
	strcpy(sep, "\\");
#else
	strcpy(sep, "/");
#endif
	//strcpy(home, getenv("HOMEDRIVE"));
	//strcat(home, getenv("HOMEPATH"));

	char myPath[_MAX_PATH + 1];
	GetModuleFileName(NULL, myPath, _MAX_PATH);
	char * pch;
	pch = strrchr(myPath, sep[0]);
	*pch = 0;
	pch = strrchr(myPath, sep[0]);
	*pch = 0;
	//strcpy(fname, myPath);
	strcat(myPath, sep);
	strcat(myPath, "Thxgen");
	strcat(myPath, sep);
	strcat(myPath, fname);
	pch = strrchr(myPath, '.');
	*pch = 0;
	strcpy(fname, myPath);

	strcat(fname, ".cpp");
	//FILE** pFile;
#ifdef WIN32

	if ((err = fopen_s(&fpo, fname, "w")) != 0) {
#else
	if ((fpo = fopen(fname, "w")) == NULL) {
#endif
		printf("Cannot open Output Network: %s\n", fname);
		res = 8; goto retn;
	}
	printf("Creating Output Network: %s\n", fname);


	label_tab = (label_ent *)malloc(sizeof(label_ent));
	label_tab->succ = 0;

	strcpy(file_name, "\0");

	if (thxscan(fp, label_tab, file_name) != 0) {
		printf("Scan error\n");
		res = 8; goto retn;
	}

	gen_ptr = gen_area;
	strcpy(gen_ptr, "/* Generated Code */\n\n");
	fputs(gen_area, fpo);

	//gen_ptr = gen_area;
	//strcpy(gen_ptr, "#include \"stdafx.h\"\n");
	//fputs(gen_area,fpo);

	gen_ptr = gen_area;
	strcpy(gen_ptr, "#include \"thxdef.h\"\n");
	fputs(gen_area, fpo);

	/*
	gen_ptr = gen_area;
	strcpy(gen_ptr, "#include \"thxanch.h\"\n");
	fputs(gen_area,fpo);


	gen_ptr = gen_area;
	strcpy(gen_ptr, "#include \"thxscan.h\"\n");
	fputs(gen_area,fpo);

	*/
	gen_ptr = gen_area;
	strcpy(gen_ptr, "#include <stdio.h>\n");
	fputs(gen_area, fpo);

	gen_ptr = gen_area;
	strcpy(gen_ptr, "#define FILE struct _iobuf\n");
	fputs(gen_area, fpo);

	gen_ptr = gen_area;
	strcpy(gen_ptr,
		"void  CppFBP(label_ent * label_blk, bool dynam,  FILE * fp, bool timereq);\n");
	fputs(gen_area, fpo);
	//gen_ptr = gen_area;
	//strcpy(gen_ptr,  "bool NO_TRACE = false; bool TRACE = true;\n");
	//fputs(gen_area,fpo);

	proc_count = 0;
	iip_count = 0;
	cnxt_count = 0;
	char comp_name_end[20];

	label_ptr = label_tab;
	while (label_ptr != 0) {
		proc_ptr = label_ptr->proc_ptr;

		while (proc_ptr != 0) {
			if (proc_ptr->comp_name[0] == '\0')
				comp_name_end[0] = '\0';
			else {

				auto j = strlen(proc_ptr->comp_name) - 1;
				auto k = j;

				while (j >= 0) {
					if (proc_ptr->comp_name[j] == '/')
						break;
					j--;
				}
				memcpy(comp_name_end, &proc_ptr->comp_name[j + 1], k - j);
				comp_name_end[k - j] = '\0';
			}

			auto m = -1;

			for (int i = 0; i < modentnas; i++) {
				if (strcmp(comp_name_end, modents[i].name) == 0) {
					m = i;
					break;
				}
			}
			if (m == -1) {
				strcpy(modents[modentnas].name, comp_name_end);
				m = modentnas;
				modentnas++;

				if (!proc_ptr->composite) {
					gen_ptr = gen_area;
					strcpy(gen_ptr, "THRCOMP ");
					gen_ptr = strchr(gen_ptr, '\0');
					strcpy(gen_ptr, comp_name_end);
					gen_ptr = strchr(gen_ptr, '\0');
					strcpy(gen_ptr, "(anchor anch);\n");
					fputs(gen_area, fpo);
				}
			}

			gen_ptr = gen_area;
			strcpy(gen_ptr, "proc_ent P");
			gen_ptr = strchr(gen_ptr, '\0');

			_itoa(proc_count, gen_ptr, 10);
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, " = {");
			gen_ptr = strchr(gen_ptr, '\0');

			if (proc_count == 0) {
				strcpy(gen_ptr, "0");
			}
			else {
				strcpy(gen_ptr, "&P");
				gen_ptr = strchr(gen_ptr, '\0');
				int i = proc_count - 1;
				_itoa(i, gen_ptr, 10);
			}
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, ", \"");
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, proc_ptr->proc_name);
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, "\", \"");
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, proc_ptr->comp_name);
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, "\", ");
			gen_ptr = strchr(gen_ptr, '\0');

			//if (!proc_ptr -> composite) {
			// strcpy(gen_ptr, "(int ( PASCAL*)(anchor anch))");
			//gen_ptr = strchr(gen_ptr,'\0');  
			strcpy(gen_ptr, comp_name_end);
			gen_ptr = strchr(gen_ptr, '\0');
			strcpy(gen_ptr, ", 0, 0,");
			gen_ptr = strchr(gen_ptr, '\0');

			//}
			//else {
			//strcpy(gen_ptr, "0, 0, 0, ");
			//gen_ptr = strchr(gen_ptr,'\0');  
			//	strcpy(gen_ptr, proc_ptr -> comp_name);
			//	gen_ptr = strchr(gen_ptr,'\0');
			//	strcpy(gen_ptr, " 0, 0,");
			//	gen_ptr = strchr(gen_ptr,'\0');
			//}
			if (proc_ptr->trace)
				strcpy(gen_ptr, " TRACE, ");       // trace  
			else
				strcpy(gen_ptr, " !TRACE, ");       // no trace  
			gen_ptr = strchr(gen_ptr, '\0');
			//_itoa(proc_ptr -> composite, gen_ptr, 10);
			strcpy(gen_ptr, " !COMPOS");       // no compos 
			gen_ptr = strchr(gen_ptr, '\0');
			strcpy(gen_ptr, "};\n");
			proc_count++;

			fputs(gen_area, fpo);
			proc_ptr = proc_ptr->succ;
		}

		cnxt_ptr = label_ptr->cnxt_ptr;

		while (cnxt_ptr != 0) {

			if (cnxt_ptr->upstream_name[0] == '!') {
				gen_ptr = gen_area;
				strcpy(gen_ptr, "IIP I");
				gen_ptr = strchr(gen_ptr, '\0');

				_itoa(iip_count, gen_ptr, 10);
				gen_ptr = strchr(gen_ptr, '\0');

				strcpy(gen_ptr, " = {");
				gen_ptr = strchr(gen_ptr, '\0');
				IIPptr = cnxt_ptr->gen.IIPptr;

				strcpy(gen_ptr, "\"");
				gen_ptr = strchr(gen_ptr, '\0');

				auto j = strlen(IIPptr->datapart);
				for (auto i = decltype(j) {0}; i < j; i++) {
					if (IIPptr->datapart[i] == '\\')
						strcpy(gen_ptr, "\\\\");
					else
						if (IIPptr->datapart[i] == '\'')
							strcpy(gen_ptr, "\\\'");
						else
							if (IIPptr->datapart[i] == '\"')
								strcpy(gen_ptr, "\\\"");
							else
								if (IIPptr->datapart[i] == '\?')
									strcpy(gen_ptr, "\\\?");
								else {
									*gen_ptr = IIPptr->datapart[i];
									gen_ptr++;
									*gen_ptr = '\0';
								}
								gen_ptr = strchr(gen_ptr, '\0');
				}

				strcpy(gen_ptr, "\"};\n");

				fputs(gen_area, fpo);
			}

			gen_ptr = gen_area;
			strcpy(gen_ptr, "cnxt_ent C");
			gen_ptr = strchr(gen_ptr, '\0');
			_itoa(cnxt_count, gen_ptr, 10);
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, " = {");
			gen_ptr = strchr(gen_ptr, '\0');

			if (cnxt_count == 0) {
				strcpy(gen_ptr, "0");
			}
			else {
				strcpy(gen_ptr, "&C");
				gen_ptr = strchr(gen_ptr, '\0');
				int i = cnxt_count - 1;
				_itoa(i, gen_ptr, 10);
			}
			gen_ptr = strchr(gen_ptr, '\0');
			strcpy(gen_ptr, ", \"");
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, cnxt_ptr->upstream_name);
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, "\", \"");
			gen_ptr = strchr(gen_ptr, '\0');

			if (cnxt_ptr->upstream_name[0] == '!') {
				strcpy(gen_ptr, " \", 0");
				gen_ptr = strchr(gen_ptr, '\0');
			}
			else {
				strcpy(gen_ptr, cnxt_ptr->upstream_port_name);
				gen_ptr = strchr(gen_ptr, '\0');

				strcpy(gen_ptr, "\", ");
				gen_ptr = strchr(gen_ptr, '\0');

				_itoa(cnxt_ptr->upstream_elem_no, gen_ptr, 10);
				gen_ptr = strchr(gen_ptr, '\0');
			}
			strcpy(gen_ptr, ", \"");
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, cnxt_ptr->downstream_name);
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, "\", \"");
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, cnxt_ptr->downstream_port_name);
			gen_ptr = strchr(gen_ptr, '\0');

			strcpy(gen_ptr, "\", ");
			gen_ptr = strchr(gen_ptr, '\0');

			_itoa(cnxt_ptr->downstream_elem_no, gen_ptr, 10);
			gen_ptr = strchr(gen_ptr, '\0');

			if (cnxt_ptr->upstream_name[0] == '!') {
				strcpy(gen_ptr, ", &I");
				gen_ptr = strchr(gen_ptr, '\0');
				_itoa(iip_count, gen_ptr, 10);
				gen_ptr = strchr(gen_ptr, '\0');
				strcpy(gen_ptr, ", 0};\n");
				iip_count++;
			}
			else {
				strcpy(gen_ptr, ", 0, ");
				gen_ptr = strchr(gen_ptr, '\0');
				if (cnxt_ptr->capacity == -1)
					strcpy(gen_ptr, "6");
				else
					_itoa(cnxt_ptr->capacity, gen_ptr, 10);
				gen_ptr = strchr(gen_ptr, '\0');
				strcpy(gen_ptr, "};\n");
			}

			fputs(gen_area, fpo);


			cnxt_count++;
			cnxt_ptr = cnxt_ptr->succ;
		}
		label_ptr = label_ptr->succ;
	}


	gen_ptr = gen_area;
	//strcpy(gen_ptr, "label_ent LABELTAB = {0, \" \", \"\", &C0, &P0, \'L\'};\n");
	strcpy(gen_ptr, "label_ent LABELTAB = {0, \" \", \"\", &C");

	gen_ptr = strchr(gen_ptr, '\0');
	int i = cnxt_count - 1;
	_itoa(i, gen_ptr, 10);

	gen_ptr = strchr(gen_ptr, '\0');
	strcpy(gen_ptr, ", &P");
	gen_ptr = strchr(gen_ptr, '\0');
	i = proc_count - 1;
	_itoa(i, gen_ptr, 10);

	gen_ptr = strchr(gen_ptr, '\0');
	strcpy(gen_ptr, ", \'L\'};\n");

	fputs(gen_area, fpo);

	gen_ptr = gen_area;
	strcpy(gen_ptr, "void main() {\n");
	fputs(gen_area, fpo);
	gen_ptr = gen_area;
	strcpy(gen_ptr, "CppFBP(&LABELTAB, 0, 0, 0);\n}\n");

	fputs(gen_area, fpo);
	strcpy(gen_area, "Gen finished\nOutput written to: ");
	strcat(gen_area, fname);
	strcat(gen_area, "\n");
	printf(gen_area);
	// free(cnxt_tab);
	// free(proc_tab);
	free(label_tab);
	fclose(fp);
	fclose(fpo);

retn:
	system("pause");  // to see console
	return;
}
コード例 #3
0
ファイル: Network.cpp プロジェクト: john-r-iii/cppfbp
void Network::go(label_ent * label_blk, bool dynam, FILE * fp, bool timereq, _anchor proc_anchor) {	
	Process *this_proc;
	cnxt_ent *cnxt_tab;
	proc_ent *proc_tab;
	label_ent *label_tab;
	label_ent *label_curr;
	label_ent *label_new;
	
	char file_name[10];

	Port *cpp;
	time_t st_time, end_time;
	double secs;
	st_time = time(NULL);

	Process * mother = (Process *) proc_anchor.reserved;

	_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);

	label_tab = (label_ent *)malloc(sizeof(label_ent));
	label_curr = label_tab;
	label_ent * label_this = label_blk;
	if (!dynam) {
		for (;;) {
			strcpy(label_curr->label,
				label_this->label);
			strcpy(label_curr->file,
				label_this->file);
			label_curr->cnxt_ptr = 
				label_this->cnxt_ptr;
			label_curr->proc_ptr = 
				label_this->proc_ptr;
			label_curr->ent_type = 
				label_this->ent_type;
			label_this = label_this->succ;
			if (label_this == 0) break;
			label_new = (label_ent *)malloc(sizeof(label_ent));  // handle subnets
			label_curr->succ = label_new;
			label_curr = label_new;
		}

		cnxt_tab = label_tab -> cnxt_ptr;
		proc_tab = label_tab -> proc_ptr;
	}
	else {
		label_tab->succ = 0;
		file_name[0] = '\0'; 

		//if (fp == 0) {
		//	printf("File does not exist: %s\n", fp);
		//	exit(4);
		//}
		if (thxscan(fp, label_tab, file_name) != 0) {

			printf("Scan error\n");
			exit(4);
		}
	}
	//network = new Appl;
	//network = this;
	if (proc_anchor.reserved == NULL)
		strcpy(name,"APPL");
	else
		strcpy(name,"SUBNET");
	//first_ready_proc = 0;
	first_child_proc = 0;
	first_child_comp = 0;
	first_cnxt = 0;
	dynam = dynam;
	active = FALSE;
	possibleDeadlock = FALSE;
	deadlock = FALSE;

	thxbnet(label_tab, mother, this, label_tab);  // first param is network/subnet, 2nd is "mother" process", 4th is network as a whole

	int thread_count = 0;

	this_proc = (Process*) first_child_proc;
	while (this_proc != 0)
	{
		thread_count ++;
		this_proc = this_proc -> next_proc;
	}

	/* Look for processes with no input ports */

	latch =  new Cdl(thread_count);

	Cnxt * cnxt_ptr = (Cnxt *) first_cnxt;
	while (cnxt_ptr != 0) {	 
		cnxt_ptr -> closed = FALSE;
		cnxt_ptr = cnxt_ptr -> succ;
	}

	this_proc = (Process*) first_child_proc;
	while (this_proc != 0)
	{
		this_proc -> network = this;
		this_proc-> self_starting = TRUE;
		cpp = this_proc -> in_ports;
		while (cpp != 0) {	 
			for (int i = 0; i < cpp -> elem_count; i++) {
				if (cpp -> elem_list[i].gen.connxn != 0 &&
					! cpp -> elem_list[i].is_IIP)
					this_proc->self_starting = FALSE;
			}
			cpp = cpp -> succ;
		}
		if (this_proc -> self_starting)
		{
			// add to ready chain
			//this_proc -> status = INITIATED;

			if (this_proc -> trace)
				printf("%s Initiated\n",this_proc -> procname);

			this_proc -> activate();
		}
		//thread_count ++;
		this_proc = this_proc -> next_proc;
	}

	active = TRUE;

	waitForAll();
	delete latch;


	//if (dynam) {                  -- check this out!
	//	free(cnxt_tab);
	//	free(proc_tab);		
	//}


	//free (latch);  
	thxfcbs();
	//free(label_tab);

	end_time = time(NULL);
	secs = difftime(end_time, st_time);
	if (timereq){
		printf("Elapsed time in seconds: %5.3f\n",secs);
	}

	if (strcmp(name, "SUBNET") != 0) {
	  //_CrtDumpMemoryLeaks();
	  //char c; 
	  printf("Press enter to terminate\n");
	  std::cin.get();  // to see console
	  //system("pause");  // to see console
	  exit(0);
	}
}