ReactOS 0.4.16-dev-2104-gb84fa49
misc.c File Reference
#include <stdlib.h>
#include <sys/types.h>
#include "msvcrt.h"
#include "wine/debug.h"
#include "ntsecapi.h"
#include "windows.h"
#include "wine/asm.h"
Include dependency graph for misc.c:

Go to the source code of this file.

Macros

#define X(i)   ((char*)base+size*(i))
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (msvcrt)
 
void CDECL _beep (unsigned int freq, unsigned int duration)
 
void CDECL srand (unsigned int seed)
 
int CDECL rand (void)
 
int CDECL rand_s (unsigned int *pval)
 
void CDECL _sleep (__msvcrt_ulong timeout)
 
void *CDECL _lfind (const void *match, const void *start, unsigned int *array_size, unsigned int elem_size, int(CDECL *cf)(const void *, const void *))
 
void *CDECL _lfind_s (const void *match, const void *start, unsigned int *array_size, unsigned int elem_size, int(CDECL *cf)(void *, const void *, const void *), void *context)
 
void *CDECL _lsearch (const void *match, void *start, unsigned int *array_size, unsigned int elem_size, int(CDECL *cf)(const void *, const void *))
 
void *CDECL bsearch_s (const void *key, const void *base, size_t nmemb, size_t size, int(__cdecl *compare)(void *, const void *, const void *), void *ctx)
 
static int CDECL compare_wrapper (void *ctx, const void *e1, const void *e2)
 
void *CDECL bsearch (const void *key, const void *base, size_t nmemb, size_t size, int(__cdecl *compar)(const void *, const void *))
 
static void swap (char *l, char *r, size_t size)
 
static void small_sort (void *base, size_t nmemb, size_t size, int(CDECL *compar)(void *, const void *, const void *), void *context)
 
static void quick_sort (void *base, size_t nmemb, size_t size, int(CDECL *compar)(void *, const void *, const void *), void *context)
 
void CDECL qsort_s (void *base, size_t nmemb, size_t size, int(CDECL *compar)(void *, const void *, const void *), void *context)
 
void CDECL qsort (void *base, size_t nmemb, size_t size, int(CDECL *compar)(const void *, const void *))
 
unsigned int CDECL _get_output_format (void)
 
unsigned int CDECL _set_output_format (unsigned int new_output_format)
 
int CDECL _resetstkoflw (void)
 

Variables

static unsigned int output_format
 

Macro Definition Documentation

◆ X

#define X (   i)    ((char*)base+size*(i))

Function Documentation

◆ _beep()

void CDECL _beep ( unsigned int  freq,
unsigned int  duration 
)

Definition at line 41 of file misc.c.

42{
43 TRACE(":Freq %d, Duration %d\n",freq,duration);
44 Beep(freq, duration);
45}
BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration)
Definition: deviceio.c:48
#define TRACE(s)
Definition: solgame.cpp:4

◆ _get_output_format()

unsigned int CDECL _get_output_format ( void  )

Definition at line 401 of file misc.c.

402{
403 return output_format;
404}
static unsigned int output_format
Definition: misc.c:32

◆ _lfind()

void *CDECL _lfind ( const void match,
const void start,
unsigned int array_size,
unsigned int  elem_size,
int(CDECL *cf)(const void *, const void *)   
)

Definition at line 94 of file misc.c.

97{
98 unsigned int size = *array_size;
99 if (size)
100 do
101 {
102 if (cf(match, start) == 0)
103 return (void *)start; /* found */
104 start = (const char *)start + elem_size;
105 } while (--size);
106 return NULL;
107}
#define NULL
Definition: types.h:112
GLuint start
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
static UINT array_size
Definition: msctf.cpp:39
Definition: match.c:28

◆ _lfind_s()

void *CDECL _lfind_s ( const void match,
const void start,
unsigned int array_size,
unsigned int  elem_size,
int(CDECL *cf)(void *, const void *, const void *)  ,
void context 
)

