home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 March / CMCD0304.ISO / Software / Freeware / Programare / nullsoft / nsis20.exe / Contrib / System / Source / Plugin.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-10-31  |  3.3 KB  |  173 lines

  1. #include "stdafx.h"
  2. #include "Plugin.h"
  3. #include "Buffers.h"
  4. #include "System.h"
  5.  
  6. HWND g_hwndParent;
  7. int g_stringsize;
  8. stack_t **g_stacktop;
  9. char *g_variables;
  10.  
  11. char *AllocString()
  12. {
  13.     return (char*) GlobalAlloc(GPTR,g_stringsize);
  14. }
  15.  
  16. char *AllocStr(char *str)
  17. {
  18.     return lstrcpy(AllocString(), str);
  19. }
  20.  
  21. char* popstring()
  22. {
  23.         char *str;
  24.         stack_t *th;
  25.  
  26.         if (!g_stacktop || !*g_stacktop) return NULL;
  27.         th=(*g_stacktop);
  28.  
  29.         str = AllocString();
  30.         lstrcpy(str,th->text);
  31.  
  32.         *g_stacktop = th->next;
  33.         GlobalFree((HGLOBAL)th);
  34.         return str;
  35. }
  36.  
  37. char *pushstring(char *str)
  38. {
  39.         stack_t *th;
  40.         if (!g_stacktop) return str;
  41.         th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
  42.         lstrcpyn(th->text,str,g_stringsize);
  43.         th->next=*g_stacktop;
  44.         *g_stacktop=th;
  45.         return str;
  46. }
  47.  
  48. char *getuservariable(int varnum)
  49. {
  50.         if (varnum < 0 || varnum >= __INST_LAST) return AllocString();
  51.         return AllocStr(g_variables+varnum*g_stringsize);
  52. }
  53.  
  54. char *setuservariable(int varnum, char *var)
  55. {
  56.         if (var != NULL && varnum >= 0 && varnum < __INST_LAST) {
  57.                 lstrcpy (g_variables + varnum*g_stringsize, var);
  58.         }
  59.         return var;
  60. }
  61.  
  62. // Updated for int64 and simple bitwise operations
  63. __int64 myatoi(char *s)
  64. {
  65.   __int64 v=0;
  66.   // Check for right input
  67.   if (!s) return 0;
  68.   if (*s == '0' && (s[1] == 'x' || s[1] == 'X'))
  69.   {
  70.     s++;
  71.     for (;;)
  72.     {
  73.       int c=*(++s);
  74.       if (c >= '0' && c <= '9') c-='0';
  75.       else if (c >= 'a' && c <= 'f') c-='a'-10;
  76.       else if (c >= 'A' && c <= 'F') c-='A'-10;
  77.       else break;
  78.       v<<=4;
  79.       v+=c;
  80.     }
  81.   }
  82.   else if (*s == '0' && s[1] <= '7' && s[1] >= '0')
  83.   {
  84.     for (;;)
  85.     {
  86.       int c=*(++s);
  87.       if (c >= '0' && c <= '7') c-='0';
  88.       else break;
  89.       v<<=3;
  90.       v+=c;
  91.     }
  92.   }
  93.   else
  94.   {
  95.     int sign=0;
  96.     if (*s == '-') sign++; else s--;
  97.     for (;;)
  98.     {
  99.       int c=*(++s) - '0';
  100.       if (c < 0 || c > 9) break;
  101.       v*=10;
  102.       v+=c;
  103.     }
  104.     if (sign) v = -v;
  105.   }
  106.  
  107.   // Support for simple ORed expressions
  108.   if (*s == '|') 
  109.   {
  110.       v |= myatoi(s+1);
  111.   }
  112.  
  113.   return v;
  114. }
  115.  
  116. void myitoa64(__int64 i, char *buffer)
  117. {
  118.     char buf[128], *b = buf;
  119.  
  120.     if (i < 0)
  121.     {
  122.         *(buffer++) = '-';
  123.         i = -i;
  124.     }
  125.     if (i == 0) *(buffer++) = '0';
  126.     else 
  127.     {
  128.         while (i > 0) 
  129.         {
  130.             *(b++) = '0' + ((char) (i%10));
  131.             i /= 10;
  132.         }
  133.         while (b > buf) *(buffer++) = *(--b);
  134.     }
  135.     *buffer = 0;
  136. }
  137.  
  138. int popint()
  139. {
  140.     int value;
  141.     char *str;
  142.     if ((str = popstring()) == NULL) return -1;
  143.     value = (int) myatoi(str);
  144.     GlobalFree(str);
  145.     return value;
  146. }
  147.  
  148. void pushint(int value)
  149. {
  150.     char buffer[1024];
  151.     wsprintf(buffer, "%d", value);
  152.     pushstring(buffer);
  153. }
  154.  
  155. char *copymem(char *output, char *input, int size)
  156. {
  157.     char *out = output;
  158.     if ((input != NULL) && (output != NULL))
  159.         while (size-- > 0) *(out++) = *(input++);
  160.     return output;
  161. }
  162.  
  163. HANDLE GlobalCopy(HANDLE Old)
  164. {
  165.     SIZE_T size = GlobalSize(Old);
  166.     return copymem(GlobalAlloc(GPTR, size), Old, (int) size);
  167. }
  168.  
  169. #ifdef _DEBUG
  170. void main()
  171. {
  172. }
  173. #endif