mac os x一个非常好的简单syscalllib

//ft_cat.s

%define MACSYSCALL(nb) 0x2000000 | nb
%define LEN     0x1000
%define STDOUT  1
%define STDERR  2
%define READ    3
%define WRITE   4

section .data
msg:
    .err_fd:    db "bad file descriptor", 0x0a
    .len:       equ $ - .err_fd

section .text
    global  _ft_cat
    extern  _ft_bzero

_ft_cat:
    push    rbp
    mov     rbp, rsp
    cmp     edi, 0
    jl      .err_fd
    sub     rsp, LEN

.loop_read:
    push    rdi
    lea     rsi, [rbp - LEN]
    mov     rdx, LEN
    mov     rax, MACSYSCALL(READ)
    syscall

    cmp     rax, 0
    jle     .ret

    mov     rdi, STDOUT
    lea     rsi, [rbp - LEN]
    mov     rdx, rax
    mov     rax, MACSYSCALL(WRITE)
    syscall

    lea     rdi, [rbp - LEN]
    mov     rsi, LEN
    call    _ft_bzero

    pop     rdi
    jmp     .loop_read

.err_fd:
    push    rdi
    mov     rdi, STDERR
    lea     rsi, [rel msg.err_fd]
    mov     rdx, msg.len
    mov     rax, MACSYSCALL(WRITE)
    syscall
    pop     rdi

.ret:
    leave
    ret

mac os x一个非常好的简单syscalllib

haidragondeMacBook-Air:libASM-master haidragon$ make
haidragondeMacBook-Air:libASM-master haidragon$ ls                         
Makefile    asm_lib.pdf includes    main.c      test.bin
README.md   auteur      libfts.a    srcs
haidragondeMacBook-Air:libASM-master haidragon$ ./test.bin 
===========> ft_memalloc() tests:
Hello
===========> ft_putchar() tests:
Hello!
===========> ft_putstr() tests:
Hello World!
===========> ft_putendl() tests:
Hello putendl
===========> ft_strncpy() tests:
it should be cut
haidragondeMacBook-Air:libASM-master haidragon$ make
haidragondeMacBook-Air:libASM-master haidragon$ ./test.bin 
===========> isalpha() tests:
'`' :   OK
'a' :   OK
'b' :   OK
'c' :   OK
'd' :   OK
'e' :   OK
'f' :   OK
'g' :   OK
'h' :   OK
'i' :   OK
'j' :   OK
'k' :   OK
'l' :   OK
'm' :   OK
'n' :   OK
'o' :   OK
'p' :   OK
'q' :   OK
'r' :   OK
's' :   OK
't' :   OK
'u' :   OK
'v' :   OK
'w' :   OK
'x' :   OK
'y' :   OK
'z' :   OK
'{' :   OK
'|' :   OK

'@' :   OK
'A' :   OK
'B' :   OK
'C' :   OK
'D' :   OK
'E' :   OK
'F' :   OK
'G' :   OK
'H' :   OK
'I' :   OK
'J' :   OK
'K' :   OK
'L' :   OK
'M' :   OK
'N' :   OK
'O' :   OK
'P' :   OK
'Q' :   OK
'R' :   OK
'S' :   OK
'T' :   OK
'U' :   OK
'V' :   OK
'W' :   OK
'X' :   OK
'Y' :   OK
'Z' :   OK
'[' :   OK
'\' :   OK

===========> isdigit() tests:
'/' :   OK
'0' :   OK
'1' :   OK
'2' :   OK
'3' :   OK
'4' :   OK
'5' :   OK
'6' :   OK
'7' :   OK
'8' :   OK
'9' :   OK
':' :   OK

===========> isalnum() tests:
'/' :   OK
'0' :   OK
'1' :   OK
'2' :   OK
'3' :   OK
'4' :   OK
'5' :   OK
'6' :   OK
'7' :   OK
'8' :   OK
'9' :   OK
':' :   OK

'@' :   OK
'A' :   OK
'B' :   OK
'C' :   OK
'D' :   OK
'E' :   OK
'F' :   OK
'G' :   OK
'H' :   OK
'I' :   OK
'J' :   OK
'K' :   OK
'L' :   OK
'M' :   OK
'N' :   OK
'O' :   OK
'P' :   OK
'Q' :   OK
'R' :   OK
'S' :   OK
'T' :   OK
'U' :   OK
'V' :   OK
'W' :   OK
'X' :   OK
'Y' :   OK
'Z' :   OK
'[' :   OK
'\' :   OK

