LINUX.ORG.RU

Сообщения PPP328

 

Как вытащить список ссылок из html файлов?

Форум — Desktop

Положим есть файл xxx.html. В нем присутствуют ссылки на ресурс example.com типа "https://example.com/article1.xml". Как мне башем вытащить оттуда список этих ссылок? Ссылка может быть в любом теге или свойстве.

Пробовал sed, но он вытаскивать либо жадно либо всю встроку:

sed 's/^.*href="\([^"]*\).*$/\1/'

 

PPP328
()

Chrome скачивает swf

Форум — Desktop

Чет он всю жизнь нормально проигрывал swf, а сейчас чет везде скачивает вместо того чтобы проигрывать. Открываешь его через адресную строку - скачивает, через drag'n'drop - скачивает, через инкогнито - скачивает.

В chrome://plugins галка стоит (не стояла, поставил)
В chrome://settings/content flash включен для всех

Что еще надо сделать чтобы эта шайтан-машина не скачивала а проигрывала?

 , ,

PPP328
()

Не работает фильтрация рекламы в vk в chrome+adblock plus

Форум — Desktop

Галочка ненавязчивой рекламы выключена, стоят фильтры:

vk.com##.ads_ads_box3.ver.repeat_ver.size_site
vk.com##.ads_ads_box1.ver.repeat_ver.size_site
vk.com##.ads_ads_box2.ver.repeat_ver.size_site
vk.com##.ads_ad_box_border.repeat_ver.redesign.first
vk.com##div#ads_left
Реклама не блокируется. Если нажать на значок адблока и сделать «заблокировать элемент» на рекламе *и ввести один из этих фильтров* то блокируется. Перезагружаем страницу (или браузер) - не блокируется.

Как лечить?

 , ,

PPP328
()

Получение удаленного мак-адреса

Форум — Development

Существует ли возможность в си получить mac-адрес сервера к которому подключен сокет? В плане что у меня нет никакой инфы, как и к чему подключен сокет (eth0/eth1/etc) кроме как самого сокета.

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

Что подскажете?

 

PPP328
()

Как использовать QtCreator для Си?

Форум — Development

Как в нем включить подсветку синтаксиса для си а не с++? Даже если прямо в нем создать plain C project он все равно применяет к нему подсветку синтаксиса с++.Расширения файлов тоже игнорируются.

Что конкретно не устраивает:
defined __cplusplus
namespace
bool
virtual

ну и собственно остальные слова из с++. Ломается подсветка синтаксиса из-за чего нельзя увидеть настоящие ошибки. Плюс из-за макроса нельзя видеть какой блок кода выполнится в IFDEF'ах.

 , ,

PPP328
()

Почему в сорцах FreeBSD такой говнокод?

Форум — Talks

Тут недавно Алкоголь-студия проверяла код FreeBSD (ищите на хабре, не собираюсь добавлять ссылок этим спамерам), так вот. Там такое место есть:

#ifdef Q
#undef Q
#endif
#define Q(_r) \
  (((_r) == 1.5) ? 0 : (((_r) ==2.25) ? 1 : (((_r) == 3) ? 2 : \
  (((_r) == 4.5) ? 3 : (((_r) ==  6)  ? 4 : (((_r) == 9) ? 5 : \
  (((_r) == 12)  ? 6 : (((_r) == 13.5)? 7 : 0))))))))
static const struct txschedule series_quarter[] = {
  { 3,Q( 1.5),3,Q(1.5), 0,Q(1.5), 0,Q(1.5) },  /* 1.5Mb/s */
  { 4,Q(2.25),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) },  /*2.25Mb/s */
  { 4,Q(   3),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) },  /*   3Mb/s */
  { 4,Q( 4.5),3,Q(  3), 4,Q(1.5), 2,Q(1.5) },  /* 4.5Mb/s */
  { 4,Q(   6),3,Q(4.5), 4,Q(  3), 2,Q(1.5) },  /*   6Mb/s */
  { 4,Q(   9),3,Q(  6), 4,Q(4.5), 2,Q(1.5) },  /*   9Mb/s */
  { 4,Q(  12),3,Q(  9), 4,Q(  6), 2,Q(  3) },  /*  12Mb/s */
  { 4,Q(13.5),3,Q( 12), 4,Q(  9), 2,Q(  6) }  /*13.5Mb/s */
};
#undef Q

