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

📄 mus

📁 早期freebsd实现
💻
字号:
#!/usr/bin/perlwhile (<>) {    if (s/^CASE\s+//) {	@fields = split;	$funcname = pop(@fields);	$rettype = "@fields";	@modes = ();	@types = ();	@names = ();	@outies = ();	@callnames = ();	$pre = "\n";	$post = '';	while (<>) {	    last unless /^[IO]+\s/;	    @fields = split(' ');	    push(@modes, shift(@fields));	    push(@names, pop(@fields));	    push(@types, "@fields");	}	while (s/^<\s//) {	    $pre .= "\t    $_";	    $_ = <>;	}	while (s/^>\s//) {	    $post .= "\t    $_";	    $_ = <>;	}	$items = @names;	$namelist = '$' . join(', $', @names);	$namelist = '' if $namelist eq '$';	print <<EOF;    case US_$funcname:	if (items != $items)	    fatal("Usage: &$funcname($namelist)");	else {EOF	if ($rettype eq 'void') {	    print <<EOF;	    int retval = 1;EOF	}	else {	    print <<EOF;	    $rettype retval;EOF	}	foreach $i (1..@names) {	    $mode = $modes[$i-1];	    $type = $types[$i-1];	    $name = $names[$i-1];	    if ($type =~ /^[A-Z]+\*$/) {		$cast = "*($type*)";	    }	    else {		$cast = "($type)";	    }	    $what = ($type =~ /^(struct\s+\w+|char|[A-Z]+)\s*\*$/ ? "get" : "gnum");	    $type .= "\t" if length($type) < 4;	    $cast .= "\t" if length($cast) < 8;	    $x = "\t" x (length($name) < 6);	    if ($mode =~ /O/) {		if ($what eq 'gnum') {		    push(@outies, "\t    str_numset(st[$i], (double) $name);\n");		    push(@callnames, "&$name");		}		else {		    push(@outies, "\t    str_set(st[$i], (char*) $name);\n");		    push(@callnames, "$name");		}	    }	    else {		push(@callnames, $name);	    }	    if ($mode =~ /I/) {	    print <<EOF;	    $type	$name =$x	$cast	str_$what(st[$i]);EOF	    }            elsif ($type =~ /char/) {            print <<EOF;	    char	${name}[133];EOF	    }	    else {		print <<EOF;	    $type	$name;EOF	    }	}	$callnames = join(', ', @callnames);	$outies = join("\n",@outies);	if ($rettype eq 'void') {	    print <<EOF;$pre	    (void)$funcname($callnames);EOF	}	else {	    print <<EOF;$pre	    retval = $funcname($callnames);EOF	}	if ($rettype =~ /^(struct\s+\w+|char)\s*\*$/) {	    print <<EOF;	    str_set(st[0], (char*) retval);EOF	}	elsif ($rettype =~ /^[A-Z]+\s*\*$/) {	    print <<EOF;	    str_nset(st[0], (char*) &retval, sizeof retval);EOF	}	else {	    print <<EOF;	    str_numset(st[0], (double) retval);EOF	}	print $outies if $outies;	print $post if $post;	if (/^END/) {	    print "\t}\n\treturn sp;\n";	}	else {	    redo;	}    }    elsif (/^END/) {	print "\t}\n\treturn sp;\n";    }    else {	print;    }}

⌨️ 快捷键说明

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