Hey folks, I just got back into my account since school ended, and finally finished going thru the piles of email. I picked up that color code parse (the one with the \c## -- sorry I accidentally deleted the email, so I don't know your name).... Anyway, I've been trying to make it resize the passed string so that it can handle all the extra color codes. This is what I did, but I've tried MANY different approaches and they all lock up the computer in DOS and crash in Ultrix. void do_color(char *inbuf, int color) { register int j = 0, p = 0; int c, k, max; char out_buf[32000], colorbuf[32]; char *newstring; if (inbuf[0] == '\0') return; while (inbuf[j] != '\0') { if ((inbuf[j] == '%') && (inbuf[j+1] != '%')) { switch (inbuf[j+1]) { /* Capital letters are BRIGHT */ case 'R': max = strlen(KBRD); strcpy(colorbuf, KBRD); break; case 'G': max = strlen(KBGR); strcpy(colorbuf, KBGR); break; case 'y': case 'O': max = strlen(KYEL); strcpy(colorbuf, KYEL); break; case 'B': max = strlen(KBBL); strcpy(colorbuf, KBBL); break; case 'M': max = strlen(KBMG); strcpy(colorbuf, KBMG); break; case 'C': max = strlen(KBCN); strcpy(colorbuf, KBCN); break; /* Here are the normal colors */ case 'r': case '1': max = strlen(KRED); strcpy(colorbuf, KRED); break; case 'g': case '2': max = strlen(KGRN); strcpy(colorbuf, KGRN); break; case 'o': case '3': max = strlen(KGLD); strcpy(colorbuf, KGLD); break; case 'b': case '4': max = strlen(KBLU); strcpy(colorbuf, KBLU); break; case 'm': case '5': max = strlen(KMAG); strcpy(colorbuf, KMAG); break; case 'c': case '6': max = strlen(KCYN); strcpy(colorbuf, KCYN); break; /* These are the modifiers */ case '7': case 'l': case 'L': max = strlen(MOD_BOLD); strcpy(colorbuf, MOD_BOLD); break; case '8': case 'F': case 'f': max = strlen(MOD_BLINK); strcpy(colorbuf, MOD_BLINK); break; case '9': case 'V': case 'v': max = strlen(MOD_REVERSE); strcpy(colorbuf, MOD_REVERSE); break; case 'N': /* Same as MOD_NORMAL */ case 'n': case '0': default: max = strlen(KNRM); strcpy(colorbuf, KNRM); break; } /* This gets rid of the % and the color letter */ j += 2; /* make sure the player wants to see the color! */ if (color) { for (k = 0; k < max; k++, p++) out_buf[p] = colorbuf[k]; } } else out_buf[p++] = inbuf[j++]; } /* out_buf now contains the correct string of text */ out_buf[p] = '\0'; /* allocate contiguous memory for the string */ newstring = (char *) calloc(strlen(out_buf)+1, sizeof(char)); /* now copy output back into passed string */ strcpy(newstring, out_buf); /* free the old memory used by the original string */ free(inbuf); /* make inbuf point to the parsed string */ inbuf = newstring; } /* This is just for testing in MS-DOS */ void main(void) { char string[80] = "%F%rHello %N%BHow%N %ca%lre %N%yyou%m?%n"; do_color(string, 1); printf("%s", string); } On the line with the calloc, I've tried malloc, realloc -- both on inbuf and creating a new char *, like newstring.... Any ideas on what's messing up the works? Without this stuff, it works with just the strcpy(), the only problem is if inbuf isn't large enough to handle the new string :( Thanks in advance, - Sean Sean Mountcastle ---------------- Be a better psychiatrist and the world will beat a psychopath to your door.
This archive was generated by hypermail 2b30 : 12/18/00 PST