#include #include #include #define ID_MASK 0xFF #define SIZE_MASK 0x7F00 #define LEFT 0x00000 #define CENTER 0x08000 #define RIGHT 0x10000 #define ALIGN_MASK 0x18000 #define REGULAR 0x00000 #define BOLD 0x20000 #define ITALIC 0x40000 #define UNDERLINE 0x80000 #define STYLE_MASK 0xE0000 #define SIZE_SHIFT 8 typedef unsigned long font; char do_menu(font * f); char get_choice(const char *); void show_menu(void); void show_font(font f); void eatline(void); void get_id(font * f); void get_size(font * f); void get_align(font * f); int main(void) { font sample = 1 | (12 <> SIZE_SHIFT); switch(f & ALIGN_MASK) { case LEFT : printf("%7s", "left"); break; case RIGHT : printf("%7s", "right"); break; case CENTER : printf("%7s", "center"); break; default : printf("%7s", "unknown"); break; } printf("%8s %3s %3s\n\n", (f & BOLD) == BOLD? "on" : "off", (f & ITALIC) == ITALIC ? "on" : "off", (f & UNDERLINE) == UNDERLINE ? "on" : "off"); } void get_id(font * f) { int id; printf("Enter font ID (0-255): "); scanf("%d", &id); id = id & ID_MASK; *f |= id; eatline(); } void get_size(font * f) { int size; printf("Enter font size (0-127): "); scanf("%d", &size); *f |= (size << SIZE_SHIFT) & SIZE_MASK; eatline(); } void get_align(font * f) { puts("Select alignment:"); puts("l)left c)center r)right"); switch (get_choice("lcr")) { case 'l' : *f &= ~ALIGN_MASK; *f |= LEFT; break; case 'c' : *f &= ~ALIGN_MASK; *f |= CENTER; break; case 'r' : *f &= ~ALIGN_MASK; *f |= RIGHT; break; default : fprintf(stderr, "alignment problem\n"); } }