Δημοσιεύτηκε: 27 Ιαν 2012, 14:16
Ξεκίνησα να του προσθέτω χρώματα...

Μοβ : δίσεκτα έτη
Γαλάζιο : μη δίσεκτα έτη
Κόκκινο: αργίες
Κίτρινο: σημερινή μέρα & διαφορά μεταξύ ημερομηνιών
* τα συγκεκριμένα είναι πολύ πιο ευδιάκριτα σε μαύρο φόντο.
Για να το κάνω να δουλεύει και σε Windows και σε Unix/Linux ξεκίνησα να φτιάχνω σε ξεχωριστό, αυτόνομο, header file μια μικρή συλλογή από σταθερές και macros, η οποία δίνει πρόσβαση είτε στο ANSI χρωματολόγιο (αν πρόκειται για Linux/Unix) είτε στο χρωματολόγιο που χρησιμοποιεί η κονσόλα των Windows.
Τα διαθέσιμα χρώματα προσκηνίου τα έχω βάλει να ξεκινάνε με FG_ ενώ του φόντου με BG_. Οι σταθερές: FG_NOCHANGE και BG_NOCHANGE χρησιμοποιούνται μεταξύ άλλων στο HighLevel macro...
Αντί να χρησιμοποιήσω full-blown βιβλιοθήκες (όπως π.χ. την curses) ξεκίνησα να φτιάχνω ένα header file (con_color.h το λέω προς το παρόν) για cross-platform υποστήριξη χρωμάτων κονσόλας σε Windows και Linux/Unix. Αν τα Windows παρείχαν υποστήριξη σε ANSI escape characters, όπως κάνει πλέον η συντριπτική πλειοψηφία τερματικών σε Linux/Unix θα ήταν πολύ πιο απλό, αλλά δυστυχώς δεν υποστηρίζει.
Σας παραθέτω το header file, για να πειραματιστείτε και μόνοι σας όσοι ενδιαφέρεστε: http://ideone.com/AWC0z
Διαβάστε όμως τη συνέχεια του μηνύματος (και των spoilers) για να καταλάβετε πως δουλεύει και πως μπορείτε να το χρησιμοποιήσετε για να γράφετε cross-platform πηγαίο κώδικα με αυτό.
Το header file είναι σε πολύ αρχικό στάδιο, ίσα-ίσα για να κάνω τη δουλειά μου... (π.χ. του έχω μόνο χρώματα, και όχι άλλα text attributes όπως bold, italics, κλπ, ή editing support, όπως π.χ. μετακίνηση δρομέα, κλπ).
Επίσης χρησιμοποιεί 4 καθολικές μεταβλητές (μόνο όταν γίνει compile σε περιβάλλον Windows) τα ονόματα των οποίων δεν είναι ασυνήθιστα ως οφείλουν να είναι για να μη "συγκρούονται" με ονόματα κανονικών μεταβλητών στα προγράμματα που χρησιμοποιούν το con_color.h. Αυτά θα τα δω πιο μετά.
Το βασικό HL macro είναι το ...
που είναι variadic, άρα κανονικά θέλει C99 enabled compiler (αλλά οι περισσότεροι υποστήριζαν έτσι κι αλλιώς variadic macros από πριν).
Αν είστε σε Windows πρέπει να χρησιμοποιήστε 2 ακόμα HL macros, ένα για αρχικοποίηση στην αρχή των προγραμμάτων σας (που αποθηκεύει την τρέχουσα κατάσταση της κονσόλας), κι ένα στο τέλος για την επαναφορά της κονσόλας στην κατάσταση που είχε πριν ξεκινήσετε να... χρωματίζετε
Αν δουλεύετε σε Lιnux/Unix περιβάλλον, τότε δεν χρειάζεστε καν τα CONOUT_INIT() και CONOUT_RESTORE() ...
καλό είναι να τα βάζετε όμως για να λειτουργεί σωστά ο κώδικάς σας κι όταν γίνεται compile σε Windows.
Κι ένα τελευταίο...
Αν θέλετε να δοκιμάσετε το ANSI mode σε Windows (με χρήση του ANSICON προγράμματος που αναφέρω παραπάνω) τότε στη γραμμή 16 του κώδικα του con_color.h αλλάξτε το...
σε ...