'`' :   OK
'a' :   OK
'b' :   OK
'c' :   OK
'd' :   OK
'e' :   OK
'f' :   OK
'g' :   OK
'h' :   OK
'i' :   OK
'j' :   OK
'k' :   OK
'l' :   OK
'm' :   OK
'n' :   OK
'o' :   OK
'p' :   OK
'q' :   OK
'r' :   OK
's' :   OK
't' :   OK
'u' :   OK
'v' :   OK
'w' :   OK
'x' :   OK
'y' :   OK
'z' :   OK
'{' :   OK
'|' :   OK

===========> isascii() tests:
'?' :   OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
' : OK
'   ' : OK
'
' : OK
'
 ' :    OK
'
 ' :    OK
' : OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
' : OK
'' :    OK
'' :    OK
'' :    OK
'' :    OK
' ' :   OK
'!' :   OK
'"' :   OK
'#' :   OK
'$' :   OK
'%' :   OK
'&' :   OK
''' :   OK
'(' :   OK
')' :   OK
'*' :   OK
'+' :   OK
',' :   OK
'-' :   OK
'.' :   OK
'/' :   OK
'0' :   OK
'1' :   OK
'2' :   OK
'3' :   OK
'4' :   OK
'5' :   OK
'6' :   OK
'7' :   OK
'8' :   OK
'9' :   OK
':' :   OK
';' :   OK
'<' :   OK
'=' :   OK
'>' :   OK
'?' :   OK
'@' :   OK
'A' :   OK
'B' :   OK
'C' :   OK
'D' :   OK
'E' :   OK
'F' :   OK
'G' :   OK
'H' :   OK
'I' :   OK
'J' :   OK
'K' :   OK
'L' :   OK
'M' :   OK
'N' :   OK
'O' :   OK
'P' :   OK
'Q' :   OK
'R' :   OK
'S' :   OK
'T' :   OK
'U' :   OK
'V' :   OK
'W' :   OK
'X' :   OK
'Y' :   OK
'Z' :   OK
'[' :   OK
'\' :   OK
']' :   OK
'^' :   OK
'_' :   OK
'`' :   OK
'a' :   OK
'b' :   OK
'c' :   OK
'd' :   OK
'e' :   OK
'f' :   OK
'g' :   OK
'h' :   OK
'i' :   OK
'j' :   OK
'k' :   OK
'l' :   OK
'm' :   OK
'n' :   OK
'o' :   OK
'p' :   OK
'q' :   OK
'r' :   OK
's' :   OK
't' :   OK
'u' :   OK
'v' :   OK
'w' :   OK
'x' :   OK
'y' :   OK
'z' :   OK
'{' :   OK
'|' :   OK
'}' :   OK
'~' :   OK
'' :    OK
'?' :   OK

===========> isprint() tests:
'' :    OK
' ' :   OK
'!' :   OK
'"' :   OK
'#' :   OK
'$' :   OK
'%' :   OK
'&' :   OK
''' :   OK
'(' :   OK
')' :   OK
'*' :   OK
'+' :   OK
',' :   OK
'-' :   OK
'.' :   OK
'/' :   OK
'0' :   OK
'1' :   OK
'2' :   OK
'3' :   OK
'4' :   OK
'5' :   OK
'6' :   OK
'7' :   OK
'8' :   OK
'9' :   OK
':' :   OK
';' :   OK
'<' :   OK
'=' :   OK
'>' :   OK
'?' :   OK
'@' :   OK
'A' :   OK
'B' :   OK
'C' :   OK
'D' :   OK
'E' :   OK
'F' :   OK
'G' :   OK
'H' :   OK
'I' :   OK
'J' :   OK
'K' :   OK
'L' :   OK
'M' :   OK
'N' :   OK
'O' :   OK
'P' :   OK
'Q' :   OK
'R' :   OK
'S' :   OK
'T' :   OK
'U' :   OK
'V' :   OK
'W' :   OK
'X' :   OK
'Y' :   OK
'Z' :   OK
'[' :   OK
'\' :   OK
']' :   OK
'^' :   OK
'_' :   OK
'`' :   OK
'a' :   OK
'b' :   OK
'c' :   OK
'd' :   OK
'e' :   OK
'f' :   OK
'g' :   OK
'h' :   OK
'i' :   OK
'j' :   OK
'k' :   OK
'l' :   OK
'm' :   OK
'n' :   OK
'o' :   OK
'p' :   OK
'q' :   OK
'r' :   OK
's' :   OK
't' :   OK
'u' :   OK
'v' :   OK
'w' :   OK
'x' :   OK
'y' :   OK
'z' :   OK
'{' :   OK
'|' :   OK
'}' :   OK
'~' :   OK
'' :    OK

