예제 #1
0
파일: devpalsa.c 프로젝트: cynthia/ocp-osx
static char *alsaDebug(void)
{
	static char buffer[100];
	strcpy(buffer, "devpalsa: ");
	convnum(cachelen, buffer+9, 10, 5, 1);
	strcat(buffer, "/");
	convnum(kernlen, buffer+15, 10, 5, 1);
	strcat(buffer, "/");
	convnum(buflen, buffer+21, 10, 5, 1);
	return buffer;
}
예제 #2
0
static int
check_atapi(int fd)
{
	union scsi_cdb cdb;
	struct uscsi_cmd cmd;
	uchar_t buff[SCSIBUFLEN];

	fill_mode_page_cdb(&cdb, ATAPI_CAPABILITIES);
	fill_command_g1(&cmd, &cdb, (caddr_t)buff, sizeof (buff));

	if (ioctl(fd, USCSICMD, &cmd) >= 0) {
	    int			bdesclen;
	    struct capabilities	*cap;
	    struct mode_header_g2 *mode;

	    mode = (struct mode_header_g2 *)buff;

	    bdesclen = (int)convnum(mode->desclen, 2);
	    cap = (struct capabilities *)
		&buff[sizeof (struct mode_header_g2) + bdesclen];

	    if (dm_debug > 1) {
		(void) fprintf(stderr, "INFO: uscsi atapi capabilities\n");
	    }

	    /* These are in order of how we want to report the drv type. */
	    if (cap->dvdram_write) {
		return (DM_DT_DVDRAM);
	    }
	    if (cap->dvdr_write) {
		return (DM_DT_DVDR);
	    }
	    if (cap->dvdrom_read) {
		return (DM_DT_DVDROM);
	    }
	    if (cap->cdrw_write) {
		return (DM_DT_CDRW);
	    }
	    if (cap->cdr_write) {
		return (DM_DT_CDR);
	    }
	    if (cap->cdr_read) {
		return (DM_DT_CDROM);
	    }
	}

	/* everything failed, so this is an older CD-ROM */
	if (dm_debug > 1) {
	    (void) fprintf(stderr, "INFO: uscsi failed\n");
	}

	return (DM_DT_CDROM);
}
/**************************************************************************
double good(char *c)
输入参数:
char *c :即将进行运算的字符串型数学表达式。如3.5+(2*3/5)
返回参数:
s[0]:计算结果将放入s[0]中
功能:
将输入的字符串中的数字分别调用convnum(char *c)函数进行数值变换,再将其依
次存入doulbe s[i]中,将加减乘除运算符依次存入字符串符号数组 char f[i]中,
然后如果遇到括号,则将括号内的字符串存入另一字符数组中,然后用此
good(char *c) 递归函数进行递归运算。 然后根据先乘除,后加减的顺序对已
存入数组的数值根 据存入字符串符号数组的运算符进行运算。结果存入s[0]中。
返回最终结果。
***************************************************************************/
double good(char *c)  /*可递归函数*/
{      /*取得数值字符串,并调用convnum转换成double*/
	char g[100],number[30];  /*g,保存当前的表达式串,number保存一个数的所有字符*/
	char f[80]; /*保存所有的符号的堆栈*/
	int fi=0; /*保存符号的位置指针*/
	double s[80]; /*保存当前所有的数的一个堆栈*/
	int si=0; /*保存数字位置指针*/
	int k=0; /* 若k=1则表示有一对括号*/
	int num=0,i=0; /*num保存新括号内的字符数,i 保存number里的字符位置*/
	int cc=0; /*乘除符号数量*/
	int jj=0; /*加减符号数量*/

	while(*c!='\0')/*当p==1 和k==0时,表示已经把括号里的内容全部复制到g[100]中了*/
	{
		k=0;
		num=0;

		switch(*c)
		{
		case '+':   /*当前字符为+-乘除时则表示*/
		case '-':
		case '*':
		case'/':
			f[fi++]=*c;
			if(*c=='*' || *c=='/')
				cc++;
			else
				jj++;
			if(*(c-1)!=')')
			{
				number[i]='\0';
				i=0;/*完成一个数字的复制,其位置指针i=0*/

				s[si++]=convnum(number);
			}
			break;
		case'(':   /*有括号,则将当前括号作用范围内的全部字符保存,作为*/
			k++; /*一个新的字符表达式进行递归调用good函数计算。*/
			while(k>0)
			{
				c++;
				g[num]=*c;
				num++;
				if(*c==')')
				{
					k--;
				}
				else if(*c=='(')
				{
					k++;
				}
			}
			g[num-1]='\0';
			num=0;/*完成一个括号内容的复制,其位置指针num=0*/
			s[si++]=good(g);
			break;
		default:
			number[i++]=*c;

			if(*(c+1)=='\0')
			{ number[i]='\0';
			s[si++]=convnum(number);
			}
			break;
		}

		c++;
	}

	f[fi]='\0';

	i=0;
	while(cc>0)
	{
		switch(f[i])
		{
		case '*': cc--;
			s[i+1]=s[i]*s[i+1];
			move(f,s,i);
			break;
		case '/': cc--;
			s[i+1]=s[i]/(float)s[i+1];
			move(f,s,i);
			break;
		default:
			i++;
			break;
		}
	}

	i=0;
	while(jj>0)
	{
		switch(f[i])
		{
		case '+': s[i+1]=s[i]+s[i+1];
			jj--;
			move(f,s,i);
			break;
		case '-': s[i+1]=s[i]-s[i+1];
			jj--;
			move(f,s,i);
			break;
		default:
			printf("operator error!");
			break;
		}
	}

	return s[0];
}
예제 #4
0
/*
 * We try a get_configuration uscsi cmd.  If that fails, try a
 * atapi_capabilities cmd.  If both fail then this is an older CD-ROM.
 */