Μοβ : δίσεκτα έτη
Γαλάζιο : μη δίσεκτα έτη
Κόκκινο: αργίες
Κίτρινο: σημερινή μέρα & διαφορά μεταξύ ημερομηνιών
* τα συγκεκριμένα είναι πολύ πιο ευδιάκριτα σε μαύρο φόντο.
Για να το κάνω να δουλεύει και σε Windows και σε Unix/Linux ξεκίνησα να φτιάχνω σε ξεχωριστό, αυτόνομο, header file μια μικρή συλλογή από σταθερές και macros, η οποία δίνει πρόσβαση είτε στο ANSI χρωματολόγιο (αν πρόκειται για Linux/Unix) είτε στο χρωματολόγιο που χρησιμοποιεί η κονσόλα των Windows.
Τα διαθέσιμα χρώματα προσκηνίου τα έχω βάλει να ξεκινάνε με FG_ ενώ του φόντου με BG_. Οι σταθερές: FG_NOCHANGE και BG_NOCHANGE χρησιμοποιούνται μεταξύ άλλων στο HighLevel macro...
Αντί να χρησιμοποιήσω full-blown βιβλιοθήκες (όπως π.χ. την curses) ξεκίνησα να φτιάχνω ένα header file (con_color.h το λέω προς το παρόν) για cross-platform υποστήριξη χρωμάτων κονσόλας σε Windows και Linux/Unix. Αν τα Windows παρείχαν υποστήριξη σε ANSI escape characters, όπως κάνει πλέον η συντριπτική πλειοψηφία τερματικών σε Linux/Unix θα ήταν πολύ πιο απλό, αλλά δυστυχώς δεν υποστηρίζει.
Σας παραθέτω το header file, για να πειραματιστείτε και μόνοι σας όσοι ενδιαφέρεστε: http://ideone.com/AWC0z
Διαβάστε όμως τη συνέχεια του μηνύματος (και των spoilers) για να καταλάβετε πως δουλεύει και πως μπορείτε να το χρησιμοποιήσετε για να γράφετε cross-platform πηγαίο κώδικα με αυτό.
Spoiler: show
Το header file είναι σε πολύ αρχικό στάδιο, ίσα-ίσα για να κάνω τη δουλειά μου... (π.χ. του έχω μόνο χρώματα, και όχι άλλα text attributes όπως bold, italics, κλπ, ή editing support, όπως π.χ. μετακίνηση δρομέα, κλπ).
Επίσης χρησιμοποιεί 4 καθολικές μεταβλητές (μόνο όταν γίνει compile σε περιβάλλον Windows) τα ονόματα των οποίων δεν είναι ασυνήθιστα ως οφείλουν να είναι για να μη "συγκρούονται" με ονόματα κανονικών μεταβλητών στα προγράμματα που χρησιμοποιούν το con_color.h. Αυτά θα τα δω πιο μετά.
Το βασικό HL macro είναι το ...
- Κώδικας: Επιλογή όλων
CONOUT_PRINTF( fg, bg, ... )
που είναι variadic, άρα κανονικά θέλει C99 enabled compiler (αλλά οι περισσότεροι υποστήριζαν έτσι κι αλλιώς variadic macros από πριν).
Αν είστε σε Windows πρέπει να χρησιμοποιήστε 2 ακόμα HL macros, ένα για αρχικοποίηση στην αρχή των προγραμμάτων σας (που αποθηκεύει την τρέχουσα κατάσταση της κονσόλας), κι ένα στο τέλος για την επαναφορά της κονσόλας στην κατάσταση που είχε πριν ξεκινήσετε να... χρωματίζετε
- Κώδικας: Επιλογή όλων
#include "con_color.h"
...
CONOUT_INIT();
CONOUT_PRINTF( FG_CYAN, BG_NOCHANGE, "Hello world\n" );
printf( "Here is a ");
CONOUT_PRINTF( FG_RED, BG_NOCHANGE, "red" );
printf( " word, and here is some " );
CONOUT_PRINTF( FG_DARKGREEN, BG_GRAY, "dark-green text on gray foreground\n" );
CONOUT_RESTORE();
...
Αν δουλεύετε σε Lιnux/Unix περιβάλλον, τότε δεν χρειάζεστε καν τα CONOUT_INIT() και CONOUT_RESTORE() ...
- Κώδικας: Επιλογή όλων
#include "con_color.h"
...
CONOUT_PRINTF( FG_CYAN, BG_NOCHANGE, "Hello world\n" );
printf( "Here is a ");
CONOUT_PRINTF( FG_RED, BG_NOCHANGE, "red" );
printf( " word, and here is some " );
CONOUT_PRINTF( FG_DARKGREEN, BG_GRAY, "dark-green text on gray foreground\n" );
...
καλό είναι να τα βάζετε όμως για να λειτουργεί σωστά ο κώδικάς σας κι όταν γίνεται compile σε Windows.
Spoiler: show
Κι ένα τελευταίο...
Αν θέλετε να δοκιμάσετε το ANSI mode σε Windows (με χρήση του ANSICON προγράμματος που αναφέρω παραπάνω) τότε στη γραμμή 16 του κώδικα του con_color.h αλλάξτε το...
- Κώδικας: Επιλογή όλων
#if 0 /* change to 1 to FORCE ANSI mode (for Windows you need: ansicon.exe)*/
σε ...
- Κώδικας: Επιλογή όλων
#if 1 /* change to 1 to FORCE ANSI mode (for Windows you need: ansicon.exe)*/