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; }
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]; }
/* * 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)); }