- 1
- 2
#define add(x, y) &((void*)x)[y];
#define mul(x, y) (sizeof (char[x][y]))
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+6
#define add(x, y) &((void*)x)[y];
#define mul(x, y) (sizeof (char[x][y]))
из свитера
+3
#include <stdio.h>
#include <string.h>
#include "s_gets.h"
#define SIZE 30
void revers(char *);
int main(){
char str[SIZE];
s_gets(str, SIZE);
revers(str);
puts(str);
return 0;
}
void revers(char * str){
int size_ = strlen(str) - 1;
char tmp;
for(int i = size_; i >= 0; i--){
tmp = str[i];
str[i] = str[size_ - i];
str[size_ - i] = tmp;
}
}
https://ru.stackoverflow.com/questions/1173617/Изменения-строки-в-функции
> Собственно задание заключается в написании функции, которая заменяет содержимое указанной строки этой же строкой, но с обратным порядком следования символов. Почему строка не переворачивается?
Какой багор )))
+1
/// Checks if the token is number or not
bool is_number(char* test_val)
{
const char* ROW = "0123456789\0";
for (int i = 0; i < strlen(test_val); i++) {
for (int j = 0; j < strlen(ROW); j++) {
if (test_val[i] == ROW[j]) {
goto next;
}
}
return false;
next:
}
return true;
}
Попытка проверить строку на число в Си.
+3
https://habr.com/ru/company/ruvds/blog/516266/
https://github.com/asz/icmpshell/blob/main/main.c
+1
#include <stdio.h>
#include <stdlib.h>
#define SPLICE(a,b) SPLICE_1(a,b)
#define SPLICE_1(a,b) SPLICE_2(a,b)
#define SPLICE_2(a,b) a##b
#define PP_ARG_N( \
_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, N, ...) N
/* Note 63 is removed */
#define PP_RSEQ_N() \
62, 61, 60, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
/* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
#define PP_NARG(...) PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
#define PRINT_1(a1) \
printf(a1);
#define PRINT_2(a1, b1) \
printf(a1, b1);
#define PRINT_3(a1, b1, a2) \
PRINT_2(a1, b1); PRINT_1(a2)
#define PRINT_4(a1, b1, a2, b2) \
PRINT_2(a1, b1); PRINT_2(a2, b2);
#define PRINT_5(a1, b1, a2, b2, a3) \
PRINT_4(a1, b1, a2, b2); PRINT_1(a3);
#define PRINT_6(a1, b1, a2, b2, a3, b3) \
PRINT_4(a1, b1, a2, b2); PRINT_2(a3, b3)
#define PRINT_7(a1, b1, a2, b2, a3, b3, a4) \
PRINT_6(a1, b1, a2, b2, a3, b3); PRINT_1(a4)
#define PRINT_8(a1, b1, a2, b2, a3, b3, a4, b4) \
PRINT_6(a1, b1, a2, b2, a3, b3); PRINT_2(a4, b4);
//..... дальше лень ...
#define PRINTS_(N, ...) \
SPLICE(PRINT_, N)(__VA_ARGS__)
#define PRINTS(...) \
PRINTS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
int main(void)
{
PRINTS("10 = %d", 10, "; 3 + 3 = %d", 3+3, "\n" );
return EXIT_SUCCESS;
}
Имитация крестопарашного cout через препроцессор
https://wandbox.org/permlink/px4DCDSCGfUlbcFL
0
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdint.h>
#define GEN_NAME(type) struct myvec_ ## type
#define MK_VEC_TYPE(type) GEN_NAME(type) {size_t sz; type arr[];};
#define MK_VEC_NEW(type) \
GEN_NAME(type) *myvec_new_ ## type (size_t num) \
{ \
struct myvec_ ## type *tmp = malloc(sizeof(type) * num); \
if (tmp == NULL) \
{ \
return NULL; \
} \
tmp->sz = num; \
return tmp; \
}
#define MK_VEC_DELETE(type) \
void myvec_delete_ ## type (GEN_NAME(type) *v) \
{ \
free(v); \
}
#define MK_VEC_GET(type) \
type myvec_get_ ## type (GEN_NAME(type) *v, size_t pos) \
{ \
if(pos < v->sz) \
{ \
return v->arr[pos]; \
} \
else \
{ \
exit(-1); \
} \
}
// исключения - говно
#define MK_VEC_SET(type) \
void myvec_set_ ## type (GEN_NAME(type) *v, size_t pos, type val) \
{ \
if(pos < v->sz) \
{ \
v->arr[pos] = val; \
} \
else \
{ \
exit(-1); \
} \
}
#define MK_VEC_GETSZ(type) \
size_t myvec_getsz_ ## type (GEN_NAME(type) v) \
{ \
return v.sz; \
}
#define MK_SHIT(type) \
MK_VEC_TYPE(type) \
MK_VEC_NEW(type) \
MK_VEC_DELETE(type) \
MK_VEC_GET(type) \
MK_VEC_GETSZ(type) \
MK_VEC_SET(type)
MK_SHIT(int)
MK_SHIT(float)
MK_SHIT(double)
#define test(a) _Generic(a, int : 1, GEN_NAME(int) : 2, default : 0)
#define MTD_C(val,mtd) _Generic( val,\
GEN_NAME(int): myvec_ ## mtd ##_int, \
GEN_NAME(float): myvec_ ## mtd ##_float, \
GEN_NAME(double): myvec_ ## mtd ##_double, \
default: 0) // хуй там!
#define GET(vec,pos) MTD_C(vec,get)(&vec,pos)
#define SET(vec, pos, val) MTD_C(vec,set)(&vec,pos,val)
#define GETSZ(vec) MTD_C(vec,getsz)(vec)
int main(void)
{
GEN_NAME(int) *vec1 = myvec_new_int(10);
SET(*vec1, 0, 123);
size_t size = GETSZ(*vec1);
printf("vector size is %zu\n", size);
printf("vector vec1[0] is %d\n", GET(*vec1,0));
return 0;
}
Какое ООП)))
+2
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
+ N T M a p M e m o r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Mmap() emulates the Unix method of the same name.
%
% The format of the NTMapMemory method is:
%
% MagickPrivate void *NTMapMemory(char *address,size_t length,int protection,
% int access,int file,MagickOffsetType offset)
%
*/
MagickPrivate void *NTMapMemory(char *address,size_t length,int protection,
int flags,int file,MagickOffsetType offset)
{
DWORD
access_mode,
high_length,
high_offset,
low_length,
low_offset,
protection_mode;
HANDLE
file_handle,
map_handle;
void
*map;
(void) address;
access_mode=0;
file_handle=INVALID_HANDLE_VALUE;
low_length=(DWORD) (length & 0xFFFFFFFFUL);
high_length=(DWORD) ((((MagickOffsetType) length) >> 32) & 0xFFFFFFFFUL);
map_handle=INVALID_HANDLE_VALUE;
map=(void *) NULL;
low_offset=(DWORD) (offset & 0xFFFFFFFFUL);
high_offset=(DWORD) ((offset >> 32) & 0xFFFFFFFFUL);
protection_mode=0;
if (protection & PROT_WRITE)
{
access_mode=FILE_MAP_WRITE;
if (!(flags & MAP_PRIVATE))
protection_mode=PAGE_READWRITE;
else
{
access_mode=FILE_MAP_COPY;
protection_mode=PAGE_WRITECOPY;
}
}
else
if (protection & PROT_READ)
{
access_mode=FILE_MAP_READ;
protection_mode=PAGE_READONLY;
}
if ((file == -1) && (flags & MAP_ANONYMOUS))
file_handle=INVALID_HANDLE_VALUE;
else
file_handle=(HANDLE) _get_osfhandle(file);
map_handle=CreateFileMapping(file_handle,0,protection_mode,high_length,
low_length,0);
if (map_handle)
{
map=(void *) MapViewOfFile(map_handle,access_mode,high_offset,low_offset,
length);
CloseHandle(map_handle);
}
if (map == (void *) NULL)
return((void *) ((char *) MAP_FAILED));
return((void *) ((char *) map));
}
Мумуляция «mmap» в «Винде». Это даже работает, если пофиксить две строчки (кто угадает, какие именно, тому ничего).
Отсюда:
https://github.com/ImageMagick/ImageMagick/blob/master/MagickCore/nt-base.c
+5
[code]main[]__attribute__((section(".text"))) = {0xC0FFC031,0x7401FF83,0xFFE7F706,0xC3F5EBCF};[/code]
Печатает факториал, от числа аргументов.
капча: t4ar
+2
/* meta */
typedef struct r_anal_meta_item_t {
ut64 from;
ut64 to;
ut64 size;
int type;
int subtype;
char *str;
int space;
} RAnalMetaItem;
typedef struct {
struct r_anal_t *anal;
int type;
int rad;
SdbForeachCallback cb;
void *user;
int count;
struct r_anal_type_function_t *fcn;
} RAnalMetaUserItem;
typedef struct r_anal_range_t {
ut64 from;
ut64 to;
int bits;
} RAnalRange;
#define R_ANAL_UNMASK_TYPE(x) (x&R_ANAL_VAR_TYPE_SIZE_MASK)
#define R_ANAL_UNMASK_SIGN(x) (((x& R_ANAL_VAR_TYPE_SIGN_MASK)>> R_ANAL_VAR_TYPE_SIGN_SHIFT)==R_ANAL_VAR_TYPE_UNSIGNED)?0:1
#define R_ANAL_GET_OFFSET(x,y,z) \
(x && x->binb.bin && x->binb.get_offset)? \
x->binb.get_offset (x->binb.bin, y, z): -1
enum {
R_ANAL_DATA_TYPE_NULL = 0,
R_ANAL_DATA_TYPE_UNKNOWN = 1,
R_ANAL_DATA_TYPE_STRING = 2,
R_ANAL_DATA_TYPE_WIDE_STRING = 3,
R_ANAL_DATA_TYPE_POINTER = 4,
R_ANAL_DATA_TYPE_NUMBER = 5,
R_ANAL_DATA_TYPE_INVALID = 6,
R_ANAL_DATA_TYPE_HEADER = 7,
R_ANAL_DATA_TYPE_SEQUENCE = 8,
R_ANAL_DATA_TYPE_PATTERN = 9,
};
// used from core/anal.c
#define R_ANAL_ADDR_TYPE_EXEC 1
#define R_ANAL_ADDR_TYPE_READ 1 << 1
#define R_ANAL_ADDR_TYPE_WRITE 1 << 2
#define R_ANAL_ADDR_TYPE_FLAG 1 << 3
#define R_ANAL_ADDR_TYPE_FUNC 1 << 4
#define R_ANAL_ADDR_TYPE_HEAP 1 << 5
#define R_ANAL_ADDR_TYPE_STACK 1 << 6
#define R_ANAL_ADDR_TYPE_REG 1 << 7
#define R_ANAL_ADDR_TYPE_PROGRAM 1 << 8
#define R_ANAL_ADDR_TYPE_LIBRARY 1 << 9
#define R_ANAL_ADDR_TYPE_ASCII 1 << 10
#define R_ANAL_ADDR_TYPE_SEQUENCE 1 << 11
#define R_ANAL_ARCHINFO_MIN_OP_SIZE 0
#define R_ANAL_ARCHINFO_MAX_OP_SIZE 1
#define R_ANAL_ARCHINFO_ALIGN 2
#define R_ANAL_ARCHINFO_DATA_ALIGN 4
Как нужно называть идентификаторы.
Источник:
https://github.com/radareorg/radare2/
+2
The count is coded into a one-octet number using the following
formula:
#define EXPBIAS 6
count = ((Int32)16 + (c & 15)) << ((c >> 4) + EXPBIAS);
The above formula is in C, where "Int32" is a type for a 32-bit
integer, and the variable "c" is the coded count, Octet 10.
Стандарт PHGP, набайтоёблено где не ждали. Казалось бы, в чем сложность отвести один октет на базу, а другой на сдвиг? Но сишнику проще даже не объяснить происходящее в стандарте, а просто кинуть код, типа, и так понятно же.
https://tools.ietf.org/html/rfc4880#page-12