디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

C언어 문자열 조작 함수 소스코드

☆단비☆갤로그로 이동합니다. 2024.06.30 11:27:34
조회 115 추천 0 댓글 5


/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */
/*
 * c-str.h
 * This file is part of Clair.
 *
 * Copyright (C) 2020-2024 Hodong Kim <hodong@nimfsoft.art>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
#ifndef __C_STR_H__
#define __C_STR_H__

#include "c-macros.h"
#include <stdbool.h>
#include <stddef.h>
#include <uchar.h>
#include <sys/types.h>

#ifdef __cplusplus
#define restrict __restrict__
#endif

C_BEGIN_DECLS

char     *c_strdup          (const char *str);
char     *c_strndup         (const char *str, size_t len);

char     *c_str_strip       (const char *str);
bool      c_str_chomp       (char *str);
bool      c_str_contains_c  (const char *str, char c);
bool      c_str_contains_s  (const char *str, char *s);
bool      c_str_equal       (const char *a,   const char *b);
/* terminated with nullptr */
char     *c_str_join        (const char *str, ...);
bool      c_str_starts_with (const char *str, const char *prefix);
bool      c_str_ends_with   (const char *str, const char *suffix);
char     *c_str_rep         (const char *s, const char *s1, const char *s2);
char    **c_str_split       (const char *str, char delim);
char     *c_str_sprintf     (const char * restrict format, ...);

char    **c_strv_dup        (char **strv);
void      c_strv_free       (char **strv);
unsigned  c_strv_len        (char **strv);
bool      c_strv_contains   (const char **strv, const char *str);
char*     c_strv_join       (const char** strv, const char* separator);

size_t    c_utf8_strlen     (const char *utf8);
size_t    c_utf8_strnlen    (const char *utf8, size_t max_n_bytes);
void      c_utf8_strncpy    (char * restrict dst,
                             const char * restrict src,
                             size_t n_chars);
char     *c_utf8_prev_char  (const char *utf8);
char     *c_utf8_next_char  (const char *utf8);
char     *c_utf8_offset_to_pointer (const char *utf8, size_t offset_in_chars);
char     *c_char32_to_utf8  (const char32_t *char32, int n_char32s);
int       c_char32_to_utf8_buf (char32_t* char32, char* buf, int n_char32s);
char32_t* c_utf8_to_char32  (const char* utf8);
int       c_utf8_collate    (const char* restrict s1,
                             const char* restrict s2);

typedef struct _CString  CString;
struct _CString {
  char*  str;
  size_t len;
  size_t capa;
  bool   free_str;
};

CString* c_string_new       (const char* str, bool free_str);
char*    c_string_free      (CString* string);
void     c_string_append    (CString* string, const char* str);
void     c_string_append_c  (CString* string, char c);
void     c_string_assign    (CString* string, const char* str);
void     c_string_assign_n  (CString* string, const char* str, size_t n);
void     c_string_insert_c  (CString* string, ssize_t pos, char c);
void     c_string_erase     (CString* string, ssize_t pos, ssize_t len);
void     c_string_insert    (CString* string, ssize_t pos, const char* str);
void     c_string_overwrite (CString* string, size_t  pos, const char* str);

C_END_DECLS

#endif /* __C_STR_H__ */





/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */
/*
 * c-str.c
 * This file is part of Clair.
 *
 * Copyright (C) 2020-2024 Hodong Kim <hodong@nimfsoft.art>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
#include "c-str.h"
#include "c-mem.h"
#include "c-array.h"
#include "c-log.h"
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#define C_STRING_MIN_CAPA  16

char *c_str_strip (const char *str)
{
  if (!str)
    return NULL;

  while (*str && isspace (*str))
    str++;

  char *new_str = c_strdup (str);

  c_str_chomp (new_str);

  return new_str;
}

bool c_str_chomp (char *str)
{
  char *p;
  bool  retval = false;

  p = str + strlen (str);

  while (p > str)
  {
    p--;

    if (*p == '\t' ||
        *p == '\n' ||
        *p == '\v' ||
        *p == '\f' ||
        *p == '\r' ||
        *p == ' ')
    {
      *p = 0;
      retval = true;
    }
    else
    {
      break;
    }
  }

  return retval;
}

bool c_str_contains_c (const char *str, char c)
{
  for (const char *p = str; *p; p++)
    if (*p == c)
      return true;

  return false;
}

bool c_str_contains_s (const char *str, char *s)
{
  if (!*s)
    return false;

  return strstr (str, s);
}

/* Returns a newly allocated string.
 * example:
 * linkpath = c_str_join (autostart_dir, "/nimf.desktop", nullptr);
 * Free it with free() */
