static void img_clicked_9_cb(void *data, Evas_Object *obj, void *event_info) { Evas_Object *entry = data; if(confirm_flag == READY_TO_CONFIRM) { /*if(inout_flag == INCOME) elm_entry_text_style_user_push(entry, "DEFAULT='font_size=40 color=#4cffba align=center'"); else if(inout_flag == OUTGO) elm_entry_text_style_user_push(entry, "DEFAULT='font_size=40 color=#ffffff align=center'");*/ elm_entry_text_style_user_push(entry, "DEFAULT='font_size=40 color=#ffffff align=center'"); confirm_flag = DEFAULT; return; } if( strlen( strdup( elm_entry_entry_get(entry) ) ) < 8) { elm_entry_entry_append(entry, "9"); adjust_string(entry); } }
/*! \fn int climat_parse_x01 ( struct climat_chunks *c, struct bufr2tac_subset_state *s ) \brief Parse a expanded descriptor with X = 01 \param c pointer to a struct \ref climat_chunks where to set the results \param s pointer to a struct \ref bufr2tac_subset_state where is stored needed information in sequential analysis It returns 0 if success, 1 if problems when processing. If a descriptor is not processed returns 0 anyway */ int climat_parse_x01 ( struct climat_chunks *c, struct bufr2tac_subset_state *s ) { char aux[80]; if ( s->a->mask & DESCRIPTOR_VALUE_MISSING ) return 0; switch ( s->a->desc.y ) { case 1: // 0 01 001 . WMO block number sprintf ( c->s0.II, "%02d", s->ival ); break; case 2: // 0 01 002 . WMO station number sprintf ( c->s0.iii, "%03d", s->ival ); break; case 3: // 0 01 003 . WMO Region if ( s->ival == 1 ) strcpy ( c->s0.Reg, "I" ); else if ( s->ival == 2 ) strcpy ( c->s0.Reg, "II" ); else if ( s->ival == 3 ) strcpy ( c->s0.Reg, "III" ); else if ( s->ival == 4 ) strcpy ( c->s0.Reg, "IV" ); else if ( s->ival == 5 ) strcpy ( c->s0.Reg, "V" ); else if ( s->ival == 6 ) strcpy ( c->s0.Reg, "VI" ); break; case 15: // 0 01 015 . Station or site name case 18: // 0 01 018 . Short station or site name case 19: // 0 01 019 . Long station or site name if ( strlen ( s->a->cval ) <= 80 ) { strcpy ( aux, s->a->cval ); adjust_string ( aux ); strcpy ( s->name, aux ); s->mask |= SUBSET_MASK_HAVE_NAME; } break; default: break; } return 0; }
static int get_samp(struct module_data *m, int size, HIO_HANDLE *f, void *parm) { struct xmp_module *mod = &m->mod; struct local_data *data = (struct local_data *)parm; int i, j; int looplen; /* Should be always 36 */ mod->ins = size / 32; /* sizeof(struct okt_instrument_header); */ mod->smp = mod->ins; if (instrument_init(mod) < 0) return -1; for (j = i = 0; i < mod->ins; i++) { struct xmp_instrument *xxi = &mod->xxi[i]; struct xmp_sample *xxs = &mod->xxs[j]; struct xmp_subinstrument *sub; if (subinstrument_alloc(mod, i, 1) < 0) return -1; sub = &xxi->sub[0]; hio_read(xxi->name, 1, 20, f); adjust_string((char *)xxi->name); /* Sample size is always rounded down */ xxs->len = hio_read32b(f) & ~1; xxs->lps = hio_read16b(f); looplen = hio_read16b(f); xxs->lpe = xxs->lps + looplen; xxs->flg = looplen > 2 ? XMP_SAMPLE_LOOP : 0; sub->vol = hio_read16b(f); data->mode[i] = hio_read16b(f); sub->pan = 0x80; sub->sid = j; data->idx[j] = i; if (xxs->len > 0) { xxi->nsm = 1; j++; } } return 0; }
static int get_inst(struct module_data *m, int size, HIO_HANDLE *f, void *parm) { struct xmp_module *mod = &m->mod; struct local_data *data = (struct local_data *)parm; int i, j; int srate, finetune, flags; int val, vwf, vra, vde, vsw, fade; uint8 buf[30]; hio_read8(f); /* 00 */ i = hio_read8(f); /* instrument number */ hio_read(&mod->xxi[i].name, 1, 28, f); adjust_string((char *)mod->xxi[i].name); mod->xxi[i].nsm = hio_read8(f); for (j = 0; j < 108; j++) { mod->xxi[i].map[j].ins = hio_read8(f); } hio_seek(f, 11, SEEK_CUR); /* unknown */ vwf = hio_read8(f); /* vibrato waveform */ vsw = hio_read8(f); /* vibrato sweep */ hio_read8(f); /* unknown */ hio_read8(f); /* unknown */ vde = hio_read8(f); /* vibrato depth */ vra = hio_read16l(f) / 16; /* vibrato speed */ hio_read8(f); /* unknown */ val = hio_read8(f); /* PV envelopes flags */ if (LSN(val) & 0x01) mod->xxi[i].aei.flg |= XMP_ENVELOPE_ON; if (LSN(val) & 0x02) mod->xxi[i].aei.flg |= XMP_ENVELOPE_SUS; if (LSN(val) & 0x04) mod->xxi[i].aei.flg |= XMP_ENVELOPE_LOOP; if (MSN(val) & 0x01) mod->xxi[i].pei.flg |= XMP_ENVELOPE_ON; if (MSN(val) & 0x02) mod->xxi[i].pei.flg |= XMP_ENVELOPE_SUS; if (MSN(val) & 0x04) mod->xxi[i].pei.flg |= XMP_ENVELOPE_LOOP; val = hio_read8(f); /* PV envelopes points */ mod->xxi[i].aei.npt = LSN(val) + 1; mod->xxi[i].pei.npt = MSN(val) + 1; val = hio_read8(f); /* PV envelopes sustain point */ mod->xxi[i].aei.sus = LSN(val); mod->xxi[i].pei.sus = MSN(val); val = hio_read8(f); /* PV envelopes loop start */ mod->xxi[i].aei.lps = LSN(val); mod->xxi[i].pei.lps = MSN(val); hio_read8(f); /* PV envelopes loop end */ mod->xxi[i].aei.lpe = LSN(val); mod->xxi[i].pei.lpe = MSN(val); if (mod->xxi[i].aei.npt <= 0 || mod->xxi[i].aei.npt >= XMP_MAX_ENV_POINTS) mod->xxi[i].aei.flg &= ~XMP_ENVELOPE_ON; if (mod->xxi[i].pei.npt <= 0 || mod->xxi[i].pei.npt >= XMP_MAX_ENV_POINTS) mod->xxi[i].pei.flg &= ~XMP_ENVELOPE_ON; hio_read(buf, 1, 30, f); /* volume envelope points */; for (j = 0; j < mod->xxi[i].aei.npt; j++) { mod->xxi[i].aei.data[j * 2] = readmem16l(buf + j * 3) / 16; mod->xxi[i].aei.data[j * 2 + 1] = buf[j * 3 + 2]; } hio_read(buf, 1, 30, f); /* pan envelope points */; for (j = 0; j < mod->xxi[i].pei.npt; j++) { mod->xxi[i].pei.data[j * 2] = readmem16l(buf + j * 3) / 16; mod->xxi[i].pei.data[j * 2 + 1] = buf[j * 3 + 2]; } fade = hio_read8(f); /* fadeout - 0x80->0x02 0x310->0x0c */ hio_read8(f); /* unknown */ D_(D_INFO "[%2X] %-28.28s %2d ", i, mod->xxi[i].name, mod->xxi[i].nsm); if (mod->xxi[i].nsm == 0) return 0; if (subinstrument_alloc(mod, i, mod->xxi[i].nsm) < 0) return -1; for (j = 0; j < mod->xxi[i].nsm; j++, data->snum++) { hio_read32b(f); /* SAMP */ hio_read32b(f); /* size */ hio_read(&mod->xxs[data->snum].name, 1, 28, f); adjust_string((char *)mod->xxs[data->snum].name); mod->xxi[i].sub[j].pan = hio_read8(f) * 4; if (mod->xxi[i].sub[j].pan == 0) /* not sure about this */ mod->xxi[i].sub[j].pan = 0x80; mod->xxi[i].sub[j].vol = hio_read8(f); flags = hio_read8(f); hio_read8(f); /* unknown - 0x80 */ mod->xxi[i].sub[j].vwf = vwf; mod->xxi[i].sub[j].vde = vde; mod->xxi[i].sub[j].vra = vra; mod->xxi[i].sub[j].vsw = vsw; mod->xxi[i].sub[j].sid = data->snum; mod->xxs[data->snum].len = hio_read32l(f); mod->xxs[data->snum].lps = hio_read32l(f); mod->xxs[data->snum].lpe = hio_read32l(f); mod->xxs[data->snum].flg = 0; if (flags & 0x04) mod->xxs[data->snum].flg |= XMP_SAMPLE_16BIT; if (flags & 0x08) mod->xxs[data->snum].flg |= XMP_SAMPLE_LOOP; if (flags & 0x10) mod->xxs[data->snum].flg |= XMP_SAMPLE_LOOP_BIDIR; /* if (flags & 0x80) mod->xxs[data->snum].flg |= ? */ srate = hio_read32l(f); finetune = 0; c2spd_to_note(srate, &mod->xxi[i].sub[j].xpo, &mod->xxi[i].sub[j].fin); mod->xxi[i].sub[j].fin += finetune; hio_read32l(f); /* 0x00000000 */ hio_read32l(f); /* unknown */ D_(D_INFO " %X: %05x%c%05x %05x %c V%02x P%02x %5d", j, mod->xxs[data->snum].len, mod->xxs[data->snum].flg & XMP_SAMPLE_16BIT ? '+' : ' ', mod->xxs[data->snum].lps, mod->xxs[data->snum].lpe, mod->xxs[data->snum].flg & XMP_SAMPLE_LOOP_BIDIR ? 'B' : mod->xxs[data->snum].flg & XMP_SAMPLE_LOOP ? 'L' : ' ', mod->xxi[i].sub[j].vol, mod->xxi[i].sub[j].pan, srate); if (mod->xxs[data->snum].len > 1) { int snum = data->snum; if (load_sample(m, f, 0, &mod->xxs[snum], NULL) < 0) return -1; } } return 0; }
static int get_inst(struct module_data *m, int size, HIO_HANDLE *f, void *parm) { struct xmp_module *mod = &m->mod; int i, srate, finetune, flags; int has_unsigned_sample; hio_read32b(f); /* 42 01 00 00 */ hio_read8(f); /* 00 */ i = hio_read8(f); /* instrument number */ hio_read(&mod->xxi[i].name, 1, 28, f); adjust_string((char *)mod->xxi[i].name); hio_seek(f, 290, SEEK_CUR); /* Sample/note map, envelopes */ mod->xxi[i].nsm = hio_read16l(f); D_(D_INFO "[%2X] %-28.28s %2d ", i, mod->xxi[i].name, mod->xxi[i].nsm); if (mod->xxi[i].nsm == 0) return 0; if (subinstrument_alloc(mod, i, mod->xxi[i].nsm) < 0) return -1; /* FIXME: Currently reading only the first sample */ hio_read32b(f); /* RIFF */ hio_read32b(f); /* size */ hio_read32b(f); /* AS */ hio_read32b(f); /* SAMP */ hio_read32b(f); /* size */ hio_read32b(f); /* unknown - usually 0x40000000 */ hio_read(&mod->xxs[i].name, 1, 28, f); adjust_string((char *)mod->xxs[i].name); hio_read32b(f); /* unknown - 0x0000 */ hio_read8(f); /* unknown - 0x00 */ mod->xxi[i].sub[0].sid = i; mod->xxi[i].vol = hio_read8(f); mod->xxi[i].sub[0].pan = 0x80; mod->xxi[i].sub[0].vol = (hio_read16l(f) + 1) / 512; flags = hio_read16l(f); hio_read16l(f); /* unknown - 0x0080 */ mod->xxs[i].len = hio_read32l(f); mod->xxs[i].lps = hio_read32l(f); mod->xxs[i].lpe = hio_read32l(f); mod->xxs[i].flg = 0; has_unsigned_sample = 0; if (flags & 0x04) mod->xxs[i].flg |= XMP_SAMPLE_16BIT; if (flags & 0x08) mod->xxs[i].flg |= XMP_SAMPLE_LOOP; if (flags & 0x10) mod->xxs[i].flg |= XMP_SAMPLE_LOOP | XMP_SAMPLE_LOOP_BIDIR; if (~flags & 0x80) has_unsigned_sample = 1; srate = hio_read32l(f); finetune = 0; c2spd_to_note(srate, &mod->xxi[i].sub[0].xpo, &mod->xxi[i].sub[0].fin); mod->xxi[i].sub[0].fin += finetune; hio_read32l(f); /* 0x00000000 */ hio_read32l(f); /* unknown */ D_(D_INFO " %x: %05x%c%05x %05x %c V%02x %04x %5d", 0, mod->xxs[i].len, mod->xxs[i].flg & XMP_SAMPLE_16BIT ? '+' : ' ', mod->xxs[i].lps, mod->xxs[i].lpe, mod->xxs[i].flg & XMP_SAMPLE_LOOP_BIDIR ? 'B' : mod->xxs[i].flg & XMP_SAMPLE_LOOP ? 'L' : ' ', mod->xxi[i].sub[0].vol, flags, srate); if (mod->xxs[i].len > 1) { if (load_sample(m, f, has_unsigned_sample ? SAMPLE_FLAG_UNS : 0, &mod->xxs[i], NULL) < 0) return -1; } return 0; }
/*! \fn int syn_parse_x01 ( struct synop_chunks *syn, struct bufr2tac_subset_state *s ) \brief Parse a expanded descriptor with X = 01 \param syn pointer to a struct \ref synop_chunks where to set the results \param s pointer to a struct \ref bufr2tac_subset_state where is stored needed information in sequential analysis It returns 0 if success, 1 if problems when processing. If a descriptor is not processed returns 0 anyway */ int syn_parse_x01 ( struct synop_chunks *syn, struct bufr2tac_subset_state *s ) { char aux[80]; if ( s->a->mask & DESCRIPTOR_VALUE_MISSING ) return 0; switch ( s->a->desc.y ) { case 1: // 0 01 001 . WMO block number sprintf ( syn->s0.II, "%02d", s->ival ); break; case 2: // 0 01 002 . WMO station number sprintf ( syn->s0.iii, "%03d", s->ival ); break; case 3: // 0 01 003 . WMO Region sprintf ( syn->s0.A1, "%d", s->ival ); if ( strcmp ( syn->s0.A1, "1" ) == 0 ) strcpy ( syn->s0.Reg, "I" ); else if ( strcmp ( syn->s0.A1, "2" ) == 0 ) strcpy ( syn->s0.Reg, "II" ); else if ( strcmp ( syn->s0.A1, "3" ) == 0 ) strcpy ( syn->s0.Reg, "III" ); else if ( strcmp ( syn->s0.A1, "4" ) == 0 ) strcpy ( syn->s0.Reg, "IV" ); else if ( strcmp ( syn->s0.A1, "5" ) == 0 ) strcpy ( syn->s0.Reg, "V" ); else if ( strcmp ( syn->s0.A1, "6" ) == 0 ) strcpy ( syn->s0.Reg, "VI" ); break; case 4: // 0 01 004 . WMO Subarea case 20: // 0 01 020 . WMO region subarea sprintf ( syn->s0.bw, "%d", s->ival ); break; case 11: // 0 01 011. Ship or mobile land station index if ( strlen ( s->a->cval ) < 16 ) { strcpy ( aux, s->a->cval ); adjust_string ( aux ); if ( aux[0] == '\xff' ) break; if ( strlen ( aux ) < 10 ) strcpy ( syn->s0.D_D, aux ); } break; case 15: // 0 01 015 . Station or site name case 18: // 0 01 018 . Short station or site name case 19: // 0 01 019 . Long station or site name if ( strlen ( s->a->cval ) <= 80 ) { strcpy ( aux, s->a->cval ); adjust_string ( aux ); strcpy ( s->name, aux ); s->mask |= SUBSET_MASK_HAVE_NAME; } break; case 101: // 0 01 101 . State identifier if ( strlen ( s->a->ctable ) <= 256 ) { strcpy ( aux, s->a->ctable ); adjust_string ( aux ); strcpy ( s->country, aux ); s->mask |= SUBSET_MASK_HAVE_COUNTRY; } break; default: break; } //set WMO region if we know II and iii and still no set A1 if ( ( syn->s0.A1[0] == 0 ) && syn->s0.II[0] && syn->s0.iii[0] ) { guess_WMO_region ( syn->s0.A1, syn->s0.Reg, syn->s0.II, syn->s0.iii ); } return 0; }
/*! \fn int temp_parse_x01 ( struct temp_chunks *t, struct bufr2tac_subset_state *s ) \brief Parse a expanded descriptor with X = 01 \param t pointer to a struct \ref temp_chunks where to set the results \param s pointer to a struct \ref bufr2tac_subset_state where is stored needed information in sequential analysis It returns 0 if success, 1 if problems when processing. If a descriptor is not processed returns 0 anyway */ int temp_parse_x01 ( struct temp_chunks *t, struct bufr2tac_subset_state *s ) { char aux[80]; if ( s->a->mask & DESCRIPTOR_VALUE_MISSING ) return 0; switch ( s->a->desc.y ) { case 1: // 0 01 001 . WMO block number sprintf ( t->a.s1.II, "%02d", s->ival ); sprintf ( t->b.s1.II, "%02d", s->ival ); sprintf ( t->c.s1.II, "%02d", s->ival ); sprintf ( t->d.s1.II, "%02d", s->ival ); break; case 2: // 0 01 002 . WMO station number sprintf ( t->a.s1.iii, "%03d", s->ival ); sprintf ( t->b.s1.iii, "%03d", s->ival ); sprintf ( t->c.s1.iii, "%03d", s->ival ); sprintf ( t->d.s1.iii, "%03d", s->ival ); break; case 3: // 0 01 003 . WMO Region sprintf ( t->a.s1.A1, "%d", s->ival ); sprintf ( t->b.s1.A1, "%d", s->ival ); sprintf ( t->c.s1.A1, "%d", s->ival ); sprintf ( t->d.s1.A1, "%d", s->ival ); if ( strcmp ( t->a.s1.A1, "1" ) == 0 ) { strcpy ( t->a.s1.Reg, "I" ); strcpy ( t->b.s1.Reg, "I" ); strcpy ( t->c.s1.Reg, "I" ); strcpy ( t->d.s1.Reg, "I" ); } else if ( strcmp ( t->a.s1.A1, "2" ) == 0 ) { strcpy ( t->a.s1.Reg, "II" ); strcpy ( t->b.s1.Reg, "II" ); strcpy ( t->c.s1.Reg, "II" ); strcpy ( t->d.s1.Reg, "II" ); } else if ( strcmp ( t->a.s1.A1, "3" ) == 0 ) { strcpy ( t->a.s1.Reg, "III" ); strcpy ( t->b.s1.Reg, "III" ); strcpy ( t->c.s1.Reg, "III" ); strcpy ( t->d.s1.Reg, "III" ); } else if ( strcmp ( t->a.s1.A1, "4" ) == 0 ) { strcpy ( t->a.s1.Reg, "IV" ); strcpy ( t->b.s1.Reg, "IV" ); strcpy ( t->c.s1.Reg, "IV" ); strcpy ( t->d.s1.Reg, "IV" ); } else if ( strcmp ( t->a.s1.A1, "5" ) == 0 ) { strcpy ( t->a.s1.Reg, "V" ); strcpy ( t->b.s1.Reg, "V" ); strcpy ( t->c.s1.Reg, "V" ); strcpy ( t->d.s1.Reg, "V" ); } else if ( strcmp ( t->a.s1.A1, "6" ) == 0 ) { strcpy ( t->a.s1.Reg, "VI" ); strcpy ( t->b.s1.Reg, "VI" ); strcpy ( t->c.s1.Reg, "VI" ); strcpy ( t->d.s1.Reg, "VI" ); } break; case 4: // 0 01 004 . WMO Subarea case 20: // 0 01 020 . WMO region subarea sprintf ( t->a.s1.bw, "%d", s->ival ); sprintf ( t->b.s1.bw, "%d", s->ival ); sprintf ( t->c.s1.bw, "%d", s->ival ); sprintf ( t->d.s1.bw, "%d", s->ival ); break; case 11: // 0 01 011. Ship or mobile land station index if ( strlen ( s->a->cval ) < 16 ) { strcpy ( aux, s->a->cval ); adjust_string ( aux ); if ( aux[0] == '\xff' ) break; if ( strlen ( aux ) < 10 ) { strcpy ( t->a.s1.D_D, aux ); strcpy ( t->b.s1.D_D, aux ); strcpy ( t->c.s1.D_D, aux ); strcpy ( t->d.s1.D_D, aux ); } } break; case 15: // 0 01 015 . Station or site name case 18: // 0 01 018 . Short station or site name case 19: // 0 01 019 . Long station or site name if ( strlen ( s->a->cval ) <= 80 ) { strcpy ( aux, s->a->cval ); adjust_string ( aux ); strcpy ( s->name, aux ); s->mask |= SUBSET_MASK_HAVE_NAME; } break; case 101: // 0 01 101 . State identifier if ( strlen ( s->a->ctable ) <= 256 ) { strcpy ( aux, s->a->ctable ); adjust_string ( aux ); strcpy ( s->country, aux ); s->mask |= SUBSET_MASK_HAVE_COUNTRY; } break; default: break; } return 0; }
/*! \fn int buoy_parse_x01 ( struct buoy_chunks *b, struct bufr2tac_subset_state *s ) \brief Parse a expanded descriptor with X = 01 \param b pointer to a struct \ref synop_chunks where to set the results \param s pointer to a struct \ref bufr2tac_subset_state where is stored needed information in sequential analysis It returns 0 if success, 1 if problems when processing. If a descriptor is not processed returns 0 anyway */ int buoy_parse_x01 ( struct buoy_chunks *b, struct bufr2tac_subset_state *s ) { char aux[80]; if ( s->a->mask & DESCRIPTOR_VALUE_MISSING ) return 0; switch ( s->a->desc.y ) { case 3: // 0 01 003 if ( s->ival > 0 ) sprintf ( b->s0.A1, "%d", s->ival ); else if ( s->ival == 0 ) sprintf ( b->s0.A1, "7" ); break; case 4: // 0 01 004 case 20: // 0 01 004 sprintf ( b->s0.bw, "%d", s->ival ); break; case 5: // 0 01 005 if ( s->ival < 1000 ) sprintf ( b->s0.nbnbnb, "%03d", s->ival ); else sprintf ( b->s0.nbnbnb, "%05d", s->ival ); // note this is a nnnnn extension break; case 15: // 0 01 015 if ( strlen ( s->a->cval ) <= 80 ) { strcpy ( aux, s->a->cval ); adjust_string ( aux ); strcpy ( s->name, aux ); s->mask |= SUBSET_MASK_HAVE_NAME; } break; case 87: // 0 01 087. WMO marine observing platform extended identifier if ( s->a->val < 100000000 ) { sprintf ( aux, "%07.0lf", s->a->val ); b->s0.A1[0] = aux[0]; b->s0.A1[1] = 0; b->s0.bw[0] = aux[1]; b->s0.bw[1] = 0; if ( ( ( int ) ( s->a->val ) % 100000 ) < 1000 ) strcpy ( b->s0.nbnbnb , & aux[4] ); else strcpy ( b->s0.nbnbnb , & aux[2] ); } break; case 101: // 0 01 101 if ( strlen ( s->a->ctable ) <= 80 ) { strcpy ( aux, s->a->ctable ); adjust_string ( aux ); strcpy ( s->name, aux ); s->mask |= SUBSET_MASK_HAVE_COUNTRY; } break; default: break; } return 0; }
static int load_module(xmp_context opaque, HIO_HANDLE *h) { struct context_data *ctx = (struct context_data *)opaque; struct module_data *m = &ctx->m; struct xmp_module *mod = &m->mod; int i, j, ret; int test_result, load_result; load_prologue(ctx); D_(D_WARN "load"); test_result = load_result = -1; for (i = 0; format_loader[i] != NULL; i++) { hio_seek(h, 0, SEEK_SET); D_(D_WARN "test %s", format_loader[i]->name); test_result = format_loader[i]->test(h, NULL, 0); if (test_result == 0) { hio_seek(h, 0, SEEK_SET); D_(D_WARN "load format: %s", format_loader[i]->name); load_result = format_loader[i]->loader(m, h, 0); break; } } #ifndef LIBXMP_CORE_PLAYER if (test_result == 0 && load_result == 0) set_md5sum(h, m->md5); #endif if (test_result < 0) { free(m->basename); free(m->dirname); return -XMP_ERROR_FORMAT; } if (load_result < 0) { goto err_load; } /* Sanity check */ if (mod->chn > XMP_MAX_CHANNELS || mod->len > XMP_MAX_MOD_LENGTH) { goto err_load; } /* Sanity check */ if (mod->xxp == NULL) { goto err_load; } for (i = 0; i < mod->pat; i++) { if (mod->xxp[i] == NULL) { goto err_load; } for (j = 0; j < mod->chn; j++) { int t = mod->xxp[i]->index[j]; if (t < 0 || t >= mod->trk || mod->xxt[t] == NULL) { goto err_load; } } } adjust_string(mod->name); load_epilogue(ctx); ret = prepare_scan(ctx); if (ret < 0) { xmp_release_module(opaque); return ret; } scan_sequences(ctx); ctx->state = XMP_STATE_LOADED; return 0; err_load: xmp_release_module(opaque); return -XMP_ERROR_LOAD; }