⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conout.c

📁 一个多任务操作系统CTask的源代码 用C语言编写
💻 C
字号:
/*
   --- Version 2.0 90-10-09 22:02 ---

   Sample module for channeling console output through
   a single task to avoid problems with non-reentrant output
   routines.
*/

#include "tsk.h"
#include "tsksup.h"

#include <string.h>
#include <stdarg.h>

#define BUFSIZE   1024     /* Size of the console out buffer */
#define STRLEN    256      /* Max. length of single output string */
#define STACKSIZE 2048     /* Size of stack for output task */

local buffer conout_buf;
local char conout_stack [STACKSIZE];
local char conout_bufbuf [BUFSIZE];
local char conout_str [STRLEN+1];
local tcb conout_task;

resource printf_resource;

/* -------------------------------------------------------------- */

/*
   conout: The console output task. Reads strings from the buffer
           and displays them on the console.
*/

local void Taskfunc conout (void)
{
   int siz, i;
   register int ch;

   while (1)
      {
      siz = read_buffer (&conout_buf, conout_str, STRLEN, 0L);
      for (i = 0; i < siz; i++)
         {
         switch (ch = conout_str [i])
            {
            case '\n':  putch ('\r');
                        putch ('\n');
                        break;

#if (TSK_TURBO)
            case 0x07:  sound (2000);
#if (CLOCK_MSEC)
                        t_delay (167L);
#else
                        t_delay (3L);
#endif
                        nosound ();
                        break;
#endif

            default:    putch (ch);
            }
         }
      }
}


/*
   init_conout:   Creates buffer and task. Must be called
                  before using any other routine from this module.
*/

void init_conout (void)
{
   create_buffer (&conout_buf, conout_bufbuf, BUFSIZE TN("CONOUTBF"));
   create_task (&conout_task, conout, conout_stack, STACKSIZE, PRI_STD + 100, 
                LNULL TN("CONOUT"));
   start_task (&conout_task);
   create_resource (&printf_resource TN("PRINTF"));
}


/*
   end_conout: Deletes task and buffer. Should be called before
               terminating CTask.
*/

void end_conout (void)
{
   kill_task (&conout_task);
   delete_buffer (&conout_buf);
   delete_resource (&printf_resource);
}

/* -------------------------------------------------------------- */

/*
   tprintf:    Buffered replacement for printf/cprintf.
*/

int tprintf (char *format, ...)
{
   va_list argptr;
   char buf [256];
   int res;

   va_start (argptr, format);
   request_resource (&printf_resource, 0L);
   if ((res = vsprintf (buf, format, argptr)) > 0)
      if (write_buffer (&conout_buf, buf, res, 0L) < 0)
         res = 0;
   release_resource (&printf_resource);
   va_end (argptr);
   return res;
}


/*
   tputs:      Buffered replacement for puts.
*/

int tputs (char *buf)
{
   return (write_buffer (&conout_buf, buf, strlen (buf), 0L) < 0) ? -1 : 0;
}


/*
   tputch:     Buffered replacement for putch.
*/

int tputch (int ch)
{
   return (write_buffer (&conout_buf, &ch, 1, 0L) < 0) ? EOF : ch;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -