⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reprosrc.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/***** spin: reprosrc.c *****//* Copyright (c) 2002-2003 by Lucent Technologies, Bell Laboratories.     *//* All Rights Reserved.  This software is for educational purposes only.  *//* No guarantee whatsoever is expressed or implied by the distribution of *//* this code.  Permission is given to distribute this code provided that  *//* this introductory message is not removed and no monies are exchanged.  *//* Software written by Gerard J. Holzmann.  For tool documentation see:   *//*             http://spinroot.com/                                       *//* Send all bug-reports and/or questions to: bugs@spinroot.com            */#include <stdio.h>#include "spin.h"#ifdef PC#include "y_tab.h"#else#include "y.tab.h"#endifstatic int indent = 1;extern ProcList	*rdy;void repro_seq(Sequence *);voiddoindent(void){	int i;	for (i = 0; i < indent; i++)		printf("   ");}voidrepro_sub(Element *e){	doindent();	switch (e->n->ntyp) {	case D_STEP:		printf("d_step {\n");		break;	case ATOMIC:		printf("atomic {\n");		break;	case NON_ATOMIC:		printf(" {\n");		break;	}	indent++;	repro_seq(e->n->sl->this);	indent--;	doindent();	printf(" };\n");}voidrepro_seq(Sequence *s){	Element *e;	Symbol *v;	SeqList *h;	for (e = s->frst; e; e = e->nxt)	{		v = has_lab(e, 0);		if (v) printf("%s:\n", v->name);		if (e->n->ntyp == UNLESS)		{	printf("/* normal */ {\n");			repro_seq(e->n->sl->this);			doindent();			printf("} unless {\n");			repro_seq(e->n->sl->nxt->this);			doindent();			printf("}; /* end unless */\n");		} else if (e->sub)		{			switch (e->n->ntyp) {			case DO: doindent(); printf("do\n"); indent++; break;			case IF: doindent(); printf("if\n"); indent++; break;			}			for (h = e->sub; h; h = h->nxt)			{	indent--; doindent(); indent++; printf("::\n");				repro_seq(h->this);				printf("\n");			}			switch (e->n->ntyp) {			case DO: indent--; doindent(); printf("od;\n"); break;			case IF: indent--; doindent(); printf("fi;\n"); break;			}		} else		{	if (e->n->ntyp == ATOMIC			||  e->n->ntyp == D_STEP			||  e->n->ntyp == NON_ATOMIC)				repro_sub(e);			else if (e->n->ntyp != '.'			     &&  e->n->ntyp != '@'			     &&  e->n->ntyp != BREAK)			{				doindent();				if (e->n->ntyp == C_CODE)				{	printf("c_code ");					plunk_inline(stdout, e->n->sym->name, 1);				} else if (e->n->ntyp == 'c'				       &&  e->n->lft->ntyp == C_EXPR)				{	printf("c_expr { ");					plunk_expr(stdout, e->n->lft->sym->name);					printf("} ->\n");				} else				{	comment(stdout, e->n, 0);					printf(";\n");			}	}		}		if (e == s->last)			break;	}}voidrepro_proc(ProcList *p){	if (!p) return;	if (p->nxt) repro_proc(p->nxt);	if (p->det) printf("D");	/* deterministic */	printf("proctype %s()", p->n->name);	if (p->prov)	{	printf(" provided ");		comment(stdout, p->prov, 0);	}	printf("\n{\n");	repro_seq(p->s);	printf("}\n");}voidrepro_src(void){	repro_proc(rdy);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -