> From: David Hamilton [mailto:gdave44@HOTMAIL.COM] > Has anyone converted to bitfields while using ASCII pfiles. There are a > number of Incompatible types in assignment that i'm not sure how to handle. > > Any insight would be greatly appreciated. I haven't, but maybe some insight will help. There are basically two routines that you'll need. One to convert the struct to a string of ascii and the other to convert the string of ascii into a struct. I implemented bitfields and needed to do this for OLC. I think the routines were in a patch that I put out a while ago, but I may have modified them since then. If anyone has a correction to these, I'm open to it. bit0 is initialized in my code as binary 10000000. An example of how to uses these are: tmpptr = struct2ascii((char *)&AFF_FLAGS(ch), sizeof(AFF_FLAGS(ch))); and ascii2struct((char *)&AFF_FLAGS(ch), sizeof(AFF_FLAGS(ch)), string) char *struct2ascii(char *address, int length) { int i, a, letter, cnt; ubyte bitmask; char str[MAX_STRING_LENGTH], *ptr; ptr = str; for (i = 0, cnt = 0; i < length * 8; i++) { a = i / 8; bitmask = (bit0 == 1 ? bit0 << (i % 8) : bit0 >> (i % 8)); if (!(i % 26) && i) *(ptr + cnt++) = '|'; if (address[a] & bitmask) { letter = i - (26 * (i / 26)); *(ptr + cnt++) = 'a' + letter; } } *(ptr + cnt) = '\0'; return (str_dup(str)); } void ascii2struct(char *address, int length, char *flag) { long flags = 0, tmp; int a, b, add, bitnr; bool is_number = FALSE; register char *p; for (a = 0; a < length; a++) address[a] = 0; add = 0; for (p = flag; *p; p++) { if (*p == '|') add += 26; else if (islower(*p)) { bitnr = (*p - 'a') + add; if ((a = bitnr / 8) < length) address[a] |= (bit0 == 1 ? bit0 << (bitnr % 8) : bit0 >> (bitnr % 8)); else log("SYSERR: bit is outside of range in ascii2struct() in utils.c"); } else if (isupper(*p)) { bitnr = (26 + (*p - 'A')) + add; if ((a = bitnr / 8) < length) address[a] |= (bit0 == 1 ? bit0 << (bitnr % 8) : bit0 >> (bitnr % 8)); else log("SYSERR: bit is outside of range in ascii2struct() in utils.c"); } else if (isdigit(*p)) { is_number = TRUE; break; } else break; } if (is_number) { flags = atol(flag); for (a = 0; ((unsigned int)a < sizeof(flags)) && (a < length); a++) { tmp = (flags >> (a * 8)); if (bit0 == 1) address[a] = (char)tmp; else { /* shift bits in reverse order */ for (address[a] = b = 0; b < 8; b++) { address[a] = address[a] << 1; if (tmp & 1) address[a] |= 1; tmp = tmp >> 1; } } } } } Rick (sorry for the autotext below that I don't have any control over) "paulhastings.com" made the following annotations on 07/13/01 02:23:02 ------------------------------------------------------------------------------ -- +---------------------------------------------------------------+ | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html | +---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/06/01 PST