===========> isupper() tests:
'@' :   OK
'A' :   OK
'B' :   OK
'C' :   OK
'D' :   OK
'E' :   OK
'F' :   OK
'G' :   OK
'H' :   OK
'I' :   OK
'J' :   OK
'K' :   OK
'L' :   OK
'M' :   OK
'N' :   OK
'O' :   OK
'P' :   OK
'Q' :   OK
'R' :   OK
'S' :   OK
'T' :   OK
'U' :   OK
'V' :   OK
'W' :   OK
'X' :   OK
'Y' :   OK
'Z' :   OK
'[' :   OK
'\' :   OK

===========> islower() tests:
'`' :   OK
'a' :   OK
'b' :   OK
'c' :   OK
'd' :   OK
'e' :   OK
'f' :   OK
'g' :   OK
'h' :   OK
'i' :   OK
'j' :   OK
'k' :   OK
'l' :   OK
'm' :   OK
'n' :   OK
'o' :   OK
'p' :   OK
'q' :   OK
'r' :   OK
's' :   OK
't' :   OK
'u' :   OK
'v' :   OK
'w' :   OK
'x' :   OK
'y' :   OK
'z' :   OK
'{' :   OK
'|' :   OK

===========> bzero() tests:
before:     0x61    0x61    0x61    0x61    0x61    0x61    0x61    0x61    0x61    0x61    0x60x61 0x61    0x61    0x61    
after: [15] 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x00x0  0x0 0x0 0x0 

before:     0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x60x62 0x62    0x62    0x62    
after: [0]  0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x62    0x60x62 0x62    0x62    0x62    
NULL str:   OK
size = 0:   OK
===========> strcat() tests:
'Hello':    OK
'Hello World!': OK

===========> puts() tests:
OK

===========> strlen() tests:
test []:    OK
test [toto]:    OK
test [Hello World!]:    OK

===========> memset() tests:
return value:   OK
inserted value: OK
return value:   OK
inserted value: OK

===========> memcpy() tests:
test copy:  OK
test return:    OK

===========> strdup() tests:
[Hello] :   OK
[World] :   OK
[] :    OK

opening 'main.c':   3
OK
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include "libasm.h"

void    test_isupper(void)
{

    char c;

    printf("===========> isupper() tests:\n");
    c = 'A';
    printf("\treal:\t'%c' -> %d\n", c, ft_isupper(c));
    printf("\tmine:\t'%c' -> %d\n", c, isupper(c));
    c -= 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isupper(c));
    printf("\tmine:\t'%c' -> %d\n", c, isupper(c));
    printf("\n");

    c = 'Z';
    printf("\treal:\t'%c' -> %d\n", c, ft_isupper(c));
    printf("\tmine:\t'%c' -> %d\n", c, isupper(c));
    c += 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isupper(c));
    printf("\tmine:\t'%c' -> %d\n", c, isupper(c));
    printf("\n");
}

void    test_isalpha(void)
{
    char c;

    printf("===========> isalpha() tests:\n");
    c = 'A';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalpha(c));\
    c -= 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%cF' -> %d\n", c, isalpha(c));
    printf("\n");

    c = 'Z';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalpha(c));
    c += 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalpha(c));
    printf("\n");

    c = 'a';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalpha(c));
    c -= 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalpha(c));
    printf("\n");

    c = 'z';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalpha(c));
    c += 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalpha(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalpha(c));
    printf("\n");
}

void    test_isalnum(void)
{
    char c;

    printf("===========> isalnum() tests:\n");
    c = '0';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));

    c -= 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    printf("\n");

    c = '9';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    c += 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    printf("\n");

    c = 'A';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    c -= 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    printf("\n");

    c = 'Z';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    c += 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    printf("\n");

    c = 'a';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    c -= 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    printf("\n");

    c = 'z';
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    c += 1;
    printf("\treal:\t'%c' -> %d\n", c, ft_isalnum(c));
    printf("\tmine:\t'%c' -> %d\n", c, isalnum(c));
    printf("\n");
}