Разворачивается это чудо в

static const struct txschedule series_quarter[] = {
  { 3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((2.25) == 1.5) ? 0 : (((2.25) ==2.25) ? 1 : (((2.25) == 3) ? 2 : (((2.25) == 4.5) ? 3 : (((2.25) == 6) ? 4 : (((2.25) == 9) ? 5 : (((2.25) == 12) ? 6 : (((2.25) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))),3,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))),3,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))), 4,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))),3,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))), 4,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((12) == 1.5) ? 0 : (((12) ==2.25) ? 1 : (((12) == 3) ? 2 : (((12) == 4.5) ? 3 : (((12) == 6) ? 4 : (((12) == 9) ? 5 : (((12) == 12) ? 6 : (((12) == 13.5)? 7 : 0)))))))),3,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))), 4,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))), 2,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))) },
  { 4,(((13.5) == 1.5) ? 0 : (((13.5) ==2.25) ? 1 : (((13.5) == 3) ? 2 : (((13.5) == 4.5) ? 3 : (((13.5) == 6) ? 4 : (((13.5) == 9) ? 5 : (((13.5) == 12) ? 6 : (((13.5) == 13.5)? 7 : 0)))))))),3,(((12) == 1.5) ? 0 : (((12) ==2.25) ? 1 : (((12) == 3) ? 2 : (((12) == 4.5) ? 3 : (((12) == 6) ? 4 : (((12) == 9) ? 5 : (((12) == 12) ? 6 : (((12) == 13.5)? 7 : 0)))))))), 4,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))), 2,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))) }
};

Так вот. Что, блин мешает написать

static const struct txschedule series_quarter[] = {
  {  3,  0,  3,  0,  0,  0,  0,  0 }, /*  1.5Mb/s */
  {  4,  1,  3,  0,  4,  0,  0,  0 }, /* 2.25Mb/s */
  {  4,  2,  3,  0,  4,  0,  0,  0 }, /*    3Mb/s */
  {  4,  3,  3,  2,  4,  0,  2,  0 }, /*  4.5Mb/s */
  {  4,  4,  3,  3,  4,  2,  2,  0 }, /*    6Mb/s */
  {  4,  5,  3,  4,  4,  3,  2,  0 }, /*    9Mb/s */
  {  4,  6,  3,  5,  4,  4,  2,  2 }, /*   12Mb/s */
  {  4,  7,  3,  6,  4,  5,  2,  4 }, /* 13.5Mb/s */
};
???

Зачем нужна нафиг магия на макросах? Напишите блин рядом комментарий что мол так и так, массив сформирован на основе четвертинного алгоритма. Все равно этот ваш Q(XXX) нихрена не понятен. Понятно, что потом всякие Водка-Студии будут орать 96 критикал сообщений о несовместимости типов.

В коде FreeBSD можно встретить ещё несколько таких массивов. Суммарно анализатор выдаёт на них 692 предупреждения уровня High. Напомню, что всего предупреждений уровня High насчитывается 3577. Это значит, что такие макросы приводят к возникновению 1/5 этих предупреждений.

P.S. Код, которым я сгенерил массив выше: https://pastebin.com/pPN8uwVz

 , ,

PPP328
()

Как предполагают одну точку выхода?

Форум — Development

Во всех мануалах громко и нецензурно кричат о том, что надо писать строго одну точку выхода из функции в самом ее конце, мол так надежнее - все unlock'и в одном месте, нельзя напортачить с забытым разлоком и проч.

