Subversion Repositories HelenOS

Rev

Rev 4348 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2006 Josef Cejka
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /** @addtogroup libc
  30.  * @{
  31.  */
  32. /** @file
  33.  */
  34.  
  35. #include <stdarg.h>
  36. #include <stdio.h>
  37. #include <unistd.h>
  38. #include <io/printf_core.h>
  39. #include <futex.h>
  40. #include <async.h>
  41. #include <string.h>
  42.  
  43. static atomic_t printf_futex = FUTEX_INITIALIZER;
  44.  
  45. static int vprintf_str_write(const char *str, size_t size, void *stream)
  46. {
  47.     size_t wr = fwrite(str, 1, size, (FILE *) stream);
  48.     return str_nlength(str, wr);
  49. }
  50.  
  51. static int vprintf_wstr_write(const wchar_t *str, size_t size, void *stream)
  52. {
  53.     size_t offset = 0;
  54.     size_t chars = 0;
  55.    
  56.     while (offset < size) {
  57.         if (fputc(str[chars], (FILE *) stream) <= 0)
  58.             break;
  59.        
  60.         chars++;
  61.         offset += sizeof(wchar_t);
  62.     }
  63.    
  64.     return chars;
  65. }
  66.  
  67. /** Print formatted text.
  68.  *
  69.  * @param stream Output stream
  70.  * @param fmt    Format string
  71.  * @param ap     Format parameters
  72.  *
  73.  * \see For more details about format string see printf_core.
  74.  *
  75.  */
  76. int vfprintf(FILE *stream, const char *fmt, va_list ap)
  77. {
  78.     struct printf_spec ps = {
  79.         vprintf_str_write,
  80.         vprintf_wstr_write,
  81.         stream
  82.     };
  83.    
  84.     /*
  85.      * Prevent other threads to execute printf_core()
  86.      */
  87.     futex_down(&printf_futex);
  88.    
  89.     /*
  90.      * Prevent other fibrils of the same thread
  91.      * to execute printf_core()
  92.      */
  93.     async_serialize_start();
  94.    
  95.     int ret = printf_core(fmt, &ps, ap);
  96.    
  97.     async_serialize_end();
  98.     futex_up(&printf_futex);
  99.    
  100.     return ret;
  101. }
  102.  
  103. /** Print formatted text to stdout.
  104.  *
  105.  * @param file Output stream
  106.  * @param fmt  Format string
  107.  * @param ap   Format parameters
  108.  *
  109.  * \see For more details about format string see printf_core.
  110.  *
  111.  */
  112. int vprintf(const char *fmt, va_list ap)
  113. {
  114.     return vfprintf(stdout, fmt, ap);
  115. }
  116.  
  117. /** @}
  118.  */
  119.