Bug 92112

Summary: bitfield selection for getdata
Product: [Applications] kst Reporter: D. V. Wiebe <dvw>
Component: generalAssignee: kst
Status: RESOLVED FIXED    
Severity: wishlist    
Priority: NOR    
Version: 1.x   
Target Milestone: ---   
Platform: Slackware   
OS: Linux   
Latest Commit: Version Fixed In:
Sentry Crash Report:

Description D. V. Wiebe 2004-10-26 05:53:06 UTC
Version:           1.0.0_devel (using KDE KDE 3.3.1)
Installed from:    Slackware Packages
Compiler:          gcc (GCC) 3.3.4 
OS:                Linux

As an extension to the BIT derived type, it would be nice to be able to have a derived getdata type that would retrieve a bitfield range from another field.  So, I could extract a 3 bit number starting at bit 5 of an input field by specifying

3_BIT_NUMBER     BITFIELD input_field 5 3

or something similar to the format file.  Currently I'm implementing this through a combination of BIT and LINCOM derived fields.

Similar to C's bitfield struct.
Comment 1 Netterfield 2004-10-26 18:21:30 UTC
CVS commit by netterfield: 

FEATURE: 92112

Feature added as requested.  The 'number of bits' field is optional.


  M +22 -5     getdata.c   1.17
  M +1 -0      getdata_struct.h   1.3


--- kdeextragear-2/kst/kst/datasources/dirfile/getdata.c  #1.16:1.17
@@ -190,11 +190,24 @@ static void ParseMplex(char in_cols[15][
 /***************************************************************************/
 static void ParseBit(char in_cols[15][MAX_LINE_LENGTH],
+                     int n_cols,
                      struct BitEntryType *B,
                      int *error_code) {
+  int error = 0;
+  
   strcpy(B->field, in_cols[0]); /* field */
   strncpy(B->raw_field, in_cols[2], FIELD_LENGTH); /* field */
 
   B->bitnum=atoi(in_cols[3]);
-  if ((B->bitnum<0) || B->bitnum>31) {
+  if (n_cols>4) {
+    B->numbits=atoi(in_cols[4]);
+  } else {
+    B->numbits=1;
+  }
+  
+  if (B->numbits<1) error = 1;
+  if (B->bitnum<0) error = 1;
+  if (B->bitnum + B->numbits - 1 > 31) error = 1;
+  
+  if (error) {
     *error_code=GD_E_FORMAT;
     return;
@@ -329,5 +342,5 @@ struct FormatType *GetFormat(const char 
         realloc(F->bitEntries,
                 F->n_bit*sizeof(struct BitEntryType));
-      ParseBit(in_cols, F->bitEntries+F->n_bit - 1,
+      ParseBit(in_cols, n_cols, F->bitEntries+F->n_bit - 1,
                   error_code); 
     } else {
@@ -1028,4 +1041,5 @@ static int DoIfBit(struct FormatType *F,
   int spf;
   int ns;
+  int mask;
 
   /******* binary search for the field *******/
@@ -1059,6 +1073,9 @@ static int DoIfBit(struct FormatType *F,
   }
 
+  if (B->numbits==32) mask = 0xffffffff;
+  else mask = (int)(pow(2,B->numbits)-0.9999);
+  
   for (i=0; i<*n_read; i++) {
-    tmpbuf[i] = (tmpbuf[i]>>B->bitnum) & 0x0001;
+    tmpbuf[i] = (tmpbuf[i]>>B->bitnum) & mask;
   }
 

--- kdeextragear-2/kst/kst/datasources/dirfile/getdata_struct.h  #1.2:1.3
@@ -58,4 +58,5 @@ struct BitEntryType {
   char raw_field[FIELD_LENGTH+1];
   int bitnum;
+  int numbits;
 };