Subversion Repositories Kolibri OS

Rev

Rev 8695 | Rev 9124 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include <stdlib.h>
  2. #include <sys/stat.h>
  3. #include <string.h>
  4.  
  5. #define asm_inline __asm__ __volatile__
  6.  
  7. #pragma pack(push,1)
  8. typedef union{
  9.     unsigned val;
  10.     struct{
  11.         short  x;
  12.         short  y;
  13.     };
  14. }ksys_pos_t;
  15.  
  16. typedef union ksys_oskey_t{
  17.     unsigned val;
  18.     struct{
  19.         unsigned char state;
  20.         unsigned char code;
  21.         unsigned char ctrl_key;
  22.     };
  23. }ksys_oskey_t;
  24.  
  25. typedef struct{
  26.   unsigned     handle;
  27.   unsigned     io_code;
  28.   unsigned     *input;
  29.   int          inp_size;
  30.   void         *output;
  31.   int          out_size;
  32. }ksys_ioctl_t;
  33.  
  34. typedef struct{
  35.     void *data;
  36.     size_t size;
  37. }ksys_ufile_t;
  38.  
  39.  
  40. typedef struct{
  41.     unsigned            p00;
  42.     union{
  43.         uint64_t        p04;
  44.         struct {
  45.             unsigned    p04dw;
  46.             unsigned    p08dw;
  47.         };
  48.     };
  49.     unsigned            p12;
  50.     union {
  51.         unsigned        p16;
  52.         const char     *new_name;
  53.         void           *bdfe;
  54.         void           *buf16;
  55.         const void     *cbuf16;
  56.     };
  57.     char                p20;
  58.     const char         *p21;
  59. }ksys70_t;
  60.  
  61. typedef struct {
  62.   int cpu_usage;             //+0
  63.   int window_pos_info;       //+4
  64.   short int reserved1;       //+8
  65.   char name[12];             //+10
  66.   int memstart;              //+22
  67.   int memused;               //+26
  68.   int pid;                   //+30
  69.   int winx_start;            //+34
  70.   int winy_start;            //+38
  71.   int winx_size;             //+42
  72.   int winy_size;             //+46
  73.   short int slot_info;       //+50
  74.   short int reserved2;       //+52
  75.   int clientx;               //+54
  76.   int clienty;               //+58
  77.   int clientwidth;           //+62
  78.   int clientheight;          //+66
  79.   unsigned char window_state;//+70
  80.   char reserved3[1024-71];   //+71
  81. }ksys_proc_table_t;
  82.  
  83. #pragma pack(pop)
  84.  
  85. static inline
  86. int _ksys_process_info(ksys_proc_table_t* table, int pid)
  87. {
  88.     int val;
  89.     asm_inline(
  90.         "int $0x40"
  91.         :"=a"(val)
  92.         :"a"(9), "b"(table), "c"(pid)
  93.         :"memory"
  94.     );
  95.     return val;
  96. }
  97.  
  98. static inline
  99. void _ksys_change_window(int new_x, int new_y, int new_w, int new_h)
  100. {
  101.     asm_inline(
  102.         "int $0x40"
  103.         ::"a"(67), "b"(new_x), "c"(new_y), "d"(new_w),"S"(new_h)
  104.     );
  105. }
  106.  
  107. static inline
  108. ksys_pos_t _ksys_screen_size()
  109. {
  110.         ksys_pos_t size;
  111.     ksys_pos_t size_tmp;
  112.     asm_inline(
  113.         "int $0x40"
  114.         :"=a"(size_tmp)
  115.         :"a"(14)
  116.     );
  117.     size.x = size_tmp.y;
  118.     size.y = size_tmp.x;
  119.     return size;
  120. }
  121.  
  122. void *memrchr(const void *m, int c, size_t n)
  123. {
  124.         const unsigned char *s = (const unsigned char*)m;
  125.         c = (unsigned char)c;
  126.         while (n--) if (s[n]==c) return (void *)(s+n);
  127.         return 0;
  128. }
  129.  
  130. void kolibri_set_win_center()
  131. {
  132.     ksys_proc_table_t *info = (ksys_proc_table_t*)malloc(sizeof(ksys_proc_table_t));
  133.     _ksys_process_info(info, -1);
  134.  
  135.     ksys_pos_t screen_size= _ksys_screen_size();
  136.     int new_x = screen_size.x/2-info->winx_size/2;
  137.     int new_y = screen_size.y/2-info->winy_size/2;
  138.     _ksys_change_window(new_x, new_y, -1, -1);
  139.     free(info);
  140. }
  141.  
  142. int mkdir(const char *path, unsigned v)
  143. {
  144.     int status;
  145.     ksys70_t dir_opt;
  146.     dir_opt.p00 = 9;
  147.     dir_opt.p21 = path;
  148.     asm_inline(
  149.         "int $0x40"
  150.         :"=a"(status)
  151.         :"a"(70), "b"(&dir_opt)
  152.         :"memory"
  153.     );
  154.     return status;
  155. }
  156.  
  157. char *dirname (char *path)
  158. {
  159.   static const char dot[] = ".";
  160.   char *last_slash;
  161.   /* Find last '/'.  */
  162.   last_slash = path != NULL ? strrchr (path, '/') : NULL;
  163.   if (last_slash != NULL && last_slash != path && last_slash[1] == '\0')
  164.     {
  165.       /* Determine whether all remaining characters are slashes.  */
  166.       char *runp;
  167.       for (runp = last_slash; runp != path; --runp)
  168.         if (runp[-1] != '/')
  169.           break;
  170.       /* The '/' is the last character, we have to look further.  */
  171.       if (runp != path)
  172.         last_slash = (char*)memrchr((void*)path, '/', runp - path);
  173.     }
  174.   if (last_slash != NULL)
  175.     {
  176.       /* Determine whether all remaining characters are slashes.  */
  177.       char *runp;
  178.       for (runp = last_slash; runp != path; --runp)
  179.         if (runp[-1] != '/')
  180.           break;
  181.       /* Terminate the path.  */
  182.       if (runp == path)
  183.         {
  184.           /* The last slash is the first character in the string.  We have to
  185.              return "/".  As a special case we have to return "//" if there
  186.              are exactly two slashes at the beginning of the string.  See
  187.              XBD 4.10 Path Name Resolution for more information.  */
  188.           if (last_slash == path + 1)
  189.             ++last_slash;
  190.           else
  191.             last_slash = path + 1;
  192.         }
  193.       else
  194.         last_slash = runp;
  195.       last_slash[0] = '\0';
  196.     }
  197.   else
  198.     /* This assignment is ill-designed but the XPG specs require to
  199.        return a string containing "." in any case no directory part is
  200.        found and so a static and constant string is required.  */
  201.     path = (char *) dot;
  202.   return path;
  203. }
  204.  
  205. void setcwd(char* path){
  206.     asm_inline(
  207.         "int $0x40"
  208.         ::"a"(30), "b"(1), "c"(path)
  209.     );
  210. }
  211.  
  212.