# This file is part of ltrace.
# Copyright (C) 2013 Petr Machata, Red Hat Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA

set bin [ltraceCompile {} [ltraceSource c {
    #include <sys/time.h>
    #include <assert.h>
    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <wchar.h>
    #include <wctype.h>

    int main(int argc, char *argv[])
    {
      setlocale(LC_ALL, "");

      FILE *rd_stream, *wr_stream, *wr_stream_2;
      {
	int fds[2];
	pipe (fds);
	rd_stream = fdopen (fds[0], "r");
	wr_stream = fdopen (fds[1], "w");
	wr_stream_2 = fdopen (fds[1], "w");
      }

      wcslen(L"Вот это да!");

      fprintf(wr_stream_2, "something %s\n", "something");
      fprintf(wr_stream_2, "something %ls\n", L"что-то");

      fputwc(L'Ф', wr_stream);
      putwc(L'Д', wr_stream);
      fflush(wr_stream);
      fgetwc(rd_stream);
      ungetwc(getwc(rd_stream), rd_stream);

      fputws(L"Что-то.\n", wr_stream);
      fflush(wr_stream);
      wchar_t wbuf[64];
      fgetws(wbuf, 64, rd_stream);

      fwprintf(wr_stream, L"Какое-то %ls %s.\n", L"что-то", "something");
      swprintf(wbuf, 64, L"zwölf große %ls %zd", L"Boxkämpfe", wcslen(wbuf));

      int i = iswalnum(L'1');
      assert(!!i);
      i = iswalpha(L'A');
      assert(!!i);
      i = iswcntrl(L'\t');
      assert(!!i);
      i = iswdigit(L'1');
      assert(!!i);
      i = iswgraph(L'=');
      assert(!!i);
      i = iswlower(L'ц');
      assert(!!i);
      i = iswupper(L'Ц');
      assert(!!i);
      i = iswprint(L'☻');
      assert(!!i);
      i = iswpunct(L'•');
      assert(!!i);
      i = iswspace(L'\t');
      assert(!!i);
      i = iswxdigit(L'A');
      assert(!!i);

      i = mbrlen("что", sizeof "что", NULL);
      assert(i == 2);
      wchar_t wc;
      i = mbrtowc(&wc, "что", sizeof "что", NULL);

      const char *str = "что";
      i = mbsrtowcs(wbuf, &str, 64, NULL);
      assert(i >= 0);

      i = towlower(towupper(L'ы')) == L'ы';
      assert(!!i);

      char buf[64] = {};
      wctomb(buf, L'ư');
      wcrtomb(buf, L'ơ', NULL);

      wbuf[0] = 0;
      i = wcscmp(wcschr(wcsncat(wcscat(wbuf, L"žluťoučký "),
				L"kůň", 64), L'ů'), L"ůň");
      assert(i == 0);
      i = wcsncmp(wbuf, L"žluťák", 4);
      assert(i == 0);

      i = wcscoll(wcscpy(wbuf, L"/ˈɪŋɡlɪʃ/"), L"/dɔɪ̯ʧ/");
      assert(i != 0);
      i = wcsspn(wbuf, L"/");
      assert(i == 1);
      i = wcscspn(wbuf, L"ˈ");
      assert(i == 1);
      *wcsrchr(wcspbrk(wbuf, L"ɪ"), L'ɪ') = L'i';

      struct timeval tv;
      gettimeofday(&tv, NULL);
      struct tm *tm = gmtime(&tv.tv_sec);
      wbuf[0] = L'\0';
      wcsftime(wbuf, 64, L"«%F • %T»", tm);
      { const wchar_t *ptr = wbuf; wcsrtombs(buf, &ptr, 64, NULL); }
      { wchar_t *ptr = NULL; wcstod(wcsstr(wbuf, L"•") + 2, &ptr); }
      wcsncpy(wbuf, L"1234•", 64);
      { wchar_t *ptr = NULL; wcstof(wbuf, &ptr); }
      { wchar_t *ptr = NULL; wcstold(wbuf, &ptr); }
      { wchar_t *ptr = NULL; wcstol(wbuf, &ptr, 10); }
      { wchar_t *ptr = NULL; wcstoll(wbuf, &ptr, 10); }
      { wchar_t *ptr = NULL; wcstoul(wbuf, &ptr, 10); }
      { wchar_t *ptr = NULL; wcstoull(wbuf, &ptr, 10); }
      i = wmemcmp(wmemchr(wbuf, L'•', 64), L"•", 2);
      assert(i == 0);

      i = wcswidth(L"你好") + wcwidth(L'你') + wctob(L'1');;
      assert(i == 6 + '1');

      i = iswctype(L'Ш', wctype("alpha"));
      assert(!!i);

      wmemcpy(wbuf, L"Dobrý den", 6);
      wmemmove(wbuf, L"  ", 2);
      { wchar_t *ptr = NULL; wmemset(wcstok(wbuf, L" ", &ptr), L'я', 5); }

      return 0;
    }
}]]

