PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
swapmem.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "srxfixup_internal.h"
12
13#if defined(__has_include)
14#if __has_include(<endian.h>)
15// NOLINTNEXTLINE(misc-include-cleaner)
16#include <endian.h>
17#if _BYTE_ORDER != _LITTLE_ENDIAN
18#define SWAPMEM_IS_NOT_BIG_ENDIAN
19#endif
20#endif
21#endif
22
23#ifdef SWAPMEM_IS_NOT_BIG_ENDIAN
24#include <stdint.h>
25#include <string.h>
26#endif
27
28void swapmemory(void *aaddr, const char *format, unsigned int times)
29{
30#ifdef SWAPMEM_IS_NOT_BIG_ENDIAN
31 unsigned int i;
32 size_t j;
33 void *aaddr_cur;
34 size_t format_len;
35
36 format_len = strlen(format);
37
38 aaddr_cur = aaddr;
39 for ( i = 0; i < times; i += 1 )
40 {
41 for ( j = 0; j < format_len; j += 1 )
42 {
43 switch ( format[j] )
44 {
45 case 'c':
46 aaddr_cur = (void *)(((uint8_t *)aaddr_cur) + 1);
47 break;
48 case 's':
49 *(uint16_t *)aaddr_cur = bswap16(*(uint16_t *)aaddr_cur);
50 aaddr_cur = (void *)(((uint8_t *)aaddr_cur) + 2);
51 break;
52 case 'l':
53 *(uint32_t *)aaddr_cur = bswap32(*(uint32_t *)aaddr_cur);
54 aaddr_cur = (void *)(((uint8_t *)aaddr_cur) + 4);
55 break;
56 default:
57 break;
58 }
59 }
60 }
61#else
62 (void)aaddr;
63 (void)format;
64 (void)times;
65#endif
66}