воскресенье, 21 марта 2010 г.

Параметры командной строки и KolibriOS

Вот уже длительное время занимаюсь адаптацией параметров формата колибри, к формату С\С++, хотя прогресс и есть, но он слишком малый, и сегодня я попрошу на форуме помощи, тк пытаться понять по исходникам программ надоело((

воскресенье, 14 февраля 2010 г.

Подарок девушке на ДР

Завтра у моей любимой день варения и одновременно завтра день всех влюблённых, хочу сделать оригинальный подарок, домен "iloveann.net" и хостинг оплаченные на год :) . Надеюсь ей понравиться , очень надеюсь...


вторник, 9 февраля 2010 г.

KCC - Kolibri C Compiler

Возможно название очень громкое, но оно означает не совсем то, что некоторые могли подумать. Это не компилятор Си для KolibriOS, а надстройка к gcc и fasm для linux написанная на перле, которая позволяет писать на Си из linux для колибри. А "kcc" это передразнивание "gcc" .

Вступление (под капотом)

Я не особо великолепно разбираюсь в опциях gcc и линковщика, поэтому пошёл не стандартным путём обучения gcc компилировать код для колибри, а сделал программку на перле которая программу созданную gcc для linux в асме AT&T синтаксиса, преобразует к Intel синтаксису и в вид программы для колибри. Звучит запутанно, но описав с комментариями  весь процесс будет понятнее. (В след версии весь этот процесс будет автоматизирован, как и установка)

  1. gcc test.c -S    //   gcc создаёт ассемблерный файл в AT&T  синтаксисе с именем test.s
  2. perl kcc.pl test.s   //   kcc транслирует AT&T листинг в FASM Intel для колибри в файл test.asm
  3. fasm(./fasm) test.asm test    // fasm создаёт бинарный файл для колибри test

Hello, world!

Пример "hello , world". Хочу, заметить, что kcc пока работает не очень хорошо и в качестве полноценной среды лучше его пока не применять. И да, размещаю его под 'New' BSD лицензией.

Пример

kcc


суббота, 2 января 2010 г.

Linux класс сокетов.

Недавно себе для удобства написал небольшой класс, легко и быстро реализующий tcp сокет. Возможно кому-то (например мне) пригодиться, поэтому вывешиваю тут.
#include iostream //тут не хватает кавычек, подставьте сами и тд
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include stdlib.h

using namespace std;

class Server {
public:
Server(int port, int waiters) {
listener = socket(AF_INET, SOCK_STREAM, 0);
if( listener <>
cout<<"SERVER Error creating socket"<
exit(0);
} else {
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
if( bind(listener, (struct sockaddr *)&addr, sizeof(addr) ) <>
cout<<"SERVER Error binding port"<
exit(0);
} else {
listen(listener, waiters);
}
}
}
~Server() {
close(listener);
close(user);
}
bool Accept() {
user = accept(listener, NULL, NULL);
if( user <>
return true;
}
string Read() {
string socket_data;
do {
bytes_read = recv(user, buff, 5000, 0);
} while( bytes_read <= 0 );
socket_data=buff;
return socket_data;
}
void CloseUser() {
close(user);
}
void CloseListener() {
close(listener);
}
void Send(string send_data) {
send(user, send_data.c_str(), send_data.size(), 0);
}
void operator >>(string* line) {
*line=Read();
}
void operator <<(string* line) {
Send(*line);
}
private:
int listener;
int user;
int bytes_read;
char buff[5000];
struct sockaddr_in addr;
};

Пример эхо сервера (с много поточностью через fork() с порождением независимых дочерних процессов):
int main() {
Server MainServer(30000, 5);
while( true ) {
if( !MainServer.Accept() ) {
cout<<"Error accepting"<
exit(0);
}
if( fork() == 0 ) {
MainServer.CloseListener();
string data;
MainServer>>&data;
cout<<
MainServer<<&data;
MainServer.CloseUser();
_exit(0);
} else {
MainServer.CloseUser();
}
}
MainServer.CloseListener();
return 0;
}

Постоянные читатели