static int
get_cdrom_drvtype(int fd)
{
	union scsi_cdb cdb;
	struct uscsi_cmd cmd;
	uchar_t buff[SCSIBUFLEN];

	fill_general_page_cdb_g1(&cdb, SCMD_GET_CONFIGURATION, 0,
	    b0(sizeof (buff)), b1(sizeof (buff)));
	fill_command_g1(&cmd, &cdb, (caddr_t)buff, sizeof (buff));

	if (ioctl(fd, USCSICMD, &cmd) >= 0) {
	    struct get_configuration	*config;
	    struct conf_feature		*feature;
	    int				flen;

	    /* The first profile is the preferred one for the drive. */
	    config = (struct get_configuration *)buff;
	    feature = &config->feature;
	    flen = feature->len / sizeof (struct profile_list);
	    if (flen > 0) {
		int prof_num;

		prof_num = (int)convnum(feature->features.plist[0].profile, 2);

		if (dm_debug > 1) {
		    (void) fprintf(stderr, "INFO: uscsi get_configuration %d\n",
			prof_num);
		}

		switch (prof_num) {
		case PROF_MAGNETO_OPTICAL:
		    return (DM_DT_MO_ERASABLE);
		case PROF_OPTICAL_WO:
		    return (DM_DT_MO_WRITEONCE);
		case PROF_OPTICAL_ASMO:
		    return (DM_DT_AS_MO);
		case PROF_CDROM:
		    return (DM_DT_CDROM);
		case PROF_CDR:
		    return (DM_DT_CDR);
		case PROF_CDRW:
		    return (DM_DT_CDRW);
		case PROF_DVDROM:
		    return (DM_DT_DVDROM);
		case PROF_DVDRAM:
		    return (DM_DT_DVDRAM);
		case PROF_DVDRW_REST:
		    return (DM_DT_DVDRW);
		case PROF_DVDRW_SEQ:
		    return (DM_DT_DVDRW);
		case PROF_DVDRW:
		    return (DM_DT_DVDRW);
		case PROF_DDCD_ROM:
		    return (DM_DT_DDCDROM);
		case PROF_DDCD_R:
		    return (DM_DT_DDCDR);
		case PROF_DDCD_RW:
		    return (DM_DT_DDCDRW);
		}
	    }
	}

	/* see if the atapi capabilities give anything */
	return (check_atapi(fd));
}