msi [2/4]: Reduce the amount of code that directly accesses table
data
James Hawkins
truiken at gmail.com
Thu Jun 7 18:40:31 CDT 2007
Hi,
The for loops might seem unnecessary, but it greatly reduces code size
when we switch to bytes, and when we add handling for 3 byte
references.
Changelog:
* Use fetch_int to reduce code duplication and access to table data.
dlls/msi/table.c | 60 +++++++++++++++++++++++++-----------------------------
1 files changed, 28 insertions(+), 32 deletions(-)
--
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index bba93dc..83b1da1 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -523,20 +523,16 @@ static UINT read_table_from_storage( MSI
{
UINT ofs = t->colinfo[j].offset/2;
UINT n = bytes_per_column( &t->colinfo[j] );
+ UINT k;
- switch( n )
+ if ( n != 2 && n != 4 )
{
- case 2:
- t->data[i][ofs] = rawdata[ofs*t->row_count + i ];
- break;
- case 4:
- t->data[i][ofs] = rawdata[ofs*t->row_count + i*2 ];
- t->data[i][ofs+1] = rawdata[ofs*t->row_count + i*2 + 1];
- break;
- default:
ERR("oops - unknown column width %d\n", n);
goto err;
}
+
+ for ( k = 0; k < n / 2; k++ )
+ t->data[i][ofs + k] = rawdata[ofs*t->row_count + i * n / 2 + k];
}
}
@@ -928,6 +924,16 @@ static LPWSTR msi_makestring( MSIDATABAS
return strdupW(msi_string_lookup_id( db->strings, stringid ));
}
+static UINT read_table_int(USHORT **data, UINT row, UINT col, UINT bytes)
+{
+ UINT ret = 0, i;
+
+ for (i = 0; i < bytes / 2; i++)
+ ret += (data[row][col + i] << i * 16);
+
+ return ret;
+}
+
static UINT get_tablecolumns( MSIDATABASE *db,
LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz)
{
@@ -1100,23 +1106,17 @@ static UINT TABLE_fetch_int( struct tagM
}
else
data = tv->table->data;
+
n = bytes_per_column( &tv->columns[col-1] );
- switch( n )
+ if (n != 2 && n != 4)
{
- case 4:
- offset = tv->columns[col-1].offset/2;
- *val = data[row][offset] +
- (data[row][offset + 1] << 16);
- break;
- case 2:
- offset = tv->columns[col-1].offset/2;
- *val = data[row][offset];
- break;
- default:
ERR("oops! what is %d bytes per column?\n", n );
return ERROR_FUNCTION_FAILED;
}
+ offset = tv->columns[col-1].offset / 2;
+ *val = read_table_int(data, row, offset, n);
+
/* TRACE("Data [%d][%d] = %d\n", row, col, *val ); */
return ERROR_SUCCESS;
@@ -1192,7 +1192,7 @@ static UINT TABLE_fetch_stream( struct t
static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val )
{
- UINT offset, n;
+ UINT offset, n, i;
USHORT **data;
if( !tv->table )
@@ -1221,22 +1221,18 @@ static UINT TABLE_set_int( MSITABLEVIEW
}
else
data = tv->table->data;
+
n = bytes_per_column( &tv->columns[col-1] );
- switch( n )
+ if ( n != 2 && n != 4 )
{
- case 4:
- offset = tv->columns[col-1].offset/2;
- data[row][offset] = val & 0xffff;
- data[row][offset + 1] = (val>>16)&0xffff;
- break;
- case 2:
- offset = tv->columns[col-1].offset/2;
- data[row][offset] = val;
- break;
- default:
ERR("oops! what is %d bytes per column?\n", n );
return ERROR_FUNCTION_FAILED;
}
+
+ offset = tv->columns[col-1].offset / 2;
+ for ( i = 0; i < n / 2; i++ )
+ data[row][offset + i] = (val >> i * 16) & 0xffff;
+
return ERROR_SUCCESS;
}
--
1.4.1
More information about the wine-patches
mailing list