А скажите, господа, а как предполагается тогда писать такие функции? Через миллионы вложенных if'ов? А как это поможет читабельности и надежности?

               }
              }
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  }
 }
}
См. https://en.wikipedia.org/wiki/Pyramid_of_doom_(programming)

Собственно код, на котором мне бомбануло:

static YGGBool compare_records_str(CML_Node * haystack1, CML_Node * haystack2, char * needle)
{
    CML_Node * finder1;
    CML_Node * finder2;

    if (CML_NodeFindString(haystack1, needle, &finder1)) return YGG_FALSE;
    if (CML_NodeFindString(haystack2, needle, &finder2)) return YGG_FALSE;

    if (!finder1->data.string) return YGG_FALSE;
    if (!finder2->data.string) return YGG_FALSE;

    if (strcmp(finder1->data.string, finder2->data.string)) return YGG_FALSE;

    return YGG_TRUE;
}

 , ,

PPP328
()

grep: предупреждение: GREP_OPTIONS устарел; используйте псевдоним или сценарий

Форум — Development

Проблема в том, что этот скрипт надо запускать и на новой машине и на слаке 2007го года рождения. Как разрулить чтобы ни там ни там не ругалось и работало?

 

PPP328
()

Помогите вспомнить название, найти игру

Форум — Games

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

Графика как в картонных театрах. Запомнилось что нужно этим королем добывать ресурсы типа дерева чтобы построить себе оборону.

 , ,

PPP328
()

Sed и NTFS

Форум — Desktop

Есть файл и скрипт на ntfs разделе.

echo ">>> $DIRECTORY_PROJECT/$SUBPROJECT_FILE_CONFIG"
        sed -i "/^$SED_BEFORE/c\\$SED_AFTER" \
            "$DIRECTORY_PROJECT/$SUBPROJECT_FILE_CONFIG"
        echo "<<< $DIRECTORY_PROJECT/$SUBPROJECT_FILE_CONFIG"

Выхлоп:
[quote][quote][quote] ./code/libsmilo/project.config[br][/quote][/quote][/quote]sed: preserving permissions for ‘./code/libsmilo/sedf1tP7c’: Операция не позволена
<<< ./code/libsmilo/project.config

При этом скрипт выполняется успешно, делает что нужно. Как убрать его предупреждение?

~$ cat /etc/fstab | grep /mnt/share
# /mnt/share was on /dev/sda5 during installation
UUID=478B676900424A50 /mnt/share      ntfs    defaults,umask=007,gid=46 0       0
~$ ls -ld /mnt/share/Dropbox/Projects/Smilodon2
drwxrwx--- 1 root plugdev 4096 мар 18 15:12 /mnt/share/Dropbox/Projects/Smilodon2

 ,

PPP328
()

Как в gThumb отобразить скрытые каталоги слева?

Форум — Desktop

Старая версия умела отображать, новая (на жтк3) упорно не желает.

gthumb --version
gthumb 3.4.3, Copyright © 2001-2010 Free Software Foundation, Inc.

 

PPP328
()

Что есть для сканера пальцев?

Форум — Desktop

Имеется Lenovo l560 со сканером отпечатков. Что можно использовать для авторизации? Насколько в линуксе все печально?

Bus 001 Device 002: ID 138a:0017 Validity Sensors, Inc. Fingerprint Reader

 , ,

PPP328
()

Атомарная ассемблерная вставка в gcc

Форум — Development

Хочу реализовать самый примитивный мьютекс.

Написал такой код: http://pastebin.com/bqX9xKtQ
Компилять так: `gcc -pthread ./lock.c -o lock.elf -lpthread && ./lock.elf`

Прочитал статью в википедии: Тыц

XCHG — Операция обмена между памятью и регистром. Выполняется атомарно на x86-процессорах
Ассемблерная вставка соответствующей атомарной инструкции.