Definition at line 112 of file misc.c.

116{
117 unsigned int size;
118 if (!MSVCRT_CHECK_PMT(match != NULL)) return NULL;
119 if (!MSVCRT_CHECK_PMT(array_size != NULL)) return NULL;
120 if (!MSVCRT_CHECK_PMT(start != NULL || *array_size == 0)) return NULL;
121 if (!MSVCRT_CHECK_PMT(cf != NULL)) return NULL;
122 if (!MSVCRT_CHECK_PMT(elem_size != 0)) return NULL;
123
124 size = *array_size;
125 if (size)
126 do
127 {
128 if (cf(context, match, start) == 0)
129 return (void *)start; /* found */
130 start = (const char *)start + elem_size;
131 } while (--size);
132 return NULL;
133}
#define MSVCRT_CHECK_PMT(x)
Definition: msvcrt.h:378
Definition: http.c:7252

◆ _lsearch()

void *CDECL _lsearch ( const void match,
void start,
unsigned int array_size,
unsigned int  elem_size,
int(CDECL *cf)(const void *, const void *)   
)

Definition at line 138 of file misc.c.

141{
142 unsigned int size = *array_size;
143 if (size)
144 do
145 {
146 if (cf(match, start) == 0)
147 return start; /* found */
148 start = (char*)start + elem_size;
149 } while (--size);
150
151 /* not found, add to end */
152 memcpy(start, match, elem_size);
153 array_size[0]++;
154 return start;
155}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

◆ _resetstkoflw()

int CDECL _resetstkoflw ( void  )

Definition at line 423 of file misc.c.

424{
425 int stack_addr;
426 DWORD oldprot;
427
428 /* causes stack fault that updates NtCurrentTeb()->Tib.StackLimit */
429 return VirtualProtect(&stack_addr, 1, PAGE_GUARD|PAGE_READWRITE, &oldprot);
430}
unsigned long DWORD
Definition: ntddk_ex.h:95
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define PAGE_GUARD
Definition: nt_native.h:1313
BOOL NTAPI VirtualProtect(IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD flNewProtect, OUT PDWORD lpflOldProtect)
Definition: virtmem.c:135

◆ _set_output_format()

unsigned int CDECL _set_output_format ( unsigned int  new_output_format)

Definition at line 409 of file misc.c.

410{
411 unsigned int ret = output_format;
412
413 if(!MSVCRT_CHECK_PMT(new_output_format==0 || new_output_format==_TWO_DIGIT_EXPONENT))
414 return ret;
415
416 output_format = new_output_format;
417 return ret;
418}
#define _TWO_DIGIT_EXPONENT
Definition: stdio.h:68
return ret
Definition: mutex.c:146

◆ _sleep()

void CDECL _sleep ( __msvcrt_ulong  timeout)

Definition at line 85 of file misc.c.

86{
87 TRACE("_sleep for %ld milliseconds\n",timeout);
89}
Definition: dhcpd.h:248
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790

◆ bsearch()

void *CDECL bsearch ( const void key,
const void base,
size_t  nmemb,
size_t  size,
int(__cdecl *compar)(const void *, const void *)   
)

Definition at line 192 of file misc.c.

194{
195 return bsearch_s(key, base, nmemb, size, compare_wrapper, compar);
196}
void *CDECL bsearch_s(const void *key, const void *base, size_t nmemb, size_t size, int(__cdecl *compare)(void *, const void *, const void *), void *ctx)
Definition: misc.c:160
static int CDECL compare_wrapper(void *ctx, const void *e1, const void *e2)
Definition: misc.c:183
Definition: copy.c:22

◆ bsearch_s()

void *CDECL bsearch_s ( const void key,
const void base,
size_t  nmemb,
size_t  size,
int(__cdecl *compare)(void *, const void *, const void *)  ,
void ctx 
)

Definition at line 160 of file misc.c.