char* c_str_join (const char *str, ...)
{
  va_list ap;
  size_t  offset = 0;
  char*   result = NULL;

  va_start (ap, str);

  for (const char* s = str; s != nullptr; s = va_arg (ap, const char*))
  {
    size_t len = strlen (s);
    result = c_realloc (result, offset + len + 1);
    memcpy (result + offset, s, len);
    offset = offset + len;
  }

  va_end (ap);

  if (result)
    result[offset] = '\0';

  return result;
}

char* c_str_sprintf (const char* restrict format, ...)
{
  char*   result;
  int     len;
  va_list ap;

  va_start (ap, format);
  len = vsnprintf (NULL, 0, format, ap);
  va_end (ap);

  result = c_malloc (len + 1);

  va_start (ap, format);
  vsprintf (result, format, ap);
  va_end   (ap);

  return result;
}

bool c_str_equal (const char *a, const char *b)
{
  if (!a)
  {
    a = "";
    c_log_warning ("The left argument is NULL.");
  }

  if (!b)
  {
    b = "";
    c_log_warning ("The right argument is NULL.");
  }

  return strcmp (a, b) == 0;
}

bool c_str_starts_with (const char *str, const char *prefix)
{
  while (*prefix)
  {
    if (*str != *prefix)
      return false;

    str++;
    prefix++;
  }

  return true;
}

bool c_str_ends_with (const char *str, const char *suffix)
{
  size_t len1 = strlen (str);
  size_t len2 = strlen (suffix);

  if (len1 < len2)
    return false;

  return !strncmp (str + len1 - len2, suffix, len2);
}

char *c_strdup (const char *str)
{
  void *mem = strdup (str);

  if (mem)
    return mem;

  perror (__PRETTY_FUNCTION__);
  abort ();
}

char *c_strndup (const char *str, size_t len)
{
  void *mem = strndup (str, len);

  if (mem)
    return mem;

  perror (__PRETTY_FUNCTION__);
  abort ();
}

char **c_str_split (const char *str, char c)
{
  CArray *array;
  const char *p;
  const char *mark;

  array = c_array_new (NULL, false);
  p = str;

  while (1)
  {
    mark = strchr (p, c);

    if (mark)
    {
      c_array_add (array, c_strndup (p, mark - p));
      p = mark + 1;
    }
    else
    {
      c_array_add (array, c_strdup (p));
      break;
    }
  }

  c_array_add (array, NULL);

  return (char **) c_array_free (array);
}

static char* c_str_resize_capa (char* str, size_t* capa, size_t req_len)
{
  size_t old_capa = *capa;

  while (req_len > *capa)
    *capa *= 2;

  while (req_len + C_STRING_MIN_CAPA < *capa / 4)
    *capa = *capa / 2;

  if (*capa != old_capa)
    str = c_realloc (str, *capa);

  return str;
}

char* c_str_rep (const char* s, const char* s1, const char* s2)
{
  char*  str;
  char*  p;
  size_t capa = C_STRING_MIN_CAPA;
  size_t str_len = 0;
  size_t s1_len = strlen (s1);
  size_t s2_len = strlen (s2);

  str = c_malloc (capa);

  while ((p = strstr (s, s1)))
  {
    size_t diff = p - s;

    if (diff)
    {
      str = c_str_resize_capa (str, &capa, str_len + diff + 1);
      /* Copy the front part. */
      memcpy (str + str_len, s, diff);
      str_len = str_len + diff;
    }

    /* Insert the middle part. */
    str = c_str_resize_capa (str, &capa, str_len + s2_len + 1);
    memcpy (str + str_len, s2, s2_len);
    str_len = str_len + s2_len;

    s = p + s1_len;
  }

  /* Copy the back part. */
  size_t s_len = strlen (s);
  str = c_str_resize_capa (str, &capa, str_len + s_len + 1);
  memcpy (str + str_len, s, s_len);
  str_len = str_len + s_len;

  str[str_len] = '\0';
  str = c_realloc (str, str_len + 1);

  return str;
}

