7

I have a table that defines symbols appearance on a 5x7 dot display. Something like:

extern UINT8 symbols[][5] = { {0x0,0x0,0x0,0x0,0x0}, {0x0,0x0,0x5F,0x0,0x0}, {0x0,0x7,0x0,0x7,0x0}, {0x14,0x7F,0x14,0x7F,0x14}, // etc. 

The leading part of the table matches ASCII table, followed by a set of special symbols, e.g. an arrow, or a check-mark. To reference those I have a list of macros:

#define SYMBOL_LEFT_ARROW 120 // 120 is the entry in the table #define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW+1) #define SYMBOL_UP_ARROW (SYMBOL_RIGHT_ARROW+1) 

Now I need to say something like (won't compile):

const char * const message = "Next" + SYMBOL_RIGHT_ARROW; 

Question: How do I turn SYMBOL_RIGHT_ARROW into "\x79", or whole string into "Next\x79" AT COMPILE TIME so I can have the string in R/O section?

Freescale HC08 C-compiler.

2

3 Answers 3

13

You can concatenate strings in C source:

printf("%s\n", "forty" "two"); /* prints "fortytwo" */ /* NOTE: ^^^ no punctuation */ 

To do that with your symbols is a lot of work, but maybe you can live with that.

#define SYMBOL_LEFT_ARROW 120 #define SYMBOL_LEFT_ARROW_STR "\x79" #define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW + 1) #define SYMBOL_RIGHT_ARROW_STR "\x83" const char * const message = "Next" SYMBOL_RIGHT_ARROW_STR; 

UPDATE

If you can make the value of the symbol match its position in the symbol table (120 match "\x78"), try these macros

#include <stdio.h> #define ADD_ZERO_X(y) 0x ## y #define SYMBOL_NUM(x) ADD_ZERO_X(x) #define STRINGIZE(z) #z #define ADD_SLASH_X(y) STRINGIZE(\x ## y) #define SYMBOL_STR(x) ADD_SLASH_X(x) #define SYMBOL_LEFT_ARROW 78 /* must write in hexadecimal without any prefix */ #define SYMBOL_RIGHT_ARROW 79 #define SYMBOL_UP_ARROW 7a int main(void) { printf("%d\n", SYMBOL_NUM(SYMBOL_LEFT_ARROW)); printf("%s\n", SYMBOL_STR(SYMBOL_LEFT_ARROW)); printf("%d\n", SYMBOL_NUM(SYMBOL_RIGHT_ARROW)); printf("%s\n", SYMBOL_STR(SYMBOL_RIGHT_ARROW)); printf("%d\n", SYMBOL_NUM(SYMBOL_UP_ARROW)); printf("%s\n", SYMBOL_STR(SYMBOL_UP_ARROW)); return 0; } 

Edit (SO doesn't like my browser)

After macro expansion SYMBOL_NUM(32) is transformed to a integer literal (0x78); and SYMBOL_STR(78) is transformed to a string literal ("\x78").

You can use the literals as if you had typed them in.

const char *test = "Next" SYMBOL_STR(78) " one"; /* same as const char *test = "Next\x78 one"; */ 
Sign up to request clarification or add additional context in comments.

Comments

3

I came up with this little program:

#include <stdio.h> #define TEST_CHR '\x77' #define VAL(x) #x #define STRINGIFY(x) VAL(x) int main() { int x = TEST_CHR; char *yyy = "%d " STRINGIFY(TEST_CHR) "\n"; printf(yyy,x); return 0; } 

the indirection in the macro is necessary so that your character gets expanded before the "#" turns it into a string. notice that the '\x77' value turns into a valid int when you use it that way...

4 Comments

How do I make '\x77' from #define MY_SYMBOL 0x77?
#MY_SYMBOL will make "\x77" but not '\x77'.
i think '\x77' will take the place of 0x77 in int expressions? (thus the assignment of "x" in main)...
also, i think: char my_literal[] = {"Next" STRINGIFY(TEST_CHR)}; // should be romable...
2

This is best I could come up with, not perfect, but can be put in ROM:

const char message[] = {'N','e','x','t',SYMBOL_RIGHT_ARROW,EOS}; 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.