From d21d1d7b9ca2fd3b84eab553d5c578575695afd1 Mon Sep 17 00:00:00 2001 From: Albom Date: Fri, 22 Mar 2013 17:53:23 +0000 Subject: [PATCH] Quicksort dll and example. git-svn-id: svn://kolibrios.org@3402 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/libraries/qs/compile.bat | 2 + .../develop/libraries/qs/example/compile.bat | 4 + .../develop/libraries/qs/example/console.c | 88 +++++ .../develop/libraries/qs/example/example.c | 61 ++++ .../develop/libraries/qs/example/kolibri.h | 90 +++++ .../develop/libraries/qs/example/kolibri.ld | 20 ++ .../develop/libraries/qs/example/stdlib.h | 14 + .../develop/libraries/qs/example/string.h | 12 + programs/develop/libraries/qs/qs.c | 339 ++++++++++++++++++ programs/develop/libraries/qs/qs.h | 51 +++ programs/develop/libraries/qs/readme.txt | 9 + programs/system/shell/bin/rus/shell | Bin 0 -> 19704 bytes 12 files changed, 690 insertions(+) create mode 100644 programs/develop/libraries/qs/compile.bat create mode 100644 programs/develop/libraries/qs/example/compile.bat create mode 100644 programs/develop/libraries/qs/example/console.c create mode 100644 programs/develop/libraries/qs/example/example.c create mode 100644 programs/develop/libraries/qs/example/kolibri.h create mode 100644 programs/develop/libraries/qs/example/kolibri.ld create mode 100644 programs/develop/libraries/qs/example/stdlib.h create mode 100644 programs/develop/libraries/qs/example/string.h create mode 100644 programs/develop/libraries/qs/qs.c create mode 100644 programs/develop/libraries/qs/qs.h create mode 100644 programs/develop/libraries/qs/readme.txt create mode 100644 programs/system/shell/bin/rus/shell diff --git a/programs/develop/libraries/qs/compile.bat b/programs/develop/libraries/qs/compile.bat new file mode 100644 index 0000000000..e837cd3083 --- /dev/null +++ b/programs/develop/libraries/qs/compile.bat @@ -0,0 +1,2 @@ +gcc -c -o qs.obj qs.c +pause diff --git a/programs/develop/libraries/qs/example/compile.bat b/programs/develop/libraries/qs/example/compile.bat new file mode 100644 index 0000000000..ed885b9b85 --- /dev/null +++ b/programs/develop/libraries/qs/example/compile.bat @@ -0,0 +1,4 @@ +gcc -c example.c +ld -nostdlib -T kolibri.ld -o example.kex start.o kolibri.o stdlib.o string.o example.o +objcopy example.kex -O binary +pause \ No newline at end of file diff --git a/programs/develop/libraries/qs/example/console.c b/programs/develop/libraries/qs/example/console.c new file mode 100644 index 0000000000..7883274c65 --- /dev/null +++ b/programs/develop/libraries/qs/example/console.c @@ -0,0 +1,88 @@ + +///=========================== + +#define CON_COLOR_BLUE 1 +#define CON_COLOR_GREEN 2 +#define CON_COLOR_RED 4 +#define CON_COLOR_BRIGHT 8 +/* цвет фона */ +#define CON_BGR_BLUE 0x10 +#define CON_BGR_GREEN 0x20 +#define CON_BGR_RED 0x40 +#define CON_BGR_BRIGHT 0x80 + +///=========================== + +void (* _stdcall con_init)(unsigned w_w, unsigned w_h, unsigned s_w, unsigned s_h, const char* t); +void (* _cdecl printf)(const char* format,...); +void (* _stdcall _exit)(char bCloseWindow); +void (* __stdcall gets)(char* str, int n); + int (* __stdcall getch)(void); + int (* __stdcall con_get_font_height)(void); + int (* __stdcall con_set_cursor_height)(int new_height); +unsigned (*__stdcall con_get_flags)(void); +unsigned (*__stdcall con_set_flags)(unsigned new_flags); +void (*__stdcall con_cls)(void); + +///=========================== + +void CONSOLE_INIT(char title[]) +{ +kol_struct_import *imp; + +imp = kol_cofflib_load("/sys/lib/console.obj"); +if (imp == NULL) + kol_exit(); + +con_init = ( _stdcall void (*)(unsigned, unsigned, unsigned, unsigned, const char*)) + kol_cofflib_procload (imp, "con_init"); +if (con_init == NULL) + kol_exit(); + +printf = ( _cdecl void (*)(const char*,...)) + kol_cofflib_procload (imp, "con_printf"); +if (printf == NULL) + kol_exit(); + +_exit = ( _stdcall void (*)(char)) + kol_cofflib_procload (imp, "con_exit"); +if (_exit == NULL) + kol_exit(); + +gets = ( _stdcall void (*)(char*, int)) + kol_cofflib_procload (imp, "con_gets"); +if (gets == NULL) + kol_exit(); + +getch = ( _stdcall int (*)(void)) + kol_cofflib_procload (imp, "con_getch2"); +if (getch == NULL) + kol_exit(); + +con_get_font_height = ( _stdcall int (*)(void)) + kol_cofflib_procload (imp, "con_get_font_height"); +if (con_get_font_height == NULL) + kol_exit(); + +con_set_cursor_height = ( _stdcall int (*)(int)) + kol_cofflib_procload (imp, "con_set_cursor_height"); +if (con_set_cursor_height == NULL) + kol_exit(); + +con_get_flags = ( _stdcall unsigned (*)(void)) + kol_cofflib_procload (imp, "con_get_flags"); +if (con_get_flags == NULL) + kol_exit(); + +con_set_flags = ( _stdcall unsigned (*)(unsigned)) + kol_cofflib_procload (imp, "con_set_flags"); +if (con_set_flags == NULL) + kol_exit(); + +con_cls = ( _stdcall void (*)(void)) + kol_cofflib_procload (imp, "con_cls"); +if (con_cls == NULL) + kol_exit(); + +con_init(-1, -1, -1, -1, title); +} diff --git a/programs/develop/libraries/qs/example/example.c b/programs/develop/libraries/qs/example/example.c new file mode 100644 index 0000000000..41cf3747ff --- /dev/null +++ b/programs/develop/libraries/qs/example/example.c @@ -0,0 +1,61 @@ + +#include "kolibri.h" +#include "stdlib.h" +#include "string.h" + +#include "console.c" + + +void (* __stdcall qsi)(int* d, int n); + +/// =========================================================== + +void kol_main() +{ + +#define NUM 20000 + +kol_struct_import *imp_qs; + +int *a; +int i; + +CONSOLE_INIT("Example"); + +imp_qs = kol_cofflib_load("/sys/lib/qs.obj"); +qsi = ( _stdcall void (*)(int*, int)) + kol_cofflib_procload (imp_qs, "qsi"); + +a = malloc(NUM*sizeof(int)); + +for (i = 0; i < NUM; i++) + *(a+i) = random(10000); + +for (i = 0; i < 5; i++) + printf("%7d", *(a+i)); + +printf (" ..."); + +for (i = NUM-5; i < NUM; i++) + printf("%7d", *(a+i)); + +qsi(a, NUM); + +printf ("\n"); + +for (i = 0; i < 5; i++) + printf("%7d", *(a+i)); + +printf (" ..."); + +for (i = NUM-5; i < NUM; i++) + printf("%7d", *(a+i)); + + +free(a); + +_exit(0); +kol_exit(); +} + +/// =========================================================== diff --git a/programs/develop/libraries/qs/example/kolibri.h b/programs/develop/libraries/qs/example/kolibri.h new file mode 100644 index 0000000000..53575d1a72 --- /dev/null +++ b/programs/develop/libraries/qs/example/kolibri.h @@ -0,0 +1,90 @@ + +#define NULL ((void*)0) + +typedef struct +{ +unsigned p00 __attribute__((packed)); +unsigned p04 __attribute__((packed)); +unsigned p08 __attribute__((packed)); +unsigned p12 __attribute__((packed)); +unsigned p16 __attribute__((packed)); +char p20 __attribute__((packed)); +char *p21 __attribute__((packed)); +} kol_struct70 __attribute__((packed)); + + +typedef struct +{ +unsigned p00 __attribute__((packed)); +char p04 __attribute__((packed)); +char p05[3] __attribute__((packed)); +unsigned p08 __attribute__((packed)); +unsigned p12 __attribute__((packed)); +unsigned p16 __attribute__((packed)); +unsigned p20 __attribute__((packed)); +unsigned p24 __attribute__((packed)); +unsigned p28 __attribute__((packed)); +unsigned p32[2] __attribute__((packed)); +unsigned p40 __attribute__((packed)); +} kol_struct_BDVK __attribute__((packed)); + +typedef struct +{ +char *name __attribute__((packed)); +void *data __attribute__((packed)); +} kol_struct_import __attribute__((packed)); + + +void kol_exit(); +void kol_sleep(unsigned d); +void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c); +void kol_wnd_move(unsigned x, unsigned y); +void kol_wnd_caption(char *s); +void kol_event_mask(unsigned e); +unsigned kol_event_wait(); +unsigned kol_event_wait_time(unsigned time); +unsigned kol_event_check(); +void kol_paint_start(); +void kol_paint_end(); +void kol_paint_pixel(unsigned x, unsigned y, unsigned c); +void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c); +void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c); +void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c); +void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d); +void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette); +unsigned kol_key_get(); +unsigned kol_key_control(); +void kol_key_lang_set(unsigned lang); +unsigned kol_key_lang_get(); +void kol_key_mode_set(unsigned mode); +unsigned kol_key_mode_get(); +void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c); +unsigned kol_btn_get(); +void kol_btn_type(unsigned t); +unsigned kol_mouse_pos(); +unsigned kol_mouse_posw(); +unsigned kol_mouse_btn(); +void kol_board_putc(char c); +void kol_board_puts(char *s); +void kol_board_puti(int n); +int kol_file_70(kol_struct70 *k); +kol_struct_import* kol_cofflib_load(char *name); +void* kol_cofflib_procload (kol_struct_import *imp, char *name); +unsigned kol_cofflib_procnum (kol_struct_import *imp); +void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n); +unsigned kol_system_end(unsigned param); +unsigned kol_system_cpufreq(); +unsigned kol_system_mem(); +unsigned kol_system_memfree(); +unsigned kol_system_time_get(); +unsigned kol_system_date_get(); +void kol_path_file2dir(char *dir, char *fname); +void kol_path_full(char *full, char *fname); +void kol_screen_wait_rr(); +void kol_screen_get_size(unsigned *w, unsigned *h); +unsigned kol_skin_height(); +unsigned kol_thread_start(unsigned start, unsigned stack); +unsigned kol_time_tick(); +unsigned kol_sound_speaker(char data[]); +unsigned kol_process_info(unsigned slot, char buf1k[]); +int kol_process_kill_pid(unsigned process); diff --git a/programs/develop/libraries/qs/example/kolibri.ld b/programs/develop/libraries/qs/example/kolibri.ld new file mode 100644 index 0000000000..23841f98db --- /dev/null +++ b/programs/develop/libraries/qs/example/kolibri.ld @@ -0,0 +1,20 @@ +/*OUTPUT_FORMAT("binary")*/ +ENTRY(Start) +SECTIONS +{ + .text 0x000000: + { + *(.text) + } + + .data : { + *(.data) + hEnd = . ; + } + + .bss : + { + *(.bss) + } + Memory = . ; +} diff --git a/programs/develop/libraries/qs/example/stdlib.h b/programs/develop/libraries/qs/example/stdlib.h new file mode 100644 index 0000000000..e984555604 --- /dev/null +++ b/programs/develop/libraries/qs/example/stdlib.h @@ -0,0 +1,14 @@ + +#define RAND_MAX 0x7FFFU + +#define isspace(c) ((c)==' ') +#define abs(i) (((i)<0)?(-(i)):(i)) + +#define random(num) ((rand()*(num))/((RAND_MAX+1))) + +void* malloc(unsigned size); +void free(void *pointer); +void* realloc(void* pointer, unsigned size); + +void srand (unsigned seed); +int rand (void); diff --git a/programs/develop/libraries/qs/example/string.h b/programs/develop/libraries/qs/example/string.h new file mode 100644 index 0000000000..4bb934aa10 --- /dev/null +++ b/programs/develop/libraries/qs/example/string.h @@ -0,0 +1,12 @@ + +#define NULL ((void*)0) + +void* memset(void *mem, int c, unsigned size); +void* memcpy(void *dst, const void *src, unsigned size); + +void strcat(char strDest[], char strSource[]); +int strcmp(const char* string1, const char* string2); +void strcpy(char strDest[], const char strSource[]); +char* strncpy(char *strDest, const char *strSource, unsigned n); +int strlen(const char* string); +char *strchr(const char* string, int c); diff --git a/programs/develop/libraries/qs/qs.c b/programs/develop/libraries/qs/qs.c new file mode 100644 index 0000000000..e45bcde72c --- /dev/null +++ b/programs/develop/libraries/qs/qs.c @@ -0,0 +1,339 @@ + +///=========================================== +/// +/// Библиотека функций быстрой сортировки +/// +/// +/// Базовый код был взят с сайта algolist.manual.ru +/// +/// Скомпоновал А. Богомаз aka Albom (albom85@yandex.ru) +///=========================================== + + +///=========================================== +/// Сортировка для переменных типа int (4 байта) +///=========================================== +void qsi(int *a, int n) +{ + +int i, j; +int temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qsi(a, j); +if ( n > i ) + qsi(a+i, n-i); + +} + +///=========================================== +/// Сортировка для переменных типа short int (2 байта) +///=========================================== + +void qss(short *a, int n) +{ + +int i, j; +short temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qss(a, j); +if ( n > i ) + qss(a+i, n-i); + +} + +///=========================================== +/// Сортировка для переменных типа char (1 байт) +///=========================================== + +void qsc(char *a, int n) +{ + +int i, j; +char temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qsc(a, j); +if ( n > i ) + qsc(a+i, n-i); + +} + +///=========================================== +/// Сортировка для переменных типа unsigned int (4 байта) +///=========================================== +void qsui(unsigned *a, int n) +{ + +int i, j; +unsigned temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qsui(a, j); +if ( n > i ) + qsui(a+i, n-i); + +} + +///=========================================== +/// Сортировка для переменных типа unsigned short int (2 байта) +///=========================================== + +void qsus(unsigned short *a, int n) +{ + +int i, j; +unsigned short temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qsus(a, j); +if ( n > i ) + qsus(a+i, n-i); + +} + +///=========================================== +/// Сортировка для переменных типа unsigned char (1 байт) +///=========================================== + +void qsuc(unsigned char *a, int n) +{ + +int i, j; +unsigned char temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qsuc(a, j); +if ( n > i ) + qsuc(a+i, n-i); + +} + + +///=========================================== +/// Сортировка для переменных типа float (4 байта) +///=========================================== + +void qsf(float *a, int n) +{ + +int i, j; +float temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qsf(a, j); +if ( n > i ) + qsf(a+i, n-i); + +} + +///=========================================== +/// Сортировка для переменных типа double (8 байт) +///=========================================== + +void qsd(double *a, int n) +{ + +int i, j; +double temp, p; + +p = *(a+(n>>1)); + +i = 0; +j = n; + +do + { + while ( *(a+i) < p ) i++; + while ( *(a+j) > p ) j--; + + if (i <= j) + { + temp = *(a+i); + *(a+i) = *(a+j); + *(a+j) = temp; + i++; + j--; + } + } while ( i<=j ); + +if ( j > 0 ) + qsd(a, j); +if ( n > i ) + qsd(a+i, n-i); + +} + +///=========================================== + + +#define NULL ((void*)0) + +typedef struct +{ +void *name; +void *function; +} export_t; + +char szQsi[] = "qsi"; +char szQss[] = "qss"; +char szQsc[] = "qsc"; +char szQsui[] = "qsui"; +char szQsus[] = "qsus"; +char szQsuc[] = "qsuc"; +char szQsf[] = "qsf"; +char szQsd[] = "qsd"; + +export_t EXPORTS[] = +{ +{ szQsi, (void*) qsi }, +{ szQss, (void*) qss }, +{ szQsc, (void*) qsc }, +{ szQsui, (void*) qsui }, +{ szQsus, (void*) qsus }, +{ szQsuc, (void*) qsuc }, +{ szQsf, (void*) qsf }, +{ szQsd, (void*) qsd }, +{ NULL, NULL }, +}; diff --git a/programs/develop/libraries/qs/qs.h b/programs/develop/libraries/qs/qs.h new file mode 100644 index 0000000000..a1ea48340a --- /dev/null +++ b/programs/develop/libraries/qs/qs.h @@ -0,0 +1,51 @@ + +///=========================================== +/// +/// Библиотека функций быстрой сортировки +/// +/// +/// Базовый код был взят с сайта algolist.manual.ru +/// +/// Скомпоновал А. Богомаз aka Albom (albom85@yandex.ru) +///=========================================== + + +///=========================================== +/// Сортировка для переменных типа int (4 байта) +///=========================================== +void qsi(int *a, int n); + +///=========================================== +/// Сортировка для переменных типа short int (2 байта) +///=========================================== +void qss(short *a, int n); + +///=========================================== +/// Сортировка для переменных типа char (1 байт) +///=========================================== +void qsc(char *a, int n); + +///=========================================== +/// Сортировка для переменных типа unsigned int (4 байта) +///=========================================== +void qsui(unsigned *a, int n); + +///=========================================== +/// Сортировка для переменных типа unsigned short int (2 байта) +///=========================================== +void qsus(unsigned short *a, int n); + +///=========================================== +/// Сортировка для переменных типа unsigned char (1 байт) +///=========================================== +void qsuc(unsigned char *a, int n); + +///=========================================== +/// Сортировка для переменных типа float (4 байта) +///=========================================== +void qsf(float *a, int n); + +///=========================================== +/// Сортировка для переменных типа double (8 байт) +///=========================================== +void qsd(double *a, int n); diff --git a/programs/develop/libraries/qs/readme.txt b/programs/develop/libraries/qs/readme.txt new file mode 100644 index 0000000000..50bb6617b8 --- /dev/null +++ b/programs/develop/libraries/qs/readme.txt @@ -0,0 +1,9 @@ + + + Библиотека функций быстрой сортировки qs version 0.1 + + + Базовый код был взят с сайта algolist.manual.ru + + Скомпоновал А. Богомаз aka Albom (albom85@yandex.ru) + diff --git a/programs/system/shell/bin/rus/shell b/programs/system/shell/bin/rus/shell new file mode 100644 index 0000000000000000000000000000000000000000..22e81b29d54b15981104c62c96874bffc23f5328 GIT binary patch literal 19704 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 literal 0 HcmV?d00001