Я так понимаю что мой mutex_lock не является атомарным, а вместо него надо бы заюзать что-то вроде

__asm
{
    mov eax, 1
    xchg eax, mx
}

Так вот, как В ЭТОМ ВАШЕМ GCC С ЕГО ИНОПЛАНЕТНЫМ СИНТАКСИСОМ НАПИСАТЬ ТО ЖЕ САМОЕ?

Для тех кто не в курсе синтаксиса gcc:

asm volatile ( "rdtsc\n\t"   
               "shl $32, %%rdx\n\t"  
               "or %%rdx, %0"        
               : "=a" (msr)
               :
               : "rdx");

 , , ,

PPP328
()

Чем заменить realloc для неизвестного размера принимаемого xml?

Форум — Development

Как продолжение топика Помогите нагуглить военный стандарт написания на C .

Есть неизвестного размера (2 - 618 кб (возможно больше)) принимаемый через LAN xml. Возникла необходимость построить суперстабильную систему, для этого пришли к выводу что надо внедрять MISRA-C. А она запрещает realloc. Как быть с принимаемой xml? Буфер статического размера как-то плохо вяжется с неизвестным размером xml. А распарсить xml кусками не представляется возможным.

Отправлять принимаемые байты в файл? А если накрылся диск? На серваке где крутится демон может: закончиться память (стабильно раз в 2-3 дня), посыпаться диск (раз в 2-3 месяца), посыпаться mysql база (раз в 2-3 недели). Серваков 1000+, поэтому вышеперечисленные события случаются каждый день.

Что посоветуете?

 , ,

PPP328
()

Лишний ConfigureNotify с бредовыми данными

Форум — Development

Если менять размер окну то сначала приходит ConfigureNotify с x=1, y=24, потом 2xConfigureNotify с нормальными данными:

        {
        case ConfigureNotify :
            printf("%d, %d : %u, %u\n",
                    event.xconfigure.x, event.xconfigure.y,
                    event.xconfigure.width, event.xconfigure.height);
            break;
        }
# Двигаю окно
353, 100 : 791, 600
363, 113 : 791, 600
# Меняю ширину окна на один пиксель (курсором)
1, 24 : 791, 600
363, 113 : 791, 600
363, 113 : 791, 600

Откуда вообще берется такая фигня с x=1 и y=24? Мало того, если я спрашиваю XGetWindowAttributes то там x и y вообще либо всегда 100, 100, либо пресловутые 1,24.

sudo cast Zubok.

 

PPP328
()

Коды ошибок при многомодульном приложении

Форум — Development

