Novo Projeto C HOWTO !

1. Novo Projeto C HOWTO !

???
gokernel

(usa Linux Mint)

Enviado em 14/11/2018 - 20:17h

Olá pessoal !

Hoje criei um novo projeto no Github para fazer uma "coleção de HOWTO" ou seja, de programa bem fácil de entender.

Projeto aqui:
https://github.com/gokernel2017/C_COLECTION

O primeiro achei interessante fazer um sobre como:
Colorir texto com sintaxe C... para simplificar só implementei as WORDS ( int, void, return ) para colorir.

Exemplo de da função: Draw(EDITOR *o).

void Draw (EDITOR *o) {
int pos_x = o->r.x + 10;
int pos_y = o->r.y + 10;
int line_top = 0;

if (key == SDLK_UP && o->line_top > 0) {
o->line_top--;
}
else
if (key == SDLK_DOWN && o->line_top < o->line_count-1) {
o->line_top++;
}

state = STATE_DEFAULT;

// NO DRAW ... find the first line displayed:
str = o->text;
while (*str) {
if (line_top == o->line_top)
break;
if (*str == '\n') { // <-- new line
line_top++;
}
SetTextColor();
str++;
}

//
// HERE DRAW: DrawChar (...);
//
SDL_FillRect (screen, &o->r, 8); // bg blue
while (*str) {
// size h:
if (pos_y > (o->r.y + o->r.h)-LINE_DISTANCE)
break;

SetTextColor();

// Draw char in area of editor
if (pos_x < o->r.x+o->r.w-8) {

if (state == STATE_DEFAULT) {

if (isperator(*str)) {
color = COLOR_WHITE;
}
else
if (!is_reserved_word && !iswordchar(str[-1])) {

if ((*str >= 'a' && *str <= 'g') || *str=='i' || *str=='l' || *str=='o' || (*str >= 'r' && *str <= 'v') || *str=='w') {
// COLORIZE WORD: void
//
if (str[0]=='v' && str[1]=='o' && str[2]=='i' && str[3]=='d' && !iswordchar(str[4])) {
is_reserved_word = 4;
}
else
// COLORIZE WORD: int
if (str[0]=='i' && str[1]=='n' && str[2]=='t' && !iswordchar(str[3])) {
is_reserved_word = 3;
}
else
// COLORIZE WORD: return
if (str[0]=='r' && str[1]=='e' && str[2]=='t' && str[3]=='u' && str[4]=='r' && str[5]=='n' && !iswordchar(str[6])) {
is_reserved_word = 6;
}
}

}// if (!is_reserved_word && !iswordchar(str[-1]))
if (is_reserved_word) {
color = C_WORD; // Torn color of sintax
is_reserved_word--;
}

} // if (state == STATE_DEFAULT)

DrawChar (screen, *str, pos_x, pos_y, color);
}
pos_x += 8;

if (*str == '\n') {
pos_x = o->r.x + 10;
pos_y += LINE_DISTANCE;
}
str++;
}
SDL_UpdateRect (screen, o->r.x, o->r.y, o->r.w, o->r.h);
}



Para rolar o texto: SETA_ACIMA ou SETA_ABAIXO.

Agradecimentos ao projeto ( SciTE ou https://www.scintilla.org ):
-----------------------------------------------------------
Copyright 1998-1999 by Neil Hodgson <neilh@hare.net.au>
PROJECT : SciTE100 Editor - 1.0
FILE : KeyWords.cc
-----------------------------------------------------------

Sugestões são bem-vindas !




  


2. Re: Novo Projeto C HOWTO !

???
gokernel

(usa Linux Mint)

Enviado em 16/11/2018 - 10:34h

Olá pessoal !


Projeto atualizado !


"Senti vergonha" do código da função ( Draw ) que codei de propósito e resolvi modificar para isso:



char *WORDS[] = {
"asm", "auto",
"break",
"case", "char", "const", "continue",
"default", "do", "double",
"else", "enum", "extern",
"float", "for",
"goto",
"if", "int",
"long",
"register", "return",
"short", "signed", "sizeof", "static", "struct", "switch",
"typedef",
"union", "unsigned",
"void", "volatile",
"while",
0
};

void Draw (EDITOR *o) {
int pos_x = o->r.x + 10;
int pos_y = o->r.y + 10;
int line_top = 0;

if (key == SDLK_UP && o->line_top > 0) {
o->line_top--;
}
else
if (key == SDLK_DOWN && o->line_top < o->line_count-1) {
o->line_top++;
}

state = STATE_DEFAULT;

// NO DRAW ... find the first line displayed:
str = o->text;
while (*str) {
if (line_top == o->line_top)
break;
if (*str == '\n') { // <-- new line
line_top++;
}
SetTextColor();
str++;
}

//
// HERE DRAW: DrawChar (...);
//
SDL_FillRect (screen, &o->r, 8); // bg blue
while (*str) {
// size h:
if (pos_y > (o->r.y + o->r.h)-LINE_DISTANCE)
break;

SetTextColor();

// Draw char in area of editor
if (pos_x < o->r.x+o->r.w-8) {

if (state == STATE_DEFAULT) {

if (isperator(*str)) {
color = COLOR_WHITE;
}
else
if (!is_reserved_word && !iswordchar(str[-1])) {

// if text[ch] == (First char of RESERVEDs WORDs): [b]reak, [c]ase, [s]truct ... etc
if ((*str >= 'a' && *str <= 'g') || *str=='i' || *str=='l' || *str=='o' || (*str >= 'r' && *str <= 'v') || *str=='w') {
char *s = str;
int count = 0, i;
char word [20];
while (*s) {
word[count++] = *s++;
if (!iswordchar(*s) || count > 8) break;
}
word[count] = 0;
for (i = 0; WORDS[i]; i++)
if (!strcmp(WORDS[i], word)) {
is_reserved_word = count; // <-- HERE: increment from size of WORD.
break;
}
}

}// if (!is_reserved_word && !iswordchar(str[-1]))
if (is_reserved_word) {
color = C_WORD; // Torn color of sintax
is_reserved_word--;
}

} // if (state == STATE_DEFAULT)

DrawChar (screen, *str, pos_x, pos_y, color);
}
pos_x += 8;

if (*str == '\n') {
pos_x = o->r.x + 10;
pos_y += LINE_DISTANCE;
}
str++;
}
SDL_UpdateRect (screen, o->r.x, o->r.y, o->r.w, o->r.h);
}



E se esqueci alguma Palavra Reservada C, ... sorry, baby ! ;)








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts