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

📄 mod.pl

📁 目前最精确的磁盘模拟器的第3版
💻 PL
字号:
#!/usr/bin/perl# libparam (version 1.0)# Authors: John Bucy, Greg Ganger# Contributors: John Griffin, Jiri Schindler, Steve Schlosser## Copyright (c) of Carnegie Mellon University, 2001, 2002, 2003.## This software is being provided by the copyright holders under the# following license. By obtaining, using and/or copying this# software, you agree that you have read, understood, and will comply# with the following terms and conditions:## Permission to reproduce, use, and prepare derivative works of this# software is granted provided the copyright and "No Warranty"# statements are included with all reproductions and derivative works# and associated documentation. This software may also be# redistributed without charge provided that the copyright and "No# Warranty" statements are included in all redistributions.## NO WARRANTY. THIS SOFTWARE IS FURNISHED ON AN "AS IS" BASIS.# CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER# EXPRESSED OR IMPLIED AS TO THE MATTER INCLUDING, BUT NOT LIMITED# TO: WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY# OF RESULTS OR RESULTS OBTAINED FROM USE OF THIS SOFTWARE. CARNEGIE# MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH# RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT# INFRINGEMENT.  COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY USE# OF THIS SOFTWARE OR DOCUMENTATION.  $modctr = 0;@paramlines = ();$startenum = 0;$linenum = 0;$package = $ARGV[0];$PACKAGE = $package; $PACKAGE =~ tr/a-z/A-Z/;$filename = $ARGV[1];open(FILE, "$filename") || die("couldn't open $filename!");sub mkname {    $_ = $_[0];    # upcase    tr/a-z/A-Z/;    # replace whitespace and dashes with underscores    tr/ \t-/_/;    s/[\/\\\.]//g;    # eat things in parens    s/\(.*\)//g;    # eat trailing whitespace    s/[ \t]*$//;    # eat leading whitespace    s/^[ \t]*//;        return "$_[1]" . "_" . "$_";}sub print_head {# print out loop, switch statement, var setup, etcprint CODE "#define STACK_MAX 32{    int c;    int needed = 0;    int param_stack[STACK_MAX];    int stack_ptr = 0;  // index of first free slot    BITVECTOR(paramvec, $_[1]","_MAX_PARAM);    bit_zero(paramvec, $_[1]","_MAX_PARAM);    for(c = 0; c < b->params_len; c++) {	int pnum;	int i = 0; 	double d = 0.0; 	char *s = 0; 	struct lp_block *blk = 0;	struct lp_list *l = 0;		if(!b->params[c]) continue;TOP:	pnum = lp_param_name(lp_mod_name(\"$_[0]\"), b->params[c]->name);        // don't initialize things more than once	if(BIT_TEST(paramvec, pnum)) continue;	if(stack_ptr > 0) {	    for(c = 0; c < b->params_len; c++) {	        if(lp_param_name(lp_mod_name(\"$_[0]\"), b->params[c]->name) == needed)		    goto FOUND;            }	    break;	}      FOUND:	switch(PTYPE(b->params[c])) {	    case I:  i   = IVAL(b->params[c]); break;	    case D:  d   = DVAL(b->params[c]); break;	    case S:  s   = SVAL(b->params[c]); break;	    case LIST: l = LVAL(b->params[c]); break;	  default: blk = BVAL(b->params[c]); break;	}	switch(pnum) {";}sub startDoc {#    print DOC "\\begin{tabular}{|l|l|l|l|}\n";}sub endDoc {##print DOC "}\\\\ \n"; # end the last multicolumn##print DOC "\\cline{1-4}\n";    endParamDoc();#    print DOC "\\end{tabular}\\\\ \n";}sub startParamDoc {    my $tmpmodname = $_[0]; $tmpmodname =~ s/_/\\_/g;    my $tmpname = $_[1]; $tmpname =~ s/_/\\_/g;     my $type = $_[2];    my $req = $_[3];        @paramDocLines = ();    $type =~ s/LIST/list/;    $type =~ s/BLOCK/block/;    $type =~ s/I/int/;    $type =~ s/D/float/;    $type =~ s/S/string/;    $req =~ s/1/required/;    $req =~ s/0/optional/;    print DOC "\\noindent \n";    print DOC "\\begin{tabular}{|p{1.5in}|p{3.5in}|p{0.5in}|p{0.5in}|}\n";    print DOC "\\cline{1-4}\n";    print DOC "\\texttt{$tmpmodname} & \\texttt{$tmpname} & $type & $req \\\\ \n";    print DOC "\\cline{1-4}\n";}sub fillParamDoc {    $tmp = $_[0];    $tmp =~ s/_/\_/g;    if(!($tmp =~ /^[ \t]*$/)) {	push(@paramDocLines,$tmp);    }}sub endParamDoc {    if($#paramDocLines >= 0) {	print DOC "\\multicolumn{4}{|p{6in}|}{\n";	foreach $l (@paramDocLines) {	    print DOC "$l\n";	}	print DOC "}\\\\ \n\\cline{1-4}\n\\multicolumn{4}{p{5in}}{}\\\\\n";    }    print DOC "\\end{tabular}\\\\ \n";}while(<FILE>) {    $linenum++;    chomp();    # eat comments    s/#.*//;    # eat trailing whitespace    s/[ \t]*$//;    # eat leading whitespace    s/^[ \t]*//;    # mash whitespace together    s/\t+/\t/g;    s/ +/ /g;    # eat empty lines    if(/^[ \t]*$/) { next; }    if(/MODULE[ \t]+(.*)/) {	$_ = $1;        $_ = join("_", ($package, $_));	tr/-/_/;	open(HEADER, ">$_"."_param.h");	open(CODE, ">$_"."_param.c");        open(DOC, ">$_"."_param.tex");	$modname = $_;	tr/a-z/A-Z/;	s/ \t/_/g;	$MODNAME = $_;        print HEADER "#include <libparam/libparam.h>\n";	print HEADER "\n#ifndef _" . $MODNAME ."_PARAM_H\n";	print HEADER "#define _" .  $MODNAME ."_PARAM_H  \n\n";	startDoc();        print_head($modname, $MODNAME);    }    elsif(/PROTO (.*)/) {	print HEADER "\n/* prototype for $modname param loader function */\n";	print HEADER "   $1\n\n";    }    elsif(/PARAM (.*)/) {	if(!$startenum) { print HEADER "typedef enum {\n"; $startenum = 1; }	$closeEnum = 1;	$elseopen = 0;	# close off case block	if($modctr) { print CODE "} break;\n"; }	($name,$type,$req) = split(/\t+/, $1);	$NAME = mkname($name, $MODNAME);	print HEADER "   $NAME,\n";	print CODE "case $NAME:\n{\n";#	print CODE "printf(\"$NAME\\n\");" ;	$modctr++;	$closeTest = 0;        # close off the previous multicolumn if there was one        if($modctr > 1) { 	    endParamDoc();        }	startParamDoc($modname, $name, $type, $req);		push(@paramlines, "{\"$name\", $type, $req }");    }    elsif(/TEST (.*)/) {#	print CODE "#line $linenum \"modules/$filename\"\n";	print CODE "if(!($1)) { BADVALMSG(b->params[c]->name); return 0; }\n";	$closeTest = 1;    }    elsif(/INIT(.*)/) {	$stuff = $1;	if($closeTest && ! $elseopen) {	    print CODE "else {\n";	}#	print CODE "#line $linenum \"modules/$filename\"\n";	print CODE "$stuff\n";	if($closeTest && ! $elseopen) { print CODE "}\n"; }	$elseopen = 1;    }    elsif(/DEPEND (.*)/) {	$PARAMNAME = mkname($1, $MODNAME);	print CODE "if(!BIT_TEST(paramvec, $PARAMNAME)) { ";	print CODE "  param_stack[stack_ptr++] = c; ";	print CODE "  needed = $PARAMNAME; continue;  }";    }    else {	if(!/^[ \t]*$/) {	    fillParamDoc($_);	}    }}if($modctr) {     # close off the last case    print CODE "} break;\n";     # nix the trailing comma -- ssh hack!    seek(HEADER, (tell(HEADER) - 2), SEEK_SET);}if($closeEnum) {    $typename = join("_", ($modname, "param_t"));    print HEADER "\n} $typename;\n\n";}print HEADER "#define $MODNAME"."_MAX_PARAM\t\t$NAME\n";# print HEADER "#include <libparam.h>\n";$aname = join("_", ($modname, "params"));print HEADER "\n\nstatic struct lp_varspec $aname [] = {\n";foreach (@paramlines) {    print HEADER "   $_,\n";    $c++;}print HEADER "   {0,0,0}\n};\n";$maxstr = join("_", ($MODNAME, "MAX"));print CODE "    default: assert(0); break; \n";print CODE "    } /* end of switch */ \n";print CODE "    BIT_SET(paramvec, pnum);\n";print CODE "    if(stack_ptr > 0) { c = param_stack[--stack_ptr]; goto TOP; }";print CODE "    } /* end of outer for loop */ \n";print CODE "  for(c = 0; c <= $maxstr; c++) {    if($aname"."[c].req && !BIT_TEST(paramvec,c)) {      fprintf(stderr, \"*** error: in $MODNAME spec -- missing required parameter \\\"%s\\\"\n\", $aname"."[c].name);      return 0;    }  }";print CODE "} /* end of scope */ \n\n ";print HEADER "#define $maxstr $modctr\n";$structname = join("_", ($modname, "mod"));$loaderstr = join("_", ($modname, "loadparams"));print HEADER "static struct lp_mod $structname = { \"$modname\", $aname, $maxstr, (lp_modloader_t)$loaderstr,  0,0 };\n";# print HEADER "static struct lp_mod $structname = { 0, 0, 0, 0, 0, 0 };\n";print HEADER "#endif // _" . $MODNAME . "_PARAM_H\n";endDoc();close(HEADER);close(CODE);close(DOC);

⌨️ 快捷键说明

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