ltraceMatch [ltraceRun -F $srcdir/../etc/ -- $bin] {
    {{^fprintf\(.*, "something %s\\n", "something"\)} == 1}
    {{^fprintf\(.*, "something %ls\\n", "что-то"\)} == 1}
    {{^fputwc\('Ф', .*\).*= 'Ф'} == 1}
    {{^putwc\('Д', .*\).*= 'Д'} == 1}
    {{^fgetwc\(.*\).*= 'Ф'} == 1}
    {{^getwc\(.*\).*= 'Д'} == 1}
    {{^ungetwc\('Д', .*\).*= 'Д'} == 1}
    {{^fputws\("Что-то.\\n", .*\)} == 1}
    {{^fgetws\("ДЧто-то.\\n", 64, .*\).*= "ДЧто-то.\\n"} == 1}
    {{^fwprintf\(.*, "Какое-то %ls %s.\\n", "что-то", "something"\).*= 27} == 1}
    {{^wcslen\("ДЧто-то.\\n"\).*= 9} == 1}
    {{^swprintf\("zwölf große Boxkämpfe 9", 64, "zwölf große %ls %zd", "Boxkämpfe", 9\).*= 23} == 1}
    {{^iswalnum\('1'\).*= 8} == 1}
    {{^iswalpha\('A'\).*= 1024} == 1}
    {{^iswcntrl\('\\t'\).*= 2} == 1}
    {{^iswdigit\('1'\).*= 1} == 1}
    {{^iswgraph\('='\).*= 32768} == 1}
    {{^iswlower\('ц'\).*= 1} == 1}
    {{^iswupper\('Ц'\).*= 1} == 1}
    {{^iswprint\('☻'\).*= 1} == 1}
    {{^iswpunct\('•'\).*= 1} == 1}
    {{^iswspace\('\\t'\).*= 8192} == 1}
    {{^iswxdigit\('A'\).*= 4096} == 1}
    {{^mbrtowc\('ч', ".*", 7, nil\)} == 1}
    {{^mbsrtowcs\("что", nil, 64, nil\).*= 3} == 1}
    {{^towupper\('ы'\).*= 'Ы'} == 1}
    {{^towlower\('Ы'\).*= 'ы'} == 1}
    {{^wctomb\(".*", 'ư'\)} == 1}
    {{^wcrtomb\(".*", 'ơ', nil\)} == 1}
    {{^wcscat\("", "žluťoučký "\).*= "žluťoučký "} == 1}
    {{^wcsncat\("žluťoučký ", "kůň", 64\).*= "žluťoučký kůň"} == 1}
    {{^wcschr\("žluťoučký kůň", 'ů'\).*= "ůň"} == 1}
    {{^wcscmp\("ůň", "ůň"\).*= 0} == 1}
    {{^wcsncmp\("žluť", "žluť", 4\).*= 0} == 1}
    {{^wcscpy\(.*, "/ˈɪŋɡlɪʃ/"\).*= .*} == 1}
    {{^wcscoll\("/ˈɪŋɡlɪʃ/", "/dɔɪ̯ʧ/"\).*= 10} == 1}
    {{^wcsspn\("/ˈɪŋɡlɪʃ/", "/"\).*= 1} == 1}
    {{^wcscspn\("/ˈɪŋɡlɪʃ/", "ˈ"\).*= 1} == 1}
    {{^wcspbrk\("/ˈɪŋɡlɪʃ/", "ɪ"\).*= "ɪŋɡlɪʃ/"} == 1}
    {{^wcsrchr\("ɪŋɡlɪʃ/", 'ɪ'\).*= "ɪʃ/"} == 1}
    {{^gettimeofday\(.*, nil\).*= 0} == 1}
    {{^gmtime\(.*\).*= .*} == 1}
    {{^wcsftime\("«.* • .*»", 64, "«%F • %T»", .*\)} == 1}
    {{^wcsrtombs\(".*", nil, 64, nil\)} == 1}
    {{^wcsstr\("«.* • .*»", "•"\).*= "• .*»"} == 1}
    {{^wcstod\(".*»", ".*»"\).*= [0-9]+} == 1}
    {{^wcsncpy\(.*, "1234•", 64\).*= .*} == 1}
    {{^wcstof\("1234•", "•"\).*= 1234} == 1}
    {{^wcstold\("1234•", "•"\).*= 1234} == 1}
    {{^wcstol\("1234•", "•", 10\).*= 1234} == 1}
    {{^wcstoll\("1234•", "•", 10\).*= 1234} == 1}
    {{^wcstoul\("1234•", "•", 10\).*= 1234} == 1}
    {{^wcstoull\("1234•", "•", 10\).*= 1234} == 1}
    {{^wmemchr\("1234•", '•', 64\).*= "•"} == 1}
    {{^wmemcmp\("•", "•", 2\).*= 0} == 1}
    {{^wcswidth\("你好", .*\).*= 4} == 1}
    {{^wcwidth\('你'\).*= 2} == 1}
    {{^wctob\('1'\).*= 49} == 1}
    {{^wctype\("alpha"\).*= .*} == 1}
    {{^iswctype\('Ш', .*\).*= 1} == 1}
    {{^wmemcpy\(.*, "Dobrý ", 6\).*= "Dobrý "} == 1}
    {{^wmemmove\(.*, "  ", 2\).*= "  "} == 1}
    {{^wcstok\("  brý ", " ", ""\).*= "brý"} == 1}
    {{^wmemset\(.*, 'я', 5\).*= "яяяяя"} == 1}
}

ltraceDone