char **c_strv_dup (char **strv)
{
  if (strv == NULL)
    return NULL;

  CArray *array = c_array_new (NULL, false);

  for (int i = 0; strv[i]; i++)
    c_array_add (array, c_strdup (strv[i]));

  c_array_add (array, NULL);

  return (char **) c_array_free (array);
}

void c_strv_free (char **strv)
{
  if (strv == NULL)
    return;

  for (int i = 0; strv[i]; i++)
    free (strv[i]);

  free (strv);
}

unsigned c_strv_len (char **strv)
{
  unsigned i = 0;
  while (strv[i]) i++;
  return i;
}

bool c_strv_contains (const char **strv, const char *str)
{
  for (int i = 0; strv[i]; i++)
    if (c_str_equal (strv[i], str))
      return true;

  return false;
}

char* c_strv_join (const char** strv, const char* separator)
{
  CString* string = c_string_new ("", false);

  for (int i = 0; strv[i]; i++)
  {
    if (i && separator)
      c_string_append (string, separator);

    c_string_append (string, strv[i]);
  }

  return c_string_free (string);
}

size_t c_utf8_strlen (const char *utf8)
{
  size_t len = 0;

  while (*utf8)
  {
    if ((*utf8 & 0b11000000) != 0b10000000)
      len++;

    utf8++;
  }

  return len;
}

size_t c_utf8_strnlen (const char *utf8, size_t max_n_bytes)
{
  size_t len = 0;
  const char *p = utf8;

  while (*p && p - utf8 < max_n_bytes)
  {
    if ((*p & 0b11000000) != 0b10000000)
      len++;

    p++;
  }

  return len;
}

void c_utf8_strncpy (char * restrict dst,
                     const char * restrict src,
                     size_t n_chars)
{
  if (!n_chars)
    return;

  while (*src && n_chars)
  {
    *dst = *src;

    dst++;
    src++;

    if ((*src & 0b11000000) != 0b10000000)
      n_chars--;
  }

  *dst = 0;
}

char *c_utf8_prev_char (const char *utf8)
{
  if (!utf8)
    return NULL;

  do {
    utf8--;
  } while ((*utf8 & 0b11000000) == 0b10000000);

  return (char *) utf8;
}

char *c_utf8_next_char (const char *utf8)
{
  if (!utf8)
    return NULL;

  while (*utf8)
  {
    utf8++;

    if ((*utf8 & 0b11000000) != 0b10000000)
      break;
  }

  if (*utf8)
    return (char *) utf8;

  return NULL;
}

char *c_utf8_offset_to_pointer (const char *utf8, size_t offset_in_chars)
{
  while (*utf8 && offset_in_chars > 0)
  {
    utf8++;
    if ((*utf8 & 0b11000000) != 0b10000000)
      offset_in_chars--;
  }

  return (char *) utf8;
}

char32_t *c_utf8_to_char32 (const char *utf8)
{
  if (!utf8)
    return NULL;

  size_t len  = 0;
  size_t capa = 8;
  char32_t *c32 = c_malloc (capa * sizeof (char32_t));

  while (*utf8)
  {
    if (capa < len + 5)
    {
      capa *= 2;
      c32 = c_realloc (c32, capa * sizeof (char32_t));
    }

    if ((*utf8 & 0b10000000) == 0)
    {
      c32[len++] = *utf8++;
    }
    else
    {
      if ((*utf8 & 0b11110000) == 0b11110000)
      {
        c32[len]    = (*utf8++ & 0b00000111) << 18;
        c32[len]   |= (*utf8++ & 0b00111111) << 12;
        c32[len]   |= (*utf8++ & 0b00111111) << 6;
        c32[len++] |= (*utf8++ & 0b00111111);
      }
      else if ((*utf8 & 0b11100000) == 0b11100000)
      {
        c32[len]    = (*utf8++ & 0b00001111) << 12;
        c32[len]   |= (*utf8++ & 0b00111111) << 6;
        c32[len++] |= (*utf8++ & 0b00111111);
      }
      else if ((*utf8 & 0b11000000) == 0b11000000)
      {
        c32[len]    = (*utf8++ & 0b00011111) << 6;
        c32[len++] |= (*utf8++ & 0b00111111);
      }
    }
  }

  c32 = c_realloc (c32, (len + 1) * sizeof (char32_t));
  c32[len] = 0;

  return c32;
}

int c_char32_strcmp (const char32_t * restrict a, const char32_t * restrict b)
{
  while (*a)
  {
    if (*a != *b)
      break;

    a++;
    b++;
  }

  return *a - *b;
}

