42 memset(ctx, 0,
sizeof(*ctx));
45 ctx->m_write_cb = ioprpgen_dummy_writecb;
46 ctx->m_write_cb_userdata = NULL;
49 memwrite_ctx->m_write_ptr = buf;
50 memwrite_ctx->m_write_ptr_size = size;
51 memwrite_ctx->m_write_ptr_curpos = 0;
52 ctx->m_write_cb = ioprpgen_membuf_writecb;
53 ctx->m_write_cb_userdata = (
void *)memwrite_ctx;
90 for ( i = 0; !!entries[i].m_name; i += 1 )
93 !strcmp(entries[i].m_name,
"RESET") || !strcmp(entries[i].m_name,
"ROMDIR")
94 || !strcmp(entries[i].m_name,
"EXTINFO") )
98 if ( !ioprpgen_write_romdir_entry(ctx,
"RESET", 0, 0) )
100 romdir_size = 16 * (entry_count + 4);
101 if ( !ioprpgen_write_romdir_entry(ctx,
"ROMDIR", 0, romdir_size) )
103 total_size = romdir_size;
104 extinfo_size = 4 * entry_count;
105 if ( !ioprpgen_write_romdir_entry(ctx,
"EXTINFO", 0, extinfo_size) )
107 for ( i = 0; i < entry_count; i += 1 )
108 if ( !ioprpgen_write_romdir_entry(ctx, entries[i].m_name, 4, entries[i].m_data_size) )
110 if ( !ioprpgen_write_romdir_entry(ctx, NULL, 0, 0) )
115 u32 cur_padding_size;
119 extinfo_entry.m_value = 0xFFFF;
120 extinfo_entry.m_extlen = 0;
121 extinfo_entry.m_type = 2;
123 for ( i = 0; i < entry_count; i += 1 )
127 cur_value_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, &extinfo_entry,
sizeof(extinfo_entry));
128 if ( cur_value_size !=
sizeof(extinfo_entry) )
130 cur_entry_size += cur_value_size;
132 if ( cur_entry_size != extinfo_size )
134 total_size += cur_entry_size;
135 padding_size = ((((cur_entry_size - 1) >> 4) + 1) << 4) - cur_entry_size;
136 cur_padding_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, NULL, padding_size);
137 if ( cur_padding_size != padding_size )
139 total_size += cur_padding_size;
141 for ( i = 0; i < entry_count; i += 1 )
145 u32 cur_padding_size;
147 cur_entry_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, entries[i].m_data, entries[i].m_data_size);
148 if ( cur_entry_size != entries[i].m_data_size )
150 total_size += cur_entry_size;
151 padding_size = ((((cur_entry_size - 1) >> 4) + 1) << 4) - cur_entry_size;
152 cur_padding_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, NULL, padding_size);
153 if ( cur_padding_size != padding_size )
155 total_size += cur_padding_size;