Ejemplo n.º 1
0
void	compile_source_file(unsigned short flen, char *faddr)
{
	plength		plen;
	mval		fstr, ret;
	int		i;
	unsigned char	*p;
	error_def	(ERR_FILEPARSE);
	error_def	(ERR_FILENOTFND);
	error_def	(ERR_ERRORSUMMARY);

	if (MAX_FBUFF < flen)
	{
		dec_err(VARLSTCNT(4) ERR_FILEPARSE, 2, flen, faddr);
		dollar_zcstatus = ERR_ERRORSUMMARY;
	} else
	{
		fstr.mvtype = MV_STR;
		fstr.str.addr = faddr;
		fstr.str.len = flen;
		ESTABLISH(source_ch);
		tt_so_do_once = FALSE;
		for (i = 0 ;  ; i++)
		{
			plen.p.pint = op_fnzsearch(&fstr, 0, &ret);
			if (!ret.str.len)
			{
				if (!i)
				{
					dec_err(VARLSTCNT(4) ERR_FILENOTFND, 2, fstr.str.len, fstr.str.addr);
					dollar_zcstatus = ERR_ERRORSUMMARY;
				}
				break;
			}
			assert(ret.mvtype == MV_STR);
			assert(ret.str.len <= MAX_FBUFF);
			source_name_len = ret.str.len;
			memcpy(source_file_name, ret.str.addr, source_name_len);
			source_file_name[source_name_len] = 0;
			p = &source_file_name[plen.p.pblk.b_dir];
			if ((plen.p.pblk.b_dir >= sizeof("/dev/") - 1) && !MEMCMP_LIT(source_file_name, "/dev/"))
				tt_so_do_once = TRUE;
			else if (plen.p.pblk.b_ext != 2
				 || ('M' != p[plen.p.pblk.b_name + 1]  &&  'm' != p[plen.p.pblk.b_name + 1]))
			{
				dec_err(VARLSTCNT(4) ERR_FILEPARSE, 2, source_name_len, source_file_name);
				dollar_zcstatus = ERR_ERRORSUMMARY;
				continue;
			}

			if (compiler_startup())
				dollar_zcstatus = ERR_ERRORSUMMARY;

			if (tt_so_do_once)
				break;
		}
		REVERT;
	}
}
Ejemplo n.º 2
0
void	compile_source_file(unsigned short flen, char *faddr, boolean_t MFtIsReqd)
{
	plength		plen;
	mval		fstr, ret;
	int		i, rc;
	unsigned char	*p;
	boolean_t	wildcarded, dm_action;
	DCL_THREADGBL_ACCESS;

	SETUP_THREADGBL_ACCESS;
	if (MAX_FBUFF < flen)
	{
		dec_err(VARLSTCNT(4) ERR_FILEPARSE, 2, flen, faddr);
		TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
	} else
	{
		object_file_des = FD_INVALID;
		fstr.mvtype = MV_STR;
		fstr.str.addr = faddr;
		fstr.str.len = flen;
		ESTABLISH(source_ch);
		tt_so_do_once = FALSE;
		zsrch_clr(STRM_COMP_SRC);	/* Clear any existing search cache */
		for (i = 0; ; i++)
		{
			plen.p.pint = op_fnzsearch(&fstr, STRM_COMP_SRC, 0, &ret);
			if (!ret.str.len)
			{
				if (!i)
				{
					dec_err(VARLSTCNT(4) ERR_FILENOTFND, 2, fstr.str.len, fstr.str.addr);
					TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
				}
				break;
			}
			assert(ret.mvtype == MV_STR);
			assert(ret.str.len <= MAX_FBUFF);
			source_name_len = ret.str.len;
			memcpy(source_file_name, ret.str.addr, source_name_len);
			source_file_name[source_name_len] = 0;
			p = &source_file_name[plen.p.pblk.b_dir];
			if ((plen.p.pblk.b_dir >= SIZEOF("/dev/") - 1) && !MEMCMP_LIT(source_file_name, "/dev/"))
				tt_so_do_once = TRUE;
			else if (MFtIsReqd && (plen.p.pblk.b_ext != 2 || ('M' != p[plen.p.pblk.b_name + 1]
									  &&  'm' != p[plen.p.pblk.b_name + 1])))
			{	/* M filetype is required but not present */
				dec_err(VARLSTCNT(4) ERR_FILEPARSE, 2, source_name_len, source_file_name);
				TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
				continue;
			}
			if (compiler_startup())
				TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
			if (FD_INVALID != object_file_des)
			{
				CLOSEFILE_RESET(object_file_des, rc);	/* resets "object_file_des" to FD_INVALID */
				if (-1 == rc)
					rts_error_csa(CSA_ARG(NULL) VARLSTCNT(5) ERR_OBJFILERR, 2,
							object_name_len, object_file_name, errno);
			}
			if (tt_so_do_once)
				break;
		}
		REVERT;
	}
}
Ejemplo n.º 3
0
void compile_source_file(unsigned short flen, char *faddr, boolean_t mExtReqd /* not used in VMS */)
{
	struct FAB	srch_fab;
	struct NAM	srch_nam;
	char		exp_string_area[255], list_file[256], obj_file[256], ceprep_file[256];
	int		status;
	DCL_THREADGBL_ACCESS;

	SETUP_THREADGBL_ACCESS;
	obj_fab = cc$rms_fab;
	srch_fab = cc$rms_fab;
	srch_fab.fab$l_dna = DOTM;
	srch_fab.fab$b_dns = STR_LIT_LEN(DOTM);
	srch_fab.fab$l_fna = faddr;
	srch_fab.fab$b_fns = flen;
	srch_fab.fab$l_fop |= FAB$M_NAM;
	srch_fab.fab$l_nam = &srch_nam;
	srch_nam = cc$rms_nam;
	srch_nam.nam$l_rsa = source_file_name;
	srch_nam.nam$b_rss = NAME_MAX;		/* 255 since PATH_MAX is 256 on 7.3-2 */
	srch_nam.nam$l_esa = exp_string_area;
	srch_nam.nam$b_ess = SIZEOF(exp_string_area);
	status = sys$parse(&srch_fab);
	if (RMS$_NORMAL != status)
	{	dec_err(VARLSTCNT(4) ERR_SRCFILERR, 2, source_name_len, source_file_name);
		dec_err(VARLSTCNT(1) status);
		TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
	} else
	{
		cmd_qlf.object_file.str.addr = obj_file;
		cmd_qlf.object_file.str.len = 255;
		cmd_qlf.list_file.str.addr = list_file;
		cmd_qlf.list_file.str.len = 255;
		cmd_qlf.ceprep_file.str.addr = ceprep_file;
		cmd_qlf.ceprep_file.str.len = 255;
		get_cmd_qlf(&cmd_qlf);
		tt_so_do_once = FALSE;
		for (; ;)
		{
			if (srch_fab.fab$l_dev & DEV$M_FOD)
			{	status = sys$search(&srch_fab);
				if (status == RMS$_NMF )
				{	break;
				}
				else if (status == RMS$_FNF)
				{	dec_err(VARLSTCNT(4) ERR_FILENOTFND, 2, srch_nam.nam$b_esl, srch_nam.nam$l_esa);
					TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
					break;
				}
				else 	if (status != RMS$_NORMAL)
				{	dec_err(VARLSTCNT(4) ERR_SRCFILERR, 2, source_name_len, source_file_name);
					dec_err(VARLSTCNT(1) status);
					TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
					break;
				}
				else
				{	source_name_len = srch_nam.nam$b_rsl;
					source_file_name[source_name_len] = '\0';
				}
			} else
			{	source_name_len = SIZEOF("SYS$INPUT");
				memcpy(source_file_name, "SYS$INPUT", source_name_len);
				source_file_name[source_name_len] = '\0';
				tt_so_do_once = TRUE;
			}
			if (compiler_startup())
				TREF(dollar_zcstatus) = ERR_ERRORSUMMARY;
			else
			{
				status = sys$close(&obj_fab);
				obj_fab = cc$rms_fab;
				if (RMS$_NORMAL != status)
					rts_error(VARLSTCNT(6) ERR_OBJFILERR, 2, object_name_len, object_file_name, status,
						  obj_fab.fab$l_stv);
			}
			if (tt_so_do_once)
				break;
		}
	}
}