File: Buffers.c

package info (click to toggle)
nsis 3.11-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 12,496 kB
  • sloc: cpp: 39,326; ansic: 27,284; python: 1,386; asm: 712; xml: 409; pascal: 231; makefile: 225; javascript: 67
file content (138 lines) | stat: -rwxr-xr-x 3,717 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Unicode support by Jim Park -- 08/23/2007

#include "stdafx.h"
#include "Plugin.h"
#include "System.h"
#include "Buffers.h"

typedef struct tagTempStack TempStack;
struct tagTempStack
{
    TempStack *Next;
    TCHAR Data[0];
};
TempStack *g_tempstack = NULL;

static void AllocWorker(unsigned int mult)
{
    size_t size;
    if ((size = popintptr()) == 0)
    {
        system_pushint(0);
        return;
    }
    system_pushintptr((INT_PTR) GlobalAlloc(GPTR, size * mult));
}

PLUGINFUNCTIONSHORT(Alloc)
{
    AllocWorker(sizeof(unsigned char));
}
PLUGINFUNCTIONEND

PLUGINFUNCTIONSHORT(StrAlloc)
{
    AllocWorker(sizeof(TCHAR));
}
PLUGINFUNCTIONEND

PLUGINFUNCTIONSHORT(Copy)
{
    SIZE_T size = 0;
    HANDLE source, dest;
    TCHAR *str;
    // Get the string
    if ((str = system_popstring()) == NULL) return;

    // Check for size option
    if (str[0] == _T('/'))
    {
        size = (SIZE_T) StrToIntPtr(str+1);
        dest = (HANDLE) popintptr();
    }
    else dest = (HANDLE) StrToIntPtr(str);
    source = (HANDLE) popintptr();

    // Ok, check the size
    if (size == 0) size = (SIZE_T) GlobalSize(source);
    // and the destinantion
    if (!dest) 
    {
        dest = GlobalAlloc((GPTR), size);
        system_pushintptr((INT_PTR) dest);
    }

    // COPY!
    copymem(dest, source, size);

    GlobalFree(str);
}
PLUGINFUNCTIONEND

#define EXECFLAGSSTACKMARKER ( sizeof(TCHAR) > 1 ? (TCHAR) 0x2691 : 0x1E ) // U+2691 Black Flag

PLUGINFUNCTION(Store)
{
    TempStack *tmp;
    stack_t*pNSE;
    int size = ((INST_R9+1)*g_stringsize*sizeof(TCHAR));
    int tmpint;

    TCHAR *command, *cmd = command = system_popstring();
    while (*cmd != 0)
    {
        switch (*(cmd++))
        {
        case _T('s'):
        case _T('S'):
            // Store the whole variables range
            tmp = (TempStack*) GlobalAlloc(GPTR, sizeof(TempStack)+size);
            // Fill with data
            copymem(tmp->Data, g_variables, size);
            // Push to private stack
            tmp->Next = g_tempstack, g_tempstack = tmp;
            break;
        case _T('l'):
        case _T('L'):
            if (g_tempstack == NULL) break;

            // Fill with data
            copymem(g_variables, g_tempstack->Data, size);
            // Pop from private stack
            tmp = g_tempstack, g_tempstack = g_tempstack->Next;
            GlobalFree((HANDLE) tmp);
            break;
        case _T('P'):
            *cmd += 10;
        case _T('p'):
            GlobalFree((HANDLE) system_pushstring(system_getuservariable(*(cmd++)-_T('0'))));
            break;
        case _T('R'):
            *cmd += 10;
        case _T('r'):
            GlobalFree((HANDLE) system_setuservariable(*(cmd++)-_T('0'), system_popstring()));
            break;
        case _T('f'):
            // Pop from stack
            pNSE = *g_stacktop, *g_stacktop = pNSE->next;
            // Restore data
            tmpint = extra->exec_flags->abort;
            if (pNSE->text[0] == EXECFLAGSSTACKMARKER)
              copymem(extra->exec_flags, pNSE->text+2, sizeof(exec_flags_t));
            extra->exec_flags->abort = tmpint; // Don't allow overriding the abort flag
            GlobalFree((HANDLE) pNSE);
            break;
        case _T('F'):
            // Store the data
             pNSE = (stack_t*) GlobalAlloc(GPTR, sizeof(stack_t)+(g_stringsize*sizeof(TCHAR)));
            *((UINT32*)pNSE->text) = EXECFLAGSSTACKMARKER; // marker + '\0'
            copymem(pNSE->text+2, extra->exec_flags, sizeof(exec_flags_t));
            // Push to stack
            pNSE->next = *g_stacktop, *g_stacktop = pNSE;
            break;
        }
    }

    GlobalFree((HANDLE) command);
}
PLUGINFUNCTIONEND