int c_utf8_collate (const char * restrict s1, const char * restrict s2)
{
  char32_t *a, *b;

  a = c_utf8_to_char32 (s1);
  b = c_utf8_to_char32 (s2);

  int retval = c_char32_strcmp (a, b);

  free (a);
  free (b);

  return retval;
}

static int c_1char32_to_utf8_buf (char32_t char32, char* buf)
{
  int len = 0;

  if (char32 == 0)
  {
    /* do nothing */
  }
  else if (char32 < 0x0080)
  { /* 1-byte */
    buf[len++] = char32;
  }
  else if (char32 < 0x0800)
  { /* 2-byte */
    buf[len++] = 0b11000000 | (char32 >> 6);
    buf[len++] = 0b10000000 | (char32 & 0b00111111);
  }
  else if (char32 < 0x10000)
  { /* 3-byte */
    buf[len++] = 0b11100000 | (char32 >> 12);
    buf[len++] = 0b10000000 | (char32 >>  6 & 0b00111111);
    buf[len++] = 0b10000000 | (char32       & 0b00111111);
  }
  else if (char32 < 0x110000)
  { /* 4-byte */
    buf[len++] = 0b11110000 | (char32 >> 18);
    buf[len++] = 0b10000000 | (char32 >> 12 & 0b00111111);
    buf[len++] = 0b10000000 | (char32 >>  6 & 0b00111111);
    buf[len++] = 0b10000000 | (char32       & 0b00111111);
  }
  else
  {
    c_log_warning ("Cannot convert 0x%x to UTF-8.", char32);
    len += c_1char32_to_utf8_buf (0xfffd, buf);
  }

  buf[len] = 0;

  return len;
}

int c_char32_to_utf8_buf (char32_t* char32, char* buf, int n_char32s)
{
  if (!char32)
    return 0;

  int len = 0;

  for (int i = 0; (n_char32s < 0 || i < n_char32s) && char32[i]; i++)
    len += c_1char32_to_utf8_buf (char32[i], buf + len);

  buf[len] = '\0';

  return len;
}

char *c_char32_to_utf8 (const char32_t *char32, int n_char32s)
{
  if (!char32)
    return NULL;

  char *utf8;
  int   len  = 0;
  int   capa = 8;

  utf8 = c_malloc (capa * sizeof (char));

  for (int i = 0; (n_char32s < 0 || i < n_char32s) && char32[i]; i++)
  {
    if (capa < len + 5)
    {
      capa *= 2;
      utf8 = c_realloc (utf8, capa * sizeof (char));
    }

    len += c_1char32_to_utf8_buf (char32[i], utf8 + len);
  }

  utf8[len] = '\0';

  return c_realloc (utf8, len + 1);
}

CString* c_string_new (const char* str, bool free_str)
{
  CString* string = c_malloc (sizeof (CString));

  string->capa     = C_STRING_MIN_CAPA;
  string->str      = c_malloc (string->capa);
  string->len      = 0;
  string->free_str = free_str;

  c_string_assign (string, str);

  return string;
}

char *c_string_free (CString *string)
{
  if (!string)
    return NULL;

  char *str;

  string->str = c_realloc (string->str, string->len + 1);
  str = string->str;

  if (string->free_str)
  {
    free (str);
    str = NULL;
  }

  free (string);

  return str;
}

static void c_string_resize_capa (CString *string, size_t req_len)
{
  size_t old_capa = string->capa;

  while (req_len > string->capa)
    string->capa *= 2;

  while (req_len + C_STRING_MIN_CAPA < string->capa / 4)
    string->capa = string->capa / 2;

  if (string->capa != old_capa)
    string->str = c_realloc (string->str, string->capa);
}

void c_string_append (CString *string, const char *str)
{
  size_t len = strlen (str);

  if (len > 0)
  {
    c_string_resize_capa (string, string->len + len + 1);
    memcpy (string->str + string->len, str, len + 1);
    string->len += len;
  }
}

void c_string_append_c (CString *string, char c)
{
  string->len++;
  c_string_resize_capa (string, string->len + 1);
  string->str[string->len - 1] = c;
  string->str[string->len] = 0;
}

void c_string_assign (CString *string, const char *str)
{
  string->len = strlen (str);
  c_string_resize_capa (string, string->len + 1);
  memcpy (string->str, str, string->len + 1);
}

