디시인사이드 갤러리

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

갤러리 본문 영역

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

☆단비☆갤로그로 이동합니다. 2024.06.30 11:27:34
조회 127 추천 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 - -
공지 프로그래밍 갤러리 이용 안내 [71] 운영자 20.09.28 36096 62
2722149 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:42 5 0
2722148 이거 아는사람 몇 없음ㅋㅋ ㅇㅇㅇㅇ(121.154) 08:34 18 0
2722147 개발자 친구중에 이직 생각 있냐고 묻는거 왜 그래 프갤러(175.223) 08:15 30 0
2722146 고추마요 먹지말아야지 주아갤로그로 이동합니다. 08:06 8 0
2722143 프로테우스 시뮬레이터용 hd44780 lcd에 발명도둑잡기갤로그로 이동합니다. 07:57 8 0
2722142 나는내향적이야 통정희박대령갤로그로 이동합니다. 07:49 13 0
2722141 개발자들 정신병 많음? [1] 프갤러(27.119) 07:37 37 0
2722139 독일 본사는 왜 갑자기 배민 대표를 날렸나 발명도둑잡기갤로그로 이동합니다. 07:21 36 0
2722138 ‘티블스’라는 반려묘 발톱에 영원히 사라진 ‘라이얼굴뚝새’ 발명도둑잡기갤로그로 이동합니다. 07:13 10 0
2722137 "LLM 에게 물어보고 개발해라." 달달연습하면 되니까, [1] +abcd3421갤로그로 이동합니다. 07:08 33 0
2722136 탈우분투(리눅스 민트 포함)한 이유라.. ▒▒RAZER갤로그로 이동합니다. 07:04 14 0
2722135 [참고물] LLM 에게 물어보고 개발해라. - 백엔드 편 +abcd3421갤로그로 이동합니다. 07:00 17 0
2722133 오스트리아 출산하는 마리아상, "신성 모독" 결국 파괴 발명도둑잡기갤로그로 이동합니다. 06:53 14 0
2722132 캠프 싹 털자 나온 게 '47억', 논란 터지자 쿠팡 반응 발명도둑잡기갤로그로 이동합니다. 06:47 15 0
2722131 [참고물] LLM 에게 물어보고 개발해라. - 프론트엔드 편 +abcd3421갤로그로 이동합니다. 06:45 23 1
2722130 보수적인 사람, 진보적인 사람 설득법 발명도둑잡기갤로그로 이동합니다. 06:39 12 0
2722129 "국비에서 취업 안된다" ㅇㅇ(223.39) 06:34 46 0
2722128 문화재에 숨은 신비한 동물 사전 발명도둑잡기갤로그로 이동합니다. 06:28 10 0
2722127 일본 새 지폐 시부사와 에이이치와 코에이사 발명도둑잡기갤로그로 이동합니다. 06:24 8 0
2722126 5시 40분에 일어났는데 왜 벌써 6시 20분? 주아갤로그로 이동합니다. 06:17 16 0
2722125 파워 A.S 사설 어디서 시소닉 rma 안해서 너무 좋으실듯... 저만손 도리스아(220.74) 06:11 11 0
2722124 악기 사면 대학 갈 수도 있을 정도까지 왔다.. 발명도둑잡기갤로그로 이동합니다. 06:07 19 0
2722123 실제 상황 [1] 도리스아(220.74) 06:06 50 0
2722122 [인터뷰]삼전개미 권감각 "빨래 개면서 하소연했는데 떡상했죠" 발명도둑잡기갤로그로 이동합니다. 06:03 16 0
2722121 나의 입장과 남의 입장과 국가의 입장 타국가의 입장은 매우 다르다 f상황 도리스아(220.74) 06:01 13 0
2722119 서지영만 빠졌네…샵 이지혜, 장석현·크리스와 10년만 재회 발명도둑잡기갤로그로 이동합니다. 05:51 10 0
2722118 여유텔레콤 ㅇㅇ(117.111) 05:45 30 2
2722117 "'성별 전쟁' 격렬한 한국"…프랑스도 '집게손 논란' 조명 발명도둑잡기갤로그로 이동합니다. 05:39 23 0
2722116 국비충 의욕없어서 대충 ㅈ소si 갈려고 ㅇㅇ(223.38) 05:23 24 0
2722115 (FEAT. rj-45)겁나 특이하게 인터넷이 되고 있다 도리스아(112.170) 05:22 25 0
2722113 "바다 위에서 생존을 위해 뭉친 양반·노비·동학 운동가"…연극 '돛단배' 발명도둑잡기갤로그로 이동합니다. 04:59 10 0
2722112 중국 ‘대만 독립분자’ 사형 지침에…외국계 기업 “대만직원 철수” 검토 발명도둑잡기갤로그로 이동합니다. 04:54 13 0
2722111 발 다 뗐는데도 급발진 안 멈추면…전문가들이 알려주는 대처법 발명도둑잡기갤로그로 이동합니다. 04:47 14 0
2722110 [이갑수의 일생의 일상]기괴한 시대의 희한한 물고기 앞에서 발명도둑잡기갤로그로 이동합니다. 04:45 9 0
2722108 배우 강정화 근황 발명도둑잡기갤로그로 이동합니다. 04:38 18 0
2722107 si 채용 공고에 지방 근무 가능자있으면 안하는게 맞음? ㅇㅇ(222.109) 04:28 21 0
2722106 진지하게 자기는 야구 재능이 없었다고 발언한 이대호 발명도둑잡기갤로그로 이동합니다. 04:23 13 0
2722105 한국을 떠나는 외국인 여성들 발명도둑잡기갤로그로 이동합니다. 04:21 20 0
2722104 세계 최고의 부동산 버블 [1] 발명도둑잡기갤로그로 이동합니다. 04:07 42 0
2722103 터치·러브레터 그리고 뉴진스 하니…마쓰다 세이코 '푸른 산호초' 발명도둑잡기갤로그로 이동합니다. 04:04 17 0
2722101 전쟁 한국도 예외 아니다?..72시간 생존배낭 필수템은? 발명도둑잡기갤로그로 이동합니다. 03:45 17 0
2722100 [팩트체크] 훈민정음, 중국어 한자 소리 적으려 만들어졌다? 발명도둑잡기갤로그로 이동합니다. 03:39 12 0
2722099 미국 민주당이 선거 이기면 제3차세계대전 날 가능성이 높아진다 발명도둑잡기갤로그로 이동합니다. 03:27 18 0
2722095 설현 오열한 그 사건? 김구라 "PD한테 편집해 달라고 했는데" 발명도둑잡기갤로그로 이동합니다. 03:14 20 0
2722094 보안, 개발 고수들 한테 질문 ㅇㅇ(39.123) 03:13 29 0
2722092 117년 관측 사상 처음…"우리가 알던 여름 아니다" 발명도둑잡기갤로그로 이동합니다. 03:08 27 0
2722090 역사적인 부동산 버블을 쌓고 있는 한국 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 02:58 43 1
2722087 개발자 취업 안되면 생산직 뛰어들려는데 스팩 좀 봐줘라 [1] 프갤러(218.148) 02:30 65 0
2722086 https://www.youtube.com/channel/UCYTfr5E B0@절대지켜 xyzrocksnake(1.230) 02:30 17 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2