/* ----------------------------------------------------- patmodule_enter() ------ */ int patmodule_enter(int type, char *opt_arg) { /* fprintf(stderr,"type = %d, optarg = '%s'\n",type,optarg); */ switch(type) { case P_AFTERDATE: return(((_PM_afterdate=ascdatetotime(opt_arg,HEAVY))==-1)?-1:0); case P_BEFOREDATE: return(((_PM_beforedate=ascdatetotime(opt_arg,LIGHT))==-1)?-1:0); case P_OWNER: return(parse_nums(owner_table,opt_arg,&numowners,TXT(T_TOO_MANY_OWNERS),Maxowners,OWNER_FLAG)); case P_GROUP: return(parse_nums(group_table,opt_arg,&numgroups,TXT(T_TOO_MANY_GROUPS),Maxgroups,GROUP_FLAG)); case P_MODE: return(parse_modes(mode_table,opt_arg,&nummodes)); case P_PATTERN: return(parse_patterns(pattern_table,opt_arg,&numpatterns,TRUE,TXT(T_TOO_MANY_PATTERNS),Maxpatterns)); } return(-1); }
void patmodule_commit() { static char all[2]="*"; if (numpatterns && all_not_patterns) { parse_patterns(pattern_table,all,&numpatterns,TRUE,TXT(T_TOO_MANY_PATTERNS),Maxpatterns+1); } #ifdef DIAG { int i; for (i=0;i<numpatterns;i++) { fprintf(stderr,"pattern[%d] = '%s'\n",i,pattern_table[i]); } for (i=0;i<numgroups;i++) { fprintf(stderr,"group[%d] = %d\n",i,group_table[i]); } for (i=0;i<numowners;i++) { fprintf(stderr,"owner[%d] = %d\n",i,owner_table[i]); } for (i=0;i<nummodes;i++) { fprintf(stderr,"mode[%d] = %s%09o\n",i,mode_table[i].negative?"(not)":"",mode_table[i].fmode); } } #endif }
static void file_check_xm(file_recovery_t *fr) { uint16_t patterns, instrs; fr->file_size = 0; fr->offset_error=0; fr->offset_ok=0; if (fseek(fr->handle, 70, SEEK_SET) == -1) return; if (fread(&patterns, 2, 1, fr->handle) != 1) return; if (fread(&instrs, 2, 1, fr->handle) != 1) return; instrs = le16(instrs); patterns = le16(patterns); log_debug("xm: %u patterns, %u instruments\n", patterns, instrs); /* Skip flags + tempo + bmp + table */ if (fseek(fr->handle, 2+2+2+256, SEEK_CUR) == -1) return; fr->file_size = 336; /* Parse patterns and next instruments */ if (parse_patterns(fr, patterns) < 0 || parse_instruments(fr, instrs) < 0) { log_debug("xm: lost sync at pos %li\n", ftell(fr->handle)); fr->offset_error = fr->file_size; fr->file_size = 0; return; } /* ModPlug may insert additional data but it is of little relevance */ }
static int parse_modes (mode *table, char *string, uint16_t *num) { char *ptr; char *temptable[32]; uint16_t tempnum = 0; int i,i2,factor; /* call parse_patterns(). Clever, huh? */ if (parse_patterns(temptable,string,&tempnum,FALSE,TXT(T_TOO_MANY_MODES),32)==-1) return(-1); /* tempnum now has # of items in temptable, temptable has pointers to the individual mode specifiers */ if ((*num+tempnum)>Maxmodes) { fprintf (stderr,"%s (%d max)\n",TXT(T_TOO_MANY_MODES),Maxmodes); return(-1); } for (i=0;i<tempnum;i++) { ptr = temptable[i]; #ifdef DIAG fprintf(stderr,"parse_modes: parsing '%s'\n",ptr); #endif if (*ptr == NOT_CHARACTER) { ptr++; table[i+*num].negative = TRUE; } else table[i+*num].negative = FALSE; if (!*ptr) { fprintf(stderr,TXT(T_ILLEGAL_MODE_SPEC),temptable[i]); exit(0xBAD); } /* is it a nonnegative octal number? */ if (isoctal(*ptr)) { int j; j = atoo(ptr); if (j<0) { fprintf(stderr,TXT(T_NUM_OUT_OF_RANGE),temptable[i]); exit(0xBAD); } else { #ifdef DIAG fprintf(stderr,"parse_modes: got octal 0%o\n",j); #endif table[i+*num].fmode = j; } } else { /* it is a symbolic type definition */ for (factor=0;*ptr!='=';ptr++) { switch(*ptr) { case 'u': factor |= 0100; break; case 'g': factor |= 010; break; case 'o': factor |= 01; break; case 'a': factor = 0111; break; default: fprintf(stderr,TXT(T_ILLEGAL_MODE_SPEC),temptable[i]); exit(0xBAD); } } /* ptr now points to '=' */ for (++ptr,i2=0;*ptr;ptr++) { switch(*ptr) { case 'r': i2 |= S_IROTH; break; case 'w': i2 |= S_IWOTH; break; case 'x': case 's': i2 |= S_IXOTH; break; default: fprintf(stderr,TXT(T_ILLEGAL_MODE_SPEC),temptable[i]); exit(0xBAD); } } table[i+*num].fmode = i2*factor; #ifdef DIAG fprintf(stderr,"parse_modes: table[%d].fmode = 0%o\n",i+*num,table[i+*num].fmode); #endif } /* else */ } /* for */ *num += tempnum; return(0); }