LINUX.ORG.RU

Ответ на: комментарий от vodz

важно, что вы вставили что-то туда, где выше был и return

Я понял. Большое спасибо.

stD
() автор топика
Ответ на: комментарий от vodz

Точно. Там нужна проверка на skip.

Ну я и сказал, я не проверял.

a1batross ★★★★★
()
Ответ на: комментарий от stD

error: unknown type name ‘bool’

warning: comparison between pointer and integer

error: ‘true’ undeclared

Если ты не можешь справиться вот конкретно с этими ошибками, язык был выбран неправильный. Попробуй Python, там с этим будет проще, а разница в скорости на твоих задачах совершенно роли не играет и не будет заметна.

i-rinat ★★★★★
()

Странно, что никто выше не предложил взять регулярные выражения вместо расписывания их же, но руками в виде вложенных условий.

#include <err.h>
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *sc(char const *src) {
  regex_t r;
  if (regcomp(&r, "\x1b\\[[0-9;]*m", 0) != 0)
    err(1, "regcomp");

  char const *eo_src = src + strlen(src);
  char *dst = malloc(eo_src - src + 1);
  if (!dst)
    err(1, "malloc");

  char *pdst = dst;
  char const *psrc = src;
  while (psrc < eo_src) {
    regmatch_t m;
    if (regexec(&r, psrc, 1, &m, 0) != 0) {
      size_t sz = eo_src - psrc;
      pdst = memcpy(pdst, psrc, sz) + sz;
      break;
    }
    pdst = memcpy(pdst, psrc, m.rm_so) + m.rm_so;
    psrc += m.rm_eo;
  }

  regfree(&r);
  *pdst = '\0';
  return dst;
}

int main(void) {
  char *res = sc("\x1b[31mЭта строка будет красного цвета\x1b[0m");
  printf("%s\n", res);
  free(res);
  return 0;
}

Регулярку при необходимости можно заменить на более сложную, покрывающую большее число управляющих последовательностей.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

На питоне тот же код будет намного короче:

import re

def sc(src):
    return re.sub("\x1b\\[[0-9;]*m", "", src)

print(sc("\x1b[31mЭта строка будет красного цвета\x1b[0m"))

i-rinat ★★★★★
()
Ответ на: комментарий от vodz

Вот оптимальнее и для любой ESC-последовательности.

Вы не поверите, но опять не работает. Сейчас подсунул другой майнер, он отдаёт вот такие строки:

[23:40:35][0x00007f4e68914780] Speed [300 sec]: 0.146667 H/s, 0.25 Sol/s

Раскрашена только часть строки начинающаяся со слова «Speed».

В Телеграме получаю это:

[23:40:35][0x00007f4e68914780]  [33mSpeed [300 sec]: 0.146667 H/s, 0.25 Sol/s [0m

При этом мой код очищает раскраску. Это я не бахвальства ради, Ваш код мне больше нравится.

stD
() автор топика
Ответ на: комментарий от stD

Ну не знаю. Ничего примечательного в этой строке нет. Данный вам алгоритм имеет изъян, когда строка заканчивается символом ESC, тогда при следующем вызове остаток последовательности будет выведен, так как функция не знает о том, что последовательность началась в прошлом вызове. Но в вашем примере и конец пропечатывается, что весьма странно, там же всего несколько символов и какой смысл флюшить после ESC там...

Запоминайте вывод программы в файл, потом с ним уже можно отлаживать.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Вот ещё одна странность, если пропускать строку через Вашу функцию, то в терминале вот такая картина:

https://istarik.ru/uploads/images/00/00/01/2017/09/23/a6cc75.png

А в Телеграме такая:

https://istarik.ru/uploads/images/00/00/01/2017/09/23/027a09.png

То есть Телеграм начинает подкрашивать часть строки синего цвета, и только синего.

Вобщем что-то я ничего не понимаю...

П.С. Подскажите пожалуйста, как сделать, чтоб были видны все символы когда делаешь, например, - printf(«DATA:%s», buff);

stD
() автор топика
Ответ на: комментарий от stD

С синим цветом в Телеграме всё оказалось просто, в этом виновата решётка (#). Если ввести:

#Привет бот

То слово «Привет» будет синим, а «бот» обычным.

stD
() автор топика
Ответ на: комментарий от stD

Вот ещё одна странность, если пропускать строку через Вашу функцию, то в терминале вот такая картина:

Увы, функция настолько проста, что причина при которой у вас произошло полное выключение её работы — полная загадка.

Подскажите пожалуйста, как сделать, чтоб были видны все символы когда делаешь, например, - printf(«DATA:%s», buff);

Вообще-то все символы и печатаются, кроме '\0'. Если вы о конверсии одного символа ESC в два печатных «^[», то printf так делать не умеет, нужна своя печать. Телеграмм вообще просто не печатает непечатный символ ESC, потому вы видите остатки esc-последовательностей.

vodz ★★★★★
()
Ответ на: комментарий от vodz

потому вы видите остатки esc-последовательностей

Это то понятно. А есть какая-нибудь функция, которая бы умела выводить любые непечатные символы?

stD
() автор топика
Ответ на: комментарий от jo_b1ack

Сам напиши функцию

За пять минут ))).

stD
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.