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

📄 init.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
 */voidInitOutput(pScreenInfo, argc, argv)     ScreenInfo	  *pScreenInfo;     int     	  argc;     char    	  **argv;{    int i;    FILE *in;    static int firstTime = 1;    static int numScreens;    static ScreenTableRec *FoundScreens[MAXSCREENS];    ScreenTableRec *s;#ifdef hpux    char *dispaddr, *getenv();#endif    struct stat statbuf;    char minornumber[10];    /*     * test for data alignment restriction of this cpu.  If this cpu     * doesn't allow long-word writes on an odd address, then we assume     * that it requires quad-word alignment.  This reduces our headaches     * to only two cases - 68020s (no restrictions) and others (e.g.     * 68010 and Spectrum).     */    {	int *test;	char foo[8]; 	static struct sigvec timeout_vec = { sigbusHandler, 0, 0 };	struct sigvec old_vec;	test = (int *) ((int)foo | 3) + 1; /* generate an odd address */	XHP_QUADALIGN = 0;#ifdef hp300#define sigvector sigvec#endif#if defined(hp9000s300) || defined(hp300)     /* check for 310 */	sigvector(SIGBUS, &timeout_vec, &old_vec);	if(!setjmp(env))	    *test = 1;  /* generate a bus error on 68010s or Spectrums */	sigvector(SIGBUS, &old_vec, 0);#else  /* need word align on 800 */	XHP_QUADALIGN = 1;#endif /* hp9000s300 */    }    iomapBase = (unsigned char *) IOMAP_BASE;#ifdef hpux    if (dispaddr = getenv("SB_DISPLAY_ADDR"))	iomapBase = (unsigned char *) strtol(dispaddr, (char **)NULL, 0);#endif    pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;    pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;    pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;    pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;    pScreenInfo->numPixmapFormats = NUMFORMATS;    for (i=0; i< NUMFORMATS; i++)	pScreenInfo->formats[i] = formats[i];        if (firstTime)    {	firstTime = 0;	    	(void) sprintf(xscreens, "%s/X%sscreens", LIBDIR, display);	if (NULL == (in = fopen (xscreens, "r")))	{	    perror(xscreens);	    ErrorF("Can't open screen configuration file, defaulting to %s.\n",		   DefaultScreen);	    ConfigFile=FALSE;        }	else	    ConfigFile=TRUE;	numScreens = 0;	for (i = 0; i<MAXSCREENS && ((!ConfigFile) ? TRUE : ! feof(in) ); i++)	{	    char *argv[MAXARG];	    int argc;	    if (!ConfigFile)		argv[0] = DefaultScreen;	    else	    {		while (!(argc = ReadLine(in, argv))) /* handle blank lines */		    ;		if (argc == -1)	/* eof */		    break;		if (argc < 0)		{		    ErrorF("InitOutput: %s: line %d: Too many fields.\n",			   xscreens, i+1);		    goto fatal_error;		}		/* for compatibility with R2 screens tables */		if (argc == 3)		{		    if ((strcmp (argv[0], "topcat") == 0) || 			(strcmp (argv[0], "Topcat") == 0))		    {			argv[0] = argv[2];			argc = 1;		    }		    else		    {			ErrorF ("InitOutput:  %s, line %d:  unsupported display type \"%s\".\n",				xscreens, i+1, argv[0]);			goto fatal_error;		    }		}		if ( argc != 1 )		{		    ErrorF("InitOutput: %s: line %d: Wrong number of fields.\n", xscreens, i+1);		    goto fatal_error;		}	    }    	    if ((s = FindScreen(argv[0])) == NULL)	    {		ErrorF("InitOutput: %s: line %d: Unknown screen %s.\n",		       xscreens, i+1, argv[0]);		goto fatal_error;	    }	    /* munge new structure to match old argv structures */	    /* BOGOSITY ALERT argv and argc are munged for subsequent calls */	    argv[2] = argv[0];	    argv[0] = s->productNickname;	    if (stat(argv[2], &statbuf) < 0)	    {		ErrorF("InitOutput: %s: could not stat %s.\n",argv[0],argv[2]);		goto fatal_error;	    }#ifdef hpux	    (void) sprintf(minornumber, "%x", minor(statbuf.st_rdev));#else	    (void) sprintf(minornumber, "%d", minor(statbuf.st_rdev));#endif	    argv[3] = minornumber;	    argc = 4;	    if (!(s->InfoScreen)(numScreens, argv, argc))	    {		ErrorF("InitOutput: %s: line %d: Couldn't find this screen %s.\n",		       xscreens, i+1, argv[0]);		goto fatal_error;	    }	    FoundScreens[numScreens++] = s;	    if (!ConfigFile) break;	}	if (ConfigFile)	    fclose(in);    }    for (i=0; i<numScreens; i++)    {	s = FoundScreens[i];	if (AddScreen(s->InitScreen, argc, argv) < 0)	{	    ErrorF("InitOutput: Couldn't add a screen.\n");	    exit (1);	}    }    return;  fatal_error:    fclose(in);    ErrorF("InitOutput: Couldn't initialize screens.\n");    exit(1);}static intReadLine(in, argv)    FILE *in;    char **argv;{    int argc;    static char line[MAXSTRING];    char *s;    int state;    if (NULL == fgets(line, MAXSTRING, in))	return(-1);    for (state = argc = 0, s = line; argc < MAXARG; s++)    {	switch ( *s )	{	    case '#':	    case '\n':		*s = '\0';	    case '\0':		return (argc);	    case ' ':	    case '\t':		state = 0;		*s = '\0';		break;	    default:		if ( state == 0 )		{		    state = 1;		    argv[argc++] = s;		}		break;	}    }    return(-2);}#define STUPID_MOBERLY -1/* Declare the ScreenInfo(), ScreenInit() and ScreenClose() functions here. */extern Bool mobScreenInfo(), mobScreenInit();extern Bool gbxScreenInfo(), gbxScreenInit();extern Bool topcatScreenInfo(), topcatScreenInit();extern Bool mrtopcatScreenInfo(), mrtopcatScreenInit();extern Bool catseyeScreenInfo(), catseyeScreenInit();extern Bool renScreenInfo(), renScreenInit();extern Bool orenScreenInfo(), orenScreenInit();extern Bool davinciScreenInfo(), davinciScreenInit();extern Bool oDavinciScreenInit();extern Bool hyperScreenInfo(), hyperScreenInit();/* * Table of known frame buffers */static ScreenTableRec screenTable[] = {    {"98633", "moberly", mobScreenInfo, mobScreenInit},    {"98700", "gatorbox", gbxScreenInfo, gbxScreenInit},    {"98547", "topcat", topcatScreenInfo, topcatScreenInit},    {"98543", "mrtopcat", mrtopcatScreenInfo, mrtopcatScreenInit},    {"98550", "catseye", topcatScreenInfo, topcatScreenInit},    {"98720", "renaissance", renScreenInfo, renScreenInit},    {"98720", "orenaissance", orenScreenInfo, orenScreenInit},    {"98730", "davinci", davinciScreenInfo, davinciScreenInit},    {"98730", "odavinci", davinciScreenInfo, oDavinciScreenInit},    {"a1096a", "hyperion", hyperScreenInfo, hyperScreenInit},    {(char *) NULL, (char *) NULL, (Bool (*)()) NULL, (Bool (*)()) NULL}};static ScreenTableRec *FindScreen(devname)    char *devname;{    ScreenTableRec *s;    int fd, gcid;#ifdef hpux    int gcon;#endif    char name[40];    static struct stat buf;    struct hp_grfreg *ce;    if ((fd = open(devname, O_RDWR)) <  0)    {        perror(devname);        ErrorF("FindScreen couldn't open %s \n", devname);        return (NULL);    }#ifdef hpux    if (ioctl(fd, GCON, &gcon) < 0 || ioctl(fd, GCID, &gcid) < 0)	gcid = STUPID_MOBERLY;#else    {	struct grfinfo gi;	if (ioctl(fd, GRFIOCGINFO, &gi) < 0 || ioctl(fd, GRFIOCON, 0) < 0)	    gcid = STUPID_MOBERLY;	else	    gcid = gi.gd_id;    }#endif    fstat(fd, &buf);    switch (gcid)    {      case GCID_GATORBOX:	strcpy(name, "gatorbox");	break;      case GCID_TOPCAT:#ifdef hpux	ce = (struct hp_grfreg *) iomapBase;	if (ioctl(fd, GCMAP, &ce) < 0)	{	    perror("GCMAP:");	    ErrorF("FindScreen: Error getting address of %s\n", devname);	    close (fd);	    return (NULL);	}#else        {	    u_char *Addr = (u_char *) 0;		  	    if (ioctl (fd, GRFIOCMAP, &Addr) < 0)	    {		(void) ioctl (fd, GRFIOCOFF, 0);		perror("GRFIOCMAP:");		ErrorF("FindScreen: Error getting address of %s\n", devname);		close (fd);		return (NULL);	    }	    ce = (struct hp_grfreg *) Addr;	}#endif	if (ce->gr_id2 >= ID2_LCC)	    strcpy(name, "catseye");	else if (ce->gr_bits)	    strcpy(name, "mrtopcat");	else	    strcpy(name, "topcat");#ifdef hpux	if (ioctl(fd, GCUNMAP, &ce) < 0)	{	    perror("GCUNMAP:");	    ErrorF("FindScreen: Error freeing temp storage %s\n", devname);	    close (fd);	    return (NULL);	}	#else	if (ioctl(fd, GRFIOCUNMAP, &ce) < 0)	{	    perror("GRFIOCUNMAP:");	    ErrorF("FindScreen: Error freeing temp storage %s\n", devname);	    close (fd);	    return (NULL);	}#endif	break;      case GCID_RENAISSANCE:	if ((minor(buf.st_rdev)) & 0x000003)	    strcpy(name, "orenaissance");	else	    strcpy(name, "renaissance");	break;      case GCID_FIREEYE:	strcpy(name, "catseye");	break;      case GCID_HYPERION:	strcpy(name, "hyperion");	break;      case GCID_DAVINCI:	if ((minor(buf.st_rdev)) & 0x000003)	    strcpy(name, "odavinci");	else	    strcpy(name, "davinci");	break;      case STUPID_MOBERLY:	strcpy(name, "moberly");	break;      default:	ErrorF("FindScreen: unknown screen type  %s \n", devname);	return (NULL);    }    close (fd);    for (s = screenTable; s->productNumber != NULL; s++)    {	if (strcmp(s->productNumber, name) == 0 ||	    strcmp(s->productNickname, name) == 0)	    return (s);    }    return (NULL);}#ifdef hpuxunsigned char *FrameBufferBase(size)    long int size;{    unsigned char *base = iomapBase;    /* Round size to a 4K page */    size = (size + 4095) & 0xfffff000;    iomapBase += size;    return ( base );}#endif/* * DDX - specific abort routine.  Called by AbortServer(). */voidAbortDDX(){}/* Called by GiveUp(). */voidddxGiveUp(){}intddxProcessArgument (argc, argv, i)    int	argc;    char *argv[];    int	i;{    if (strcmp (argv[i], "-tcbd") == 0)    {	TopcatBrainDamage++;	return 1;    }    if (strcmp (argv[i], "-catseyeMono") == 0)    {	catseyeMono++;	return 1;    }    return 0;}voidddxUseMsg(){    ErrorF("-tcbd                  run in topcat braindamage mode\n");    ErrorF("-catseyeMono           run 2bit deep catseyes in Monochrome\n");}

⌨️ 快捷键说明

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