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

📄 movie.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <bio.h>#include "dict.h"/* Possible tags */enum {	BEG,	/* beginning of entry */	AB,	/* abstract */	AN,	/* database serial number */	AS,	/* author (one at a time) */	AU,	/* all authors */	AW,	/* award_awardee */	BW,	/* bw or c */	CA,	/* cast: character_actor */	CN,	/* cinematography */	CO,	/* country */	CR,	/* miscellaneous job_name */	DE,	/* topic keyword */	DR,	/* director */	ED,	/* editor */	MP,	/* MPAA rating (R, PG, etc.) */	NT,	/* note */	PR,	/* producer and for ...*/	PS,	/* producer (repeats info in PR) */	RA,	/* rating (letter) */	RD,	/* release date */	RT,	/* running time */	RV,	/* review citation */	ST,	/* production or release company (repeats info in PR) */	TI,	/* title[; original foreign title] */	TX,	/* paragraph of descriptive text */	VD,	/* video information (format_time_company; or "Not Avail.") */	NTAG	/* number of tags */};/* Assoc tables must be sorted on first field */static char *tagtab[] = {[BEG]	"$$",[AB]	"AB",[AN]	"AN",[AS]	"AS",[AU]	"AU",[AW]	"AW",[BW]	"BW",[CA]	"CA",[CN]	"CN",[CO]	"CO",[CR]	"CR",[DE]	"DE",[DR]	"DR",[ED]	"ED",[MP]	"MP",[NT]	"NT",[PR]	"PR",[PS]	"PS",[RA]	"RA",[RD]	"RD",[RT]	"RT",[RV]	"RV",[ST]	"ST",[TI]	"TI",[TX]	"TX",[VD]	"VD",};static char	*mget(int, char *, char *, char **);static void	moutall(int, char *, char *);static void	moutall2(int, char *, char *);voidmovieprintentry(Entry ent, int cmd){	char *p, *e, *ps, *pe, *pn;	int n;	ps = ent.start;	pe = ent.end;	if(cmd == 'r') {		Bwrite(bout, ps, pe-ps);		return;	}	p = mget(TI, ps, pe, &e);	if(p) {		outpiece(p, e);		outnl(0);	}	if(cmd == 'h')		return;	outnl(2);	n = 0;	p = mget(RD, ps, pe, &e);	if(p) {		outchars("Released: ");		outpiece(p, e);		n++;	}	p = mget(CO, ps, pe, &e);	if(p) {		if(n)			outchars(", ");		outpiece(p, e);		n++;	}	p = mget(RT, ps, pe, &e);	if(p) {		if(n)			outchars(", ");		outchars("Running time: ");		outpiece(p, e);		n++;	}	p = mget(MP, ps, pe, &e);	if(p) {		if(n)			outchars(", ");		outpiece(p, e);		n++;	}	p = mget(BW, ps, pe, &e);	if(p) {		if(n)			outchars(", ");		if(*p == 'c' || *p == 'C')			outchars("Color");		else			outchars("B&W");		n++;	}	if(n) {		outchar('.');		outnl(1);	}	p = mget(VD, ps, pe, &e);	if(p) {		outchars("Video: ");		outpiece(p, e);		outnl(1);	}	p = mget(AU, ps, pe, &e);	if(p) {		outchars("By: ");		moutall2(AU, ps, pe);		outnl(1);	}	p = mget(DR, ps, pe, &e);	if(p) {		outchars("Director: ");		outpiece(p, e);		outnl(1);	}	p = mget(PR, ps, pe, &e);	if(p) {		outchars("Producer: ");		outpiece(p, e);		outnl(1);	}	p = mget(CN, ps, pe, &e);	if(p) {		outchars("Cinematograpy: ");		outpiece(p, e);		outnl(1);	}	p = mget(CR, ps, pe, &e);	if(p) {		outchars("Other Credits: ");		moutall2(CR, ps, pe);	}	outnl(2);	p = mget(CA, ps, pe, &e);	if(p) {		outchars("Cast: ");		moutall2(CA, ps, pe);	}	outnl(2);	p = mget(AW, ps, pe, &e);	if(p) {		outchars("Awards: ");		moutall2(AW, ps, pe);		outnl(2);	}	p = mget(NT, ps, pe, &e);	if(p) {		outpiece(p, e);		outnl(2);	}	p = mget(AB, ps, pe, &e);	if(p) {		outpiece(p, e);		outnl(2);	}	pn = ps;	n = 0;	while((p = mget(TX, pn, pe, &pn)) != 0) {		if(n++)			outnl(1);		outpiece(p, pn);	}	outnl(0);}longmovienextoff(long fromoff){	long a;	char *p;	a = Bseek(bdict, fromoff, 0);	if(a < 0)		return -1;	for(;;) {		p = Brdline(bdict, '\n');		if(!p)			break;		if(p[0] == '$' && p[1] == '$')			return (Boffset(bdict)-Blinelen(bdict));	}	return -1;}voidmovieprintkey(void){	Bprint(bout, "No key\n");}/* * write a comma-separated list of all tag values between b and e */static voidmoutall(int tag, char *b, char *e){	char *p, *pn;	int n;	n = 0;	pn = b;	while((p = mget(tag, pn, e, &pn)) != 0) {		if(n++)			outchars(", ");		outpiece(p, pn);	}}/* * like moutall, but values are expected to have form: *    field1_field2 * and we are to output 'field2 (field1)' for each * (sometimes field1 has underscores, so search from end) */static voidmoutall2(int tag, char *b, char *e){	char *p, *pn, *us, *q;	int n;	n = 0;	pn = b;	while((p = mget(tag, pn, e, &pn)) != 0) {		if(n++)			outchars(", ");		us = 0;		for(q = pn-1; q >= p; q--)			if(*q == '_') {				us = q;				break;			}		if(us) {			/*			 * Hack to fix cast list Himself/Herself			 */			if(strncmp(us+1, "Himself", 7) == 0 ||			   strncmp(us+1, "Herself", 7) == 0) {				outpiece(p, us);				outchars(" (");				outpiece(us+1, pn);				outchar(')');			} else {				outpiece(us+1, pn);				outchars(" (");				outpiece(p, us);				outchar(')');			}		} else {			outpiece(p, pn);		}	}}/* * Starting from b, find next line beginning with tagtab[tag]. * Don't go past e, but assume *e==0. * Return pointer to beginning of value (after tag), and set * eptr to point at newline that ends the value */static char *mget(int tag, char *b, char *e, char **eptr){	char *p, *t, *ans;	if(tag < 0 || tag >= NTAG)		return 0;	t = tagtab[tag];	ans = 0;	for(p = b;;) {		p = strchr(p, '\n');		if(!p || ++p >= e) {			if(ans)				*eptr = e-1;			break;		}		if(!ans) {			if(p[0] == t[0] && p[1] == t[1])				ans = p+3;		} else {			if(p[0] != ' ') {				*eptr = p-1;				break;			}		}	}	return ans;}

⌨️ 快捷键说明

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