Есть основной модуль, у него свой набор основных ошибок:

    /*        Name                Code              Description             */ \
    /* No error                                                             */ \
    SML(SUCCESS             , (0x00),        "Successfull                   ") \
    /* System general errors                                                */ \
    SML(SYSTEM_GENERALERROR , (0x01),        "Generic error                 ") \
    SML(SYSTEM_MISUSEOFBLTNS, (0x02),        "Misuse of shell built-ins     ") \
    /* Memory errors                                                        */ \
    SML(USER_BADALLOC       , (0x10 + 0x01), "Memory allocation failed      ") \
    /* Checking errors                                                      */ \
    SML(USER_BADPOINTER     , (0x20 + 0x01), "Bad pointer provided          ") \
    SML(USER_BADVALUE       , (0x20 + 0x02), "Bad value provided            ") \
    SML(USER_BADTYPE        , (0x20 + 0x03), "Bad type provided             ") \
    /* System errors                                                        */ \
    SML(SYSTEM_CANNOTEXECUTE, (0x7E),        "Command invoked cannot execute") \
    SML(SYSTEM_NOTFOUND     , (0x7F),        "Command not found             ") \
    SML(SYSTEM_INVALIDEXIT  , (0x80),        "Invalid argument to exit      ") \
    /* System signals                                                       */ \
    SML(SYSTEM_SIGHUP       , (0x80 + 0x01), "Hangup                        ") \
    SML(SYSTEM_SIGINT       , (0x80 + 0x02), "Interrupt                     ") \
    SML(SYSTEM_SIGQUIT      , (0x80 + 0x03), "Quit                          ") \
    SML(SYSTEM_SIGILL       , (0x80 + 0x04), "Illegal Instruction           ") \
    SML(SYSTEM_SIGTRAP      , (0x80 + 0x05), "Trace/Breakpoint Trap         ") \
    SML(SYSTEM_SIGABRT      , (0x80 + 0x06), "Abort                         ") \
    SML(SYSTEM_SIGEMT       , (0x80 + 0x07), "Emulation Trap                ") \
    SML(SYSTEM_SIGFPE       , (0x80 + 0x08), "Arithmetic Exception          ") \
    SML(SYSTEM_SIGKILL      , (0x80 + 0x09), "Killed                        ") \
    SML(SYSTEM_SIGBUS       , (0x80 + 0x0A), "Bus Error                     ") \
    SML(SYSTEM_SIGSEGV      , (0x80 + 0x0B), "Segmentation Fault            ") \
    SML(SYSTEM_SIGSYS       , (0x80 + 0x0C), "Bad System Call               ") \
    SML(SYSTEM_SIGPIPE      , (0x80 + 0x0D), "Broken Pipe                   ") \
    SML(SYSTEM_SIGALRM      , (0x80 + 0x0E), "Alarm Clock                   ") \
    SML(SYSTEM_SIGTERM      , (0x80 + 0x0F), "Terminated                    ") \
    SML(SYSTEM_SIGUSR1      , (0x80 + 0x10), "User Signal 1                 ") \
    SML(SYSTEM_SIGUSR2      , (0x80 + 0x11), "User Signal 2                 ") \
    SML(SYSTEM_SIGCHLD      , (0x80 + 0x12), "Child Status                  ") \
    SML(SYSTEM_SIGPWR       , (0x80 + 0x13), "Power Fail/Restart            ") \
    SML(SYSTEM_SIGWINCH     , (0x80 + 0x14), "Window Size Change            ") \
    SML(SYSTEM_SIGURG       , (0x80 + 0x15), "Urgent Socket Condition       ") \
    SML(SYSTEM_SIGPOLL      , (0x80 + 0x16), "Socket I/O Possible           ") \
    SML(SYSTEM_SIGSTOP      , (0x80 + 0x17), "Stopped (signal)              ") \
    SML(SYSTEM_SIGTSTP      , (0x80 + 0x18), "Stopped (user)                ") \
    SML(SYSTEM_SIGCONT      , (0x80 + 0x19), "Continued                     ") \
    SML(SYSTEM_SIGTTIN      , (0x80 + 0x1A), "Stopped (tty input)           ") \
    SML(SYSTEM_SIGTTOU      , (0x80 + 0x1B), "Stopped (tty output)          ") \
    SML(SYSTEM_SIGVTALRM    , (0x80 + 0x1C), "Virtual Timer Expired         ") \
    SML(SYSTEM_SIGPROF      , (0x80 + 0x1D), "Profiling Timer Expired       ") \
    SML(SYSTEM_SIGXCPU      , (0x80 + 0x1E), "CPU time limit exceeded       ") \
    SML(SYSTEM_SIGXFSZ      , (0x80 + 0x1F), "File size limit exceeded      ") \
    SML(SYSTEM_SIGWAITING   , (0x80 + 0x20), "All LWPs blocked              ") \
    SML(SYSTEM_SIGLWP       , (0x80 + 0x21), "VI Interrupt for T. Library   ") \
    SML(SYSTEM_SIGAIO       , (0x80 + 0x22), "Asynchronous I/O              ") \
                                                                               \
    SML(SYSTEM_OUTOFRANGE   , (0xFF),        "Exit status unknown           ") \
    /* Maximum is 255, as this index will be sent to exit() function        */