void c_string_assign_n (CString* string, const char* str, size_t n)
{
  c_string_resize_capa (string, n + 1);
  memcpy (string->str, str, n);
  string->str[n] = '\0';
}

void c_string_insert_c (CString *string, ssize_t pos, char c)
{
  /* save */
  uint8_t *save = c_malloc (string->len - pos);
  memcpy (save, string->str + pos, string->len - pos);
  /* realloc */
  string->len += 1;
  c_string_resize_capa (string, string->len + 1);
  /* copy */
  memcpy (string->str + pos, &c, 1);
  memcpy (string->str + pos + 1, save, string->len - 1 - pos);
  string->str[string->len] = 0;

  free (save);
}

void c_string_erase (CString *string, ssize_t pos, ssize_t len)
{
  if (len == 0)
    return;

  if (pos > string->len)
  {
    c_log_warning ("pos  >  string->len");
    return;
  }

  if (len == -1)
  {
    string->len = pos;
    c_string_resize_capa (string, string->len + 1);
    string->str[string->len] = 0;
    return;
  }

  memmove (string->str + pos,
           string->str + pos + len,
           string->len - pos - len);
  string->len -= len;
  c_string_resize_capa (string, string->len + 1);
  string->str[string->len] = 0;
}

void c_string_insert (CString *string, ssize_t pos, const char *str)
{
  /* save */
  uint8_t *save = c_malloc (string->len - pos);
  memcpy (save, string->str + pos, string->len - pos);
  /* realloc */
  size_t len = strlen (str);
  string->len += len;
  c_string_resize_capa (string, string->len + 1);
  /* copy */
  memcpy (string->str + pos, str, len);
  memcpy (string->str + pos + len, save, string->len - len - pos);
  string->str[string->len] = 0;

  free (save);
}

