/*
 *  デバッグ用サンプルプログラム
 *
 *  OS: T-Kernel
 *
 *  Copyright (C) 2010-2017 by Personal Media Corporation
 */

#include <tk/tkernel.h>  /* T-Kernel ヘッダ */
#include <tm/tmonitor.h> /* tm_printf() など */
#include <libstr.h>      /* memcmp() など */

/* オブジェクト ID 番号 */
LOCAL ID tidA;           /* タスク A の ID */

/* 渡された文字列の中のTHISをTHATに書き換える(バグあり) */
LOCAL void replace(char *s)
{
    int i, len;
    char key[] = {'T', 'H', 'I', 'S'};
    char rep[] = {'T', 'H', 'A', 'T'};
    len = strlen(s);
    for (i = 0; i <= len - sizeof(key); i++) {
        if (memcmp(s + i, key, sizeof(key)) == 0) {
            memcpy(s + i, rep, sizeof(rep));
        }
    }
}

/* タスク A */
LOCAL void taskA(INT stacd, void *exinf)
{
    char s1[] = "THIS";
    char s2[] = "PLEASE DEBUG THIS PROGRAM.";
    char s3[] = "";
    replace(s1);
    tm_printf((UB*)"\"%s\"\n", s1);
    replace(s2);
    tm_printf((UB*)"\"%s\"\n", s2);
    replace(s3);
    tm_printf((UB*)"\"%s\"\n", s3);

    /* 自タスクを終了・削除する */
    tk_exd_tsk();
}

/* 初期化処理 */
EXPORT INT usermain(void)
{
    T_CTSK ct;

    /* タスク A を生成する */
    ct.exinf = (void*)('t' | 's' << 8 | 'k' << 16 | 'A' << 24); /* 拡張情報 */
    ct.tskatr = TA_HLNG | TA_RNG0;  /* タスク属性 */
    ct.task = taskA;                /* タスク起動アドレス */
    ct.itskpri = 1;                 /* タスク起動時優先度 */
    ct.stksz = 1024;                /* スタックサイズ */
    tidA = tk_cre_tsk(&ct);         /* タスク A を生成 */
    if (tidA < E_OK) return tidA;   /* タスク生成失敗時 */

    tk_sta_tsk(tidA, 0);            /* タスク A を起動 */

    return E_OK;
}