И есть пара модулей, каждый из которых делает какую-нибудь свою вещь, абсолютно не связанную (или наследованный от другого) с другим модулем. Выполнены в виде .so либ. К примеру модуль работы с иксами. У него свои коды ошибок:


    /* X-Server errors                                                      */ \
    SML(USER_XBADINIT       , (0x30 + 0x01), "Bad X-Server initialisation   ") \
    SML(USER_XBADVALUE      , (0x30 + 0x02), "Bad X-Resource value          ") \
    SML(USER_XBADWINDOW     , (0x30 + 0x03), "Bad X-Window                  ") \
    SML(USER_XBADPIXMAP     , (0x30 + 0x04), "Bad X-Pixmap                  ") \
    SML(USER_XBADATOM       , (0x30 + 0x05), "Bad X-Atom                    ") \
    SML(USER_XBADCURSOR     , (0x30 + 0x06), "Bad X-Cursor                  ") \
    SML(USER_XBADFONT       , (0x30 + 0x07), "Bad X-Font                    ") \
    SML(USER_XBADMATCH      , (0x30 + 0x08), "Bad X-Match                   ") \
    SML(USER_XBADDRAWABLE   , (0x30 + 0x09), "Bad X-Drawable                ") \
    SML(USER_XBADACCESS     , (0x30 + 0x0A), "Bad X-Access                  ") \
    SML(USER_XBADALLOC      , (0x30 + 0x0B), "Bad X-Alloc                   ") \
    SML(USER_XBADCOLOUR     , (0x30 + 0x0C), "Bad X-Colour                  ") \
    SML(USER_XBADGC         , (0x30 + 0x0D), "Bad X-GC                      ") \
    SML(USER_XBADID         , (0x30 + 0x0E), "Bad X-ID                      ") \
    SML(USER_XBADNAME       , (0x30 + 0x0F), "Bad X-Name                    ") \
    SML(USER_XBADLENGTH     , (0x30 + 0x10), "Bad X-Length                  ") \
    SML(USER_XBADIMPLEMENT  , (0x30 + 0x11), "Bad X-Implement               ") \

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

И, собственно, архитектурный вопрос (с ЯП не связанный): как лучше сделать функцию, возвращающую описание ошибки по коду? У каждого модуля своя? А если он также может вернуть какую-нибудь generic ошибку? Типа bad pointer из главного модуля. Или лучше сделать функцию RegisterError(int code, char * desc), вызываемую при ините модуля? И тогда юзать единую функцию из главного модуля? А что если ошибок понадобится > 255? Сейчас модулей уже 8 штук, каждый хочет 5-8 кодов, а все это дело я хочу возвращать в совместимом с exit(code) виде (0..255).

Ну, собственно, сабж. Есть какое-нибудь общепринятое решение?

 

PPP328
()

Инициализация модуля с наименьшим оверхедом в си

Форум — Development

Есть либа (A-Library), предоставляющая некоторые функции. Она коннектится к другой либе (B-Library) и получает некую структуру:

typedef struct
{
   int a;
   int b;
   ...
   char z[256];
} AAA;

# In A-Library
int SomeFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do stuff
}

int SomeMoreFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do more stuff
}

int SomeEvenMoreFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do even more stuff
}

Понятно, что може например вынести ее глобально (как вариант через static):

# In A-Library
AAA * aaa = NULL;

int SomeFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do stuff
}

int SomeMoreFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do more stuff
}

int SomeEvenMoreFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do even more stuff
}

Вопрос - как с наименьшим оверхедом проинициализировать ее? Нужно:
1. Обойтись без LibraryAInit функции
2. Обойтись без компиляторого-зависимых решений (need c89)
3. Обойтись без костылей в виде проверки в каждой функции, функций много и выглядит костыльно.
4. Представить что GetAAAFromB выполняется долго.