void    test_is(char *name, int(*real)(int c), int(*mine)(int c), char begin, int limit)
{

    if (name != NULL)
        printf("===========> %s() tests:\n", name);
    char c = begin;
    for (int i = 0 ; i < limit ; i++)
    {
        printf("'%c' :\t", c);
        if (real(c) == mine(c))
            printf("OK\n");
        else
        {
            printf("NOPE\n");
            return ;
        }
        c += 1;
    }
    printf("\n");
}

void    full_is(void)
{
    /* isalpha() */
    // uppercase
    test_is("isalpha", isalpha, ft_isalpha, 'a' - 1, 29);
    // lowercase
    test_is(NULL, isalpha, ft_isalpha, 'A' - 1, 29);

    /* isdigit() */
    test_is("isdigit", isdigit, ft_isdigit, '0' - 1, 12);

    /* isalnum() */
    // digit
    test_is("isalnum", isalnum, ft_isalnum, '0' - 1, 12);
    // uppercase
    test_is(NULL, isalnum, ft_isalnum, 'A' - 1, 29);
    // lowercase
    test_is(NULL, isalnum, ft_isalnum, 'a' - 1, 29);

    /* isascii() */
    test_is("isascii", isascii, ft_isascii, -1, 130);

    /* isprint() */
    test_is("isprint", isprint, ft_isprint, 31, 97);

    /* isupper() */
    test_is("isupper", isupper, ft_isupper, 'A' - 1, 29);

    /* islower() */
    test_is("islower", islower, ft_islower, 'a' - 1, 29);
}

void test_bzero(void)
{
    int size = 0xf;
    char c[size];

    printf("===========> bzero() tests:\n");
    ft_strcpy(c, "aaaaaaaaaaaaaaaa");
    printf("before:\t\t");
    for (int i = 0 ; i < size ; i++)
        printf("0x%x\t", c[i]);
    printf("\n");
    ft_bzero(c, size);
    printf("after: [%d]\t", size);
    for (int i = 0 ; i < size; i++)
        printf("0x%x\t", c[i]);
    printf("\n\n");

    ft_strcpy(c, "bbbbbbbbbbbbbbbb");
    printf("before:\t\t");
    for (int i = 0 ; i < size ; i++)
        printf("0x%x\t", c[i]);
    printf("\n");
    ft_bzero(c, 0x0);
    printf("after: [%d]\t", 0x0);
    for (int i = 0 ; i < size; i++)
        printf("0x%x\t", c[i]);
    printf("\n");

    printf("NULL str:\t");
    ft_bzero(NULL, 5);
    printf("OK\n");

    printf("size = 0:\t");
    ft_bzero(NULL, 0);
    printf("OK\n");
}