162{
163 ssize_t min = 0;
164 ssize_t max = nmemb - 1;
165
166 if (!MSVCRT_CHECK_PMT(size != 0)) return NULL;
167 if (!MSVCRT_CHECK_PMT(compare != NULL)) return NULL;
168
169 while (min <= max)
170 {
171 ssize_t cursor = min + (max - min) / 2;
172 int ret = compare(ctx, key,(const char *)base+(cursor*size));
173 if (!ret)
174 return (char*)base+(cursor*size);
175 if (ret < 0)
176 max = cursor - 1;
177 else
178 min = cursor + 1;
179 }
180 return NULL;
181}
#define compare
const char cursor[]
Definition: icontest.c:13
#define min(a, b)
Definition: monoChain.cc:55
int ssize_t
Definition: rosdhcp.h:50
Definition: bug.cpp:8
#define max(a, b)
Definition: svc.c:63

Referenced by bsearch().

◆ compare_wrapper()

static int CDECL compare_wrapper ( void ctx,
const void e1,
const void e2 
)
static

Definition at line 183 of file misc.c.

184{
185 int (__cdecl *compare)(const void *, const void *) = ctx;
186 return compare(e1, e2);
187}
#define __cdecl
Definition: corecrt.h:121
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

Referenced by bsearch(), and qsort().

◆ qsort()

void CDECL qsort ( void base,
size_t  nmemb,
size_t  size,
int(CDECL *compar)(const void *, const void *)   
)

Definition at line 392 of file misc.c.

394{
395 qsort_s(base, nmemb, size, compare_wrapper, compar);
396}
void CDECL qsort_s(void *base, size_t nmemb, size_t size, int(CDECL *compar)(void *, const void *, const void *), void *context)
Definition: misc.c:374

◆ qsort_s()

void CDECL qsort_s ( void base,
size_t  nmemb,
size_t  size,
int(CDECL *compar)(void *, const void *, const void *)  ,
void context 
)

Definition at line 374 of file misc.c.

376{
377 const size_t total_size = nmemb*size;
378
379 if (!MSVCRT_CHECK_PMT(base != NULL || (base == NULL && nmemb == 0))) return;
380 if (!MSVCRT_CHECK_PMT(size > 0)) return;
381 if (!MSVCRT_CHECK_PMT(compar != NULL)) return;
382 if (total_size / size != nmemb) return;
383
384 if (nmemb < 2) return;
385
386 quick_sort(base, nmemb, size, compar, context);
387}
static void quick_sort(void *base, size_t nmemb, size_t size, int(CDECL *compar)(void *, const void *, const void *), void *context)
Definition: misc.c:291

Referenced by qsort().

◆ quick_sort()

static void quick_sort ( void base,
size_t  nmemb,
size_t  size,
int(CDECL *compar)(void *, const void *, const void *)  ,
void context 
)
static

Definition at line 291 of file misc.c.