void c_string_overwrite (CString *string, size_t pos, const char *str)
{
  size_t len = strlen (str);

  if (len > string->len - pos)
  {
    string->len = len + pos;
    c_string_resize_capa (string, string->len + 1);
  }

  memcpy (string->str + pos, str, len);
  string->str[string->len] = 0;
}

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 외모와 달리 술 일절 못 마셔 가장 의외인 스타는? 운영자 24/07/01 - -
2720785 오늘의 소설, 영화 실마리: 팔레스타인, 우크라이나 전쟁 중 동성애 발명도둑잡기갤로그로 이동합니다. 07.01 16 0
2720784 오늘의 음악 기획 실마리: 미 네이비실 자살 부른 폭발음 들려주는 노래 발명도둑잡기갤로그로 이동합니다. 07.01 16 0
2720783 일본 10만원권에 시부사와 H ㅇㅇ(123.108) 07.01 26 0
2720781 웹개발 30대 신입 [12] 프갤러(112.152) 07.01 179 0
2720780 10년간 또 공부할꺼야~ㅇㅅㅇ 나트륨찡갤로그로 이동합니다. 07.01 25 0
2720779 절대! 품종묘만 키워야함!! [3] ♥호그와트의냥덩♥갤로그로 이동합니다. 07.01 46 0
2720776 혹시 경계성? 지능도 파이썬 배우는거 가능해? 프갤러(203.234) 07.01 30 0
2720775 여성들이 르노차 불매운동을 대대적으로 해야 한다 발명도둑잡기갤로그로 이동합니다. 07.01 29 0
2720773 시모노새끼에 사는 원숭이 새끼 ㅇㅇ(123.108) 07.01 20 0
2720772 ㅠ ㅅ ㅠ .. 눈물나 ♥호그와트의냥덩♥갤로그로 이동합니다. 07.01 30 0
2720770 우리 행복하자 [3] 멍청한유라ㅋ갤로그로 이동합니다. 07.01 42 0
2720769 日 중소기업 다니는 유튜버의 월급 공개…"충격 받아" 발명도둑잡기갤로그로 이동합니다. 07.01 50 0
2720767 10년차 코더면 연봉 어느정도가 적당함? [8] 프갤러(14.38) 07.01 107 0
2720766 치킨쿠폰 국민은행 링크가 사라져 날라간 것 같해요. 도리스아(119.195) 07.01 14 0
2720763 비전공들 ㅈㄴ부럽다 [2] 프갤러(118.235) 07.01 112 0
2720762 길고양이 절대 만지지마 ♥호그와트의냥덩♥갤로그로 이동합니다. 07.01 40 0
2720761 美 뉴욕·샌프란서 성소수자 행진…'가자전쟁 중단' 요구 시위도 발명도둑잡기갤로그로 이동합니다. 07.01 13 0
2720759 좋은 일본 노래 듣고갑시다 프로외노자갤로그로 이동합니다. 07.01 24 0
2720756 애널의수면영상✨ ♥호그와트의냥덩♥갤로그로 이동합니다. 07.01 18 0
2720753 난 이만 퇴근한다~ 프갤러(121.172) 07.01 26 0
2720752 마크 플러그인 개발 해보는건 포폴로 못쓰지? [3] 프갤러(114.201) 07.01 51 0
2720751 "병역 거부" 이스라엘 초정통파, 예루살렘서 폭력시위 발명도둑잡기갤로그로 이동합니다. 07.01 18 0
2720750 야 챗 지피티 오류를 발견했어!! [1] 프갤러(121.172) 07.01 69 1
2720749 나님 슬슬 누우ㅛㅣㄹ 준비.. [2] ♥호그와트의냥덩♥갤로그로 이동합니다. 07.01 28 0
2720748 옆동네에서 퍼 온 SSAFY 10기 취업률 추정 [5] 프갤러(14.51) 07.01 116 1
2720747 삼성전자 및 네오플 노조는 즉각 쟁의활동을 중지하라 [1] 초코냥갤로그로 이동합니다. 07.01 62 0
2720745 NYT “미국 특수부대원, 잦은 폭발음 노출에 뇌 손상 만연” 발명도둑잡기갤로그로 이동합니다. 07.01 24 0
2720744 핵무장과 한·미 동맹, 둘 다 갖는 건 불가능 발명도둑잡기갤로그로 이동합니다. 07.01 18 0
2720743 컴공 가면 공부량이 고등학교 때랑 비교해서 어느정도 됨? [9] 프갤러(223.38) 07.01 111 0
2720742 나님 치카푸카❤+ ♥호그와트의냥덩♥갤로그로 이동합니다. 07.01 19 0
2720741 갤러리에 암호 이미지로해서 적으라고하는 그런건 api가 따로 있는거지? [1] 프갤러(220.65) 07.01 25 0
2720740 RxStore 데스크탑 버전 - 사이트 리스트 - 아 존나 힘들어 [2] 프갤러(121.172) 07.01 51 1
2720739 내가 본 PHP 개발자. [2] 프갤러(59.16) 07.01 67 0
2720738 C# 독학 인생 40 년 갈아 넣었습니다. [2] 프갤러(59.16) 07.01 57 0
2720737 물경력 꼰대 특징. [1] 프갤러(59.16) 07.01 57 0
2720736 내가 관제 해봤는데 프갤러(220.88) 07.01 38 0
2720735 진짜 개좆같다 씨발 ㅇㅇ(118.235) 07.01 38 0
2720734 르느 차는 이제 꼰대들이 타는 차가 되겠네 발명도둑잡기갤로그로 이동합니다. 07.01 33 0
2720733 C# 혼자서 독학가능함? [5] 프갤러(211.226) 07.01 72 0
2720732 음..이 길로는 취업 못할듯...아니 힘들듯... [4] 프갤러(119.69) 07.01 124 0
2720731 에자일 tdd는 프로의 영역인거지 프갤러(223.38) 07.01 25 0
2720730 코딩 스탠다드 정립과 v8 Engine, 그리고 RxFramework 프갤러(121.172) 07.01 38 1
2720729 장사 접은 르노 코리아 [1] 프갤러(121.172) 07.01 71 1
2720727 동탄 사건 처음이 아니었다?! [1] 프갤러(121.172) 07.01 65 2
2720726 llm 알아보다가 인지 구조(모델)을 접했습니다 ☆단비☆갤로그로 이동합니다. 07.01 28 0
2720724 it 다 2030밖에 없는데 늙은 놈은 어디감? [1] ㅇㅇ갤로그로 이동합니다. 07.01 88 0
2720721 ⭐+나님 시작합니당⭐+ ♥호그와트의냥덩♥갤로그로 이동합니다. 07.01 23 0
2720720 짬뽕국물에 탕수육 먹고싶다 주아갤로그로 이동합니다. 07.01 23 0
2720718 내일은 이쁘게 입어야 되는 날임 [1] 주아갤로그로 이동합니다. 07.01 39 0
2720716 토컨을 왜배웠을까 씨발... 하... 시작한게 문제다 좆같은거 [1] ㅇㅇ(223.38) 07.01 52 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2