Может как-то намутить с адресами на функцию? Типа сначала адрес на GetAAAFromB, а потом на func() { return aaa; } ? Какие еще есть идеи?

 

PPP328
()

Чем чревата прямая инкапусляция структур в си?

Форум — Development
#include <stdlib.h>
#include <stdio.h>

typedef struct
{
   int a;
   char b;
   char c[20];
} TypeA;

typedef struct
{
  TypeA ta;
  int d;
} TypeB;

int main(void)
{
   /* Без проверок на аллокацию, суть не в них */
   TypeA * ta = malloc(sizeof(TypeA));
   ta->a = 5;   

   TypeB * tb = realloc(ta, sizeof(TypeB));
   tb->ta.b = 6;

   printf("%d, %d\n", tb->ta.a, tb->ta.b);

   free(tb);

   return 0;
}

UB?

 

PPP328
()

Как сделать run.sh для QtCreator в режиме редактора чтобы поддерживался дебаг?

Форум — Development

Если запускать средствами QtCreator (сам он используется тупо как редактор) - то дебаг поддерживается (он при этом спросит какой бинарь я хочу запускать). Хочу сделать чтобы у меня был run.sh, который будет запускать QtCreator и чтобы при этом можно было например поставить брякпоинт на конкретную строку и gdb понял что я от него хочу.

Осуществимо?

 ,

PPP328
()

Бага в libxml2?

Форум — Development

Пишу свой парсер, сверяюсь с libxml2 как образцом. сейчас подобрался к парсингу префиксов-неймспейсов. Ощущение что libxml2 не умеет с ними корректно работать вообще:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <aaa xmlns:de="http://www.dolby.com/dcinema/ws/smi/v11/SPL"        atr="abc"       xmlns:fe="http://somewhere">
   some text
   <de:bbb atr1="abb"  atr2="baa" >aaa</de:bbb>
   <de:ccc>aaa</de:ccc>
   <fe:ddd>bbb</fe:ddd>
   some more text
  </aaa>

XML валидный, проверено.

Что я получаю в итоге у себя (не обрабатываю неймспейсы пока):
space - text
* - attribute
$ - PI
+ - node
} - namespace definition
{ - namespace use

{
    '$xml' => {
        '*version' => '1.0',
        '*encoding' => 'UTF-8',
        '*standalone' => 'yes',
        ' xml' => '\x0A  ',
    },
    '+aaa' => {
        '*xmlns:de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
        '*atr' => 'abc',
        '*xmlns:fe' => 'http://somewhere',
        ' aaa' => '\x0A   some text\x0A   ',
        '+de:bbb' => {
            '*atr1' => 'abb',
            '*atr2' => 'baa',
            ' de:bbb' => 'aaa',
        },
        ' aaa' => '\x0A   ',
        '+de:ccc' => {
            ' de:ccc' => 'aaa',
        },
        ' aaa' => '\x0A   ',
        '+fe:ddd' => {
            ' fe:ddd' => 'bbb',
        },
        ' aaa' => '\x0A   some more text\x0A  ',
    },
},

Что я получаю у libxml2:

{
    '+aaa' => {
        ' aaa' => '\x0A   some text\x0A   ',
        '+bbb' => {
            ' bbb' => 'aaa',
            '*atr1' => 'abb',
            '*atr2' => 'baa',
            '}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   ',
        '+ccc' => {
            ' ccc' => 'aaa',
            '}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   ',
        '+ddd' => {
            ' ddd' => 'bbb',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   some more text\x0A  ',
        '*atr' => 'abc',
        '{de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
        '{fe' => 'http://somewhere',
    },
},
Обратите внимание, что он пририсовал bbb сразу два неймспейса, пририсовал ccc сразу два неймспейса и пририсовал один (правильно) неймспейс для ddd.

ЧЯДНТ? Бага? Фича?

 

PPP328
()

RSS подписка на новые темы