293{
294 size_t stack_lo[8*sizeof(size_t)], stack_hi[8*sizeof(size_t)];
295 size_t beg, end, lo, hi, med;
296 int stack_pos;
297
298 stack_pos = 0;
299 stack_lo[stack_pos] = 0;
300 stack_hi[stack_pos] = nmemb-1;
301
302#define X(i) ((char*)base+size*(i))
303 while(stack_pos >= 0) {
304 beg = stack_lo[stack_pos];
305 end = stack_hi[stack_pos--];
306
307 if(end-beg < 8) {
308 small_sort(X(beg), end-beg+1, size, compar, context);
309 continue;
310 }
311
312 lo = beg;
313 hi = end;
314 med = lo + (hi-lo+1)/2;
315 if(compar(context, X(lo), X(med)) > 0)
316 swap(X(lo), X(med), size);
317 if(compar(context, X(lo), X(hi)) > 0)
318 swap(X(lo), X(hi), size);
319 if(compar(context, X(med), X(hi)) > 0)
320 swap(X(med), X(hi), size);
321
322 lo++;
323 hi--;
324 while(1) {
325 while(lo <= hi) {
326 if(lo!=med && compar(context, X(lo), X(med))>0)
327 break;
328 lo++;
329 }
330
331 while(med != hi) {
332 if(compar(context, X(hi), X(med)) <= 0)
333 break;
334 hi--;
335 }
336
337 if(hi < lo)
338 break;
339
340 swap(X(lo), X(hi), size);
341 if(hi == med)
342 med = lo;
343 lo++;
344 hi--;
345 }
346
347 while(hi > beg) {
348 if(hi!=med && compar(context, X(hi), X(med))!=0)
349 break;
350 hi--;
351 }
352
353 if(hi-beg >= end-lo) {
354 stack_lo[++stack_pos] = beg;
355 stack_hi[stack_pos] = hi;
356 stack_lo[++stack_pos] = lo;
357 stack_hi[stack_pos] = end;
358 }else {
359 stack_lo[++stack_pos] = lo;
360 stack_hi[stack_pos] = end;
361 stack_lo[++stack_pos] = beg;
362 stack_hi[stack_pos] = hi;
363 }
364 }
365#undef X
366}
unsigned int size_t
Definition: corecrt.h:203
#define X(i)
static void small_sort(void *base, size_t nmemb, size_t size, int(CDECL *compar)(void *, const void *, const void *), void *context)
Definition: misc.c:272
GLuint GLuint end
Definition: gl.h:1545
#define swap(a, b)
Definition: qsort.c:63

Referenced by qsort_s(), and test_qsort_s().

◆ rand()

int CDECL rand ( void  )

Definition at line 59 of file misc.c.

60{
62
63 /* this is the algorithm used by MSVC, according to
64 * http://en.wikipedia.org/wiki/List_of_pseudorandom_number_generators */
65 data->random_seed = data->random_seed * 214013 + 2531011;
66 return (data->random_seed >> 16) & RAND_MAX;
67}
#define RAND_MAX
Definition: stdlib.h:34
thread_data_t *CDECL msvcrt_get_thread_data(void)
Definition: thread.c:45
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

Referenced by test_qsort_s(), and test_rand_s().

◆ rand_s()

int CDECL rand_s ( unsigned int pval)

Definition at line 72 of file misc.c.

73{
74 if (!pval || !RtlGenRandom(pval, sizeof(*pval)))
75 {
76 *_errno() = EINVAL;
77 return EINVAL;
78 }
79 return 0;
80}
int *CDECL _errno(void)
Definition: errno.c:215
#define EINVAL
Definition: errno.h:44
#define RtlGenRandom
Definition: ntsecapi.h:691

◆ small_sort()

static void small_sort ( void base,
size_t  nmemb,
size_t  size,
int(CDECL *compar)(void *, const void *, const void *)  ,
void context 
)
static

Definition at line 272 of file misc.c.

274{
275 size_t e, i;
276 char *max, *p;
277
278 for(e=nmemb; e>1; e--) {
279 max = base;
280 for(i=1; i<e; i++) {
281 p = (char*)base + i*size;
282 if(compar(context, p, max) > 0)
283 max = p;
284 }
285
286 if(p != max)
287 swap(p, max, size);
288 }
289}
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define e
Definition: ke_i.h:82

Referenced by quick_sort(), and test_qsort_s().

◆ srand()

void CDECL srand ( unsigned int  seed)

Definition at line 50 of file misc.c.

51{
53 data->random_seed = seed;
54}

Referenced by test_qsort_s().

◆ swap()

static void swap ( char l,
char r,
size_t  size 
)
inlinestatic

Definition at line 261 of file misc.c.

262{
263 char tmp;
264
265 while(size--) {
266 tmp = *l;
267 *l++ = *r;
268 *r++ = tmp;
269 }
270}
r l[0]
Definition: byte_order.h:168
GLdouble GLdouble GLdouble r
Definition: gl.h:2055

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( msvcrt  )

Variable Documentation

◆ output_format

unsigned int output_format
static

Definition at line 32 of file misc.c.

Referenced by _get_output_format(), and _set_output_format().