void    test_strcat(void)
{
    char    mine[64];

    printf("===========> strcat() tests:\n");
    ft_bzero(mine, 64);

    ft_strcat(mine, "Hello");
    printf("'Hello':\t");
    if (strcmp(mine, "Hello") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");

    ft_strcat(mine, " World!");
    printf("'Hello World!':\t");
    if (strcmp(mine, "Hello World!") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");
    printf("\n");
}

void    test_puts()
{
    printf("===========> puts() tests:\n");
    int     ret;
    int     puts_ret1;
    int     puts_ret2;
    int     out;
    int     p[2];
    char    buf[10000];

    out = dup(1);
    pipe(p);
    dup2(p[1], 1);
    puts_ret1 = ft_puts("aaa");
    puts_ret2 = ft_puts(NULL);
    dup2(out, 1);
    ret = read(p[0], buf, 10000);
    buf[ret] = 0;
    close(p[0]);
    close(p[1]);
    close(out);
    if (strcmp(buf, "aaa\n(null)\n") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");
    printf("\n");
}

void    test_strlen(void)
{
    printf("===========> strlen() tests:\n");
    printf("test []:\t");
    if (strlen("") != ft_strlen(""))
        printf("NOPE\n");
    else
        printf("OK\n");

    printf("test [toto]:\t");
    if (strlen("toto") != ft_strlen("toto"))
        printf("NOPE\n");
    else
        printf("OK\n");

    printf("test [Hello World!]:\t");
    if (strlen("Hello World!") != ft_strlen("Hello World!"))
        printf("NOPE\n");
    else
        printf("OK\n");
    printf("\n");
}

void    test_memset(void)
{
    char    real[64] = {0};

    printf("===========> memset() tests:\n");
    printf("return value:\t");
    if (memset(real, 'a', 16) != ft_memset(real, 'a', 16))
        printf("NOPE\n");
    else
        printf("OK\n");

    printf("inserted value:\t");
    if (strcmp(real, "aaaaaaaaaaaaaaaa") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");

    printf("return value:\t");
    if (memset(real, 'a', 63) != ft_memset(real, 'a', 63))
        printf("NOPE\n");
    else
        printf("OK\n");

    printf("inserted value:\t");
    if (strcmp(real, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");
    printf("\n");
}

void    test_memcpy(void)
{
    printf("===========> memcpy() tests:\n");
    char    b1[100], b2[100];

    memset(b1, '!', 100);
    memset(b2, '?', 100);
    printf("test copy:\t");
    ft_memcpy(b1, b2, 100);
    if (memcmp(b1, b2, 100) != 0)
        printf("NOPE\n");
    else
        printf("OK\n");

    printf("test return:\t");
    if (ft_memcpy(b1, b2, 0) != b1)
        printf("NOPE\n");
    else
        printf("OK\n");
    printf("\n");
}

void    test_strdup(void)
{
    printf("===========> strdup() tests:\n");
    char *ptr;

    printf("[Hello] :\t");
    ptr = strdup("Hello");
    if (strcmp(ptr, "Hello") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");
    free(ptr);

    printf("[World] :\t");
    ptr = strdup("World");
    if (strcmp(ptr, "World") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");

    free(ptr);
    printf("[] :\t");
    ptr = strdup("");
    if (strcmp(ptr, "") != 0)
        printf("NOPE\n");
    else
        printf("OK\n");
    printf("\n");
}

void    test_cat(void)
{
    int fd;

    printf("opening 'main.c':\t");
    fd = open("./main.c", O_RDONLY);
    printf("%d\n", fd);
    if (fd == -1)
    {
        printf("NOPE\n");
        return ;
    }
    else
        printf("OK\n");
    ft_cat(fd);
    close(fd);
    ft_cat(-1);
}

void    test_memalloc(void)
{
    void    *ptr = NULL;

    printf("===========> ft_memalloc() tests:\n");
    ptr = ft_memalloc(10);
    if (ptr == NULL)
    {
        printf("malloc failed\n");
        return ;
    }
    memcpy(ptr, "Hello!", 5);
    printf("%s\n", ptr);
    free(ptr);
}

void    test_putchar(void)
{
    printf("===========> ft_putchar() tests:\n");
    ft_putchar('H');
    ft_putchar('e');
    ft_putchar('l');
    ft_putchar('l');
    ft_putchar('o');
    ft_putchar('!');
    ft_putchar('\n');
}

void    test_putstr(void)
{
    printf("===========> ft_putstr() tests:\n");
    ft_putstr("Hello World!\n");
}

void    test_putendl(void)
{
    printf("===========> ft_putendl() tests:\n");
    ft_putendl("Hello putendl");
}

void    test_strncpy(void)
{
    printf("===========> ft_strncpy() tests:\n");
    char    *ptr = NULL;
    size_t  size = 10;
    char    test[] = "it should be cut in the middle of the string";

    ptr = ft_memalloc(size);
    if (!ptr)
        return ;
    strncpy(ptr, test, 16);
    printf("%s\n", ptr);
    free(ptr);
}

void    first_part(void)
{
    full_is();
    test_bzero();
    test_strcat();
    test_puts();
}

void    second_part(void)
{
    test_strlen();
    test_memset();
    test_memcpy();
    test_strdup();
}

void    third_part(void)
{
    test_cat();
}

void    bonus_part(void)
{
    test_memalloc();
    test_putchar();
    test_putstr();
    test_putendl();
    test_strncpy();
}

int main(void)
{
    first_part();
    second_part();
    third_part();
    bonus_part();
    return (0);
}
bad file descriptor
===========> ft_memalloc() tests:
Hello
===========> ft_putchar() tests:
Hello!
===========> ft_putstr() tests:
Hello World!
===========> ft_putendl() tests:
Hello putendl
===========> ft_strncpy() tests:
it should be cut
haidragondeMacBook-Air:libASM-master haidragon$ 

https://github.com/haidragon/libASM
其它:
https://github.com/haidragon/libftasm
https://github.com/haidragon/iBootRE/tree/master/xnu/syscalls

猜你喜欢

转载自blog.51cto.com/haidragon/2416830