STDX.C

[目次 | 関数 | マクロ]

目次

関数一覧

マクロ一覧


   1|/**************************************************************************
   2|*  1. <<< 標準ライブラリ (StdX) >>> 
   3|***************************************************************************/
   4|#define  STDX_FOR_COMPILE
   5|#define  STDLIBS_INCLUDE
   6|#define  STDLIBS_INCLUDE_STDIO_H
   7|#define  STDLIBS_INCLUDE_STDARG_H
   8|
   9|#include  <stdx.ah>
  10|
  11|
  12|
  13|
  14| 
  15|/**************************************************************************
  16|*  2. <<< [StdX_strcpy] 文字列をコピーする >>> 
  17|*【引数】
  18|*  ・char*  dst;       コピー格納先の文字列領域の先頭アドレス
  19|*  ・char*  src;       コピー元の文字列
  20|*  ・char*  返り値;    dst(格納された文字列の先頭アドレス)
  21|***************************************************************************/
  22|char*  StdX_strcpy( char* dst, const char* src )
  23|{
  24|  char*  p = dst;
  25|
  26|  for (;;) {
  27|    *p = *src;
  28|    if ( *p == '\0' )  return  dst;
  29|    p++;  src++;
  30|  }
  31|}
  32|
  33| 
  34|/**************************************************************************
  35|*  3. <<< [StdX_strlen] 文字列の長さを返す >>> 
  36|*【引数】
  37|*  ・char*  s;             長さを調べる文字列
  38|*  ・unsigned  返り値;     文字列 s の長さ [byte]
  39|***************************************************************************/
  40|unsigned  StdX_strlen( const char* s )
  41|{
  42|  int  len = 0;
  43|
  44|  while ( *s++ != '\0' )  len++;
  45|
  46|  return  len;
  47|}
  48|
  49| 
  50|/**************************************************************************
  51|*  4. <<< [StdX_strchr] 文字列中の文字を検索する >>> 
  52|*【引数】
  53|*  ・char*  s;       文字列
  54|*  ・int    c;       検索する文字
  55|*  ・char*  返り値;  見つかった文字の文字列中のアドレス、or NULL
  56|***************************************************************************/
  57|char*  StdX_strchr( const char* s, int c )
  58|{
  59|  for (;;) {
  60|    if ( *s == c )  return  (char*)s;
  61|    if ( *s == '\0' )  return  (char*)NULL;
  62|    s++;
  63|  }
  64|}
  65|
  66| 
  67|/**************************************************************************
  68|*  5. <<< [StdX_strcmp] 文字列を比較する >>> 
  69|*【引数】
  70|*  ・char*     s     長さを調べる文字列
  71|*  ・int 返り値        文字列 s の長さ [byte]
  72|***************************************************************************/
  73|int  StdX_strcmp( const char* s, const char* ss )
  74|{
  75|  while ( *s != '\0' && *ss != '\0' && *s == *ss )  { s++;  ss++; }
  76|
  77|  return  *s - *ss;
  78|}
  79|
  80| 
  81|/***********************************************************************
  82|*  6. <<< [StdX_stricmp] 大文字小文字を区別しないで比較する >>> 
  83|************************************************************************/
  84|int  StdX_stricmp( const char* s, const char* ss )
  85|{
  86|  while ( *s != '\0' && *ss != '\0' &&
  87|          StdX_toupper(*s) == StdX_toupper(*ss) )
  88|    { s++;  ss++; }
  89|
  90|  return  *s - *ss;
  91|}
  92| 
  93|/**************************************************************************
  94|*  7. <<< [StdX_memcpy] メモリ・コピーする >>> 
  95|*【引数】
  96|*  ・void*     dec;     コピー先の先頭のアドレス
  97|*  ・void*     src;     コピー元の先頭のアドレス
  98|*  ・size_t    n;       コピーする長さ[byte]
  99|*  ・void*     返り値;  dec と同じ
 100|***************************************************************************/
 101|void*  StdX_memcpy( void* _dec, const void* _src, size_t n )
 102|{
 103|  char*  dec = (char*)_dec;
 104|  const char*  src = (const char*)_src;
 105|
 106|  while ( n-- > 0 )
 107|    *dec++ = *src++;
 108|  return  _dec;
 109|}
 110|
 111| 
 112|/**************************************************************************
 113|*  8. <<< [StdX_memmove] メモリ・コピーする(重なり可能) >>> 
 114|*【引数】
 115|*  ・void*     dec;     コピー先の先頭のアドレス
 116|*  ・void*     src;     コピー元の先頭のアドレス
 117|*  ・size_t    n;       コピーする長さ[byte]
 118|*  ・void*     返り値;  dec と同じ
 119|***************************************************************************/
 120|void*  StdX_memmove( void* _dec, const void* _src, size_t n )
 121|{
 122|  char*  dec = (char*)_dec;
 123|  const char*  src = (const char*)_src;
 124|
 125|  if ( src > dec ) {
 126|    while ( n-- > 0 )
 127|      *dec++ = *src++;
 128|  }
 129|  else {
 130|    dec += n;  src += n;
 131|    while ( n-- > 0 )
 132|      *--dec = *--src;
 133|  }
 134|  return  _dec;
 135|}
 136|
 137| 
 138|/**************************************************************************
 139|*  9. <<< [StdX_memset] 同じ文字を連続して埋め込む >>> 
 140|*【引数】
 141|*  ・char*     dec    埋め込み先の先頭のアドレス
 142|*  ・int       ch     埋め込む文字
 143|*  ・unsigned  n      埋め込む文字数[byte]
 144|***************************************************************************/
 145|void*  StdX_memset( void* _dec, int ch, unsigned n )
 146|{
 147|  char*  dec = (char*)_dec;
 148|
 149|  while ( n-- > 0 )
 150|    *dec ++ = ch;
 151|  return  dec;
 152|}
 153|
 154|
 155| 
 156|/**************************************************************************
 157|*  10. <<< [StdX_memcmp] メモリ内容を比較する >>> 
 158|***************************************************************************/
 159|int  StdX_memcmp( const void* a, const void* b, size_t size )
 160|{
 161|  const char*  ap = (const char*)a;
 162|  const char*  ap_over = ap + size;
 163|  const char*  bp = (const char*)b;
 164|
 165|  while ( ap < ap_over ) {
 166|    if ( *ap != *bp )  return  *ap - *bp;
 167|    ap ++;  bp++;
 168|  }
 169|
 170|  return  0;
 171|}
 172|
 173|
 174| 
 175|/**************************************************************************
 176|*  11. <<< [StdX_sprintf] 書式に従って文字列を作成する(1) >>> 
 177|*【引数】
 178|*  ・char*  s;     文字列を格納するアドレス
 179|*  ・char*  fmt;   書式(全て対応していません)
 180|*  ・ ...;         パラメータ
 181|*  ・int  返り値;  格納した文字列のバイト数('\0'文字を除く)
 182|***************************************************************************/
 183|#if  defined(USES_STDX_STDARG)
 184|int  StdX_sprintf( char* s, const char* fmt, ... )
 185|{
 186|  va_list  va;
 187|  int      ret;
 188|
 189|  va_start( va, fmt );
 190|  ret = vsprintf( s, fmt, va );
 191|  va_end( va );
 192|
 193|  return  ret;
 194|}
 195|#endif
 196|
 197|
 198| 
 199|/**************************************************************************
 200|*  12. <<< [StdX_vsprintf] 書式に従って文字列を作成する(2) >>> 
 201|*【引数】
 202|*  ・char*  s;     文字列を格納するアドレス
 203|*  ・char*  fmt;   書式(全て対応していません)
 204|*  ・va_list  va;  パラメータ・リスト
 205|*  ・int  返り値;  格納した文字列のバイト数('\0'文字を除く)
 206|***************************************************************************/
 207|#if  defined(USES_STDX_STDARG)
 208|int  StdX_vsprintf( char* s, const char* fmt, va_list va )
 209|{
 210|  char*  p = s;
 211|  char*  pp;
 212|  int    c;
 213|  int    bZeroPad;  /* 左を0で埋める */
 214|  int    keta;      /* 表示桁数 */
 215|
 216|  while ( *fmt != '\0' ) {
 217|    c = *fmt;
 218|
 219|    /* % 指定でない場合 */
 220|    if ( c != '%' ) {
 221|      *p = c;
 222|      p++;  fmt ++;
 223|    }
 224|
 225|    /* % 指定の場合 */
 226|    else {
 227|      fmt++;  c = *fmt;
 228|      keta = 1;
 229|
 230|      /* "%08X" などの "08" を bZeroPad, keta に設定する */
 231|      if ( c == '0' )  { bZeroPad = 1;  fmt++;  c = *fmt; }
 232|      else   bZeroPad = 0;
 233|      if ( c >= '1' && c <= '9' )  { keta = c - '0';  fmt++;  c = *fmt; }
 234|
 235|      /* 型に従って文字列を作成する */
 236|      switch ( c ) {
 237|
 238|        /*---- [%c] ----*/
 239|        case 'c':
 240|          p[0] = va_arg(va,int);
 241|          p[1] = '\0';
 242|          break;
 243|
 244|        /*---- [%d] ----*/
 245|        case 'd':
 246|          _itoa( va_arg(va,int), p, 10 );
 247|          break;
 248|
 249|        /*---- [%s] ----*/
 250|        case 's':
 251|          StdX_strcpy( p, va_arg(va,char*) );
 252|          break;
 253|
 254|        /*---- [%X] ----*/
 255|        case 'X':
 256|          _utoa( va_arg(va,int), p, 16 );
 257|          break;
 258|
 259|        /*---- [%x] ----*/
 260|        case 'x':
 261|          _utoa( va_arg(va,int), p, 16 );
 262|          for ( pp = p; *pp != '\0'; pp++ ) {
 263|            if ( *pp >= 'A' && *pp <= 'F' )
 264|              *pp += 0x20;
 265|          }
 266|          break;
 267|
 268|        /*---- [%p] ----*/
 269|        case 'p':
 270|          _utoa( va_arg(va,int), p, 16 );
 271|          keta = 8;  bZeroPad = 1;
 272|          break;
 273|
 274|        default:
 275|          /*ERRORS_NOT_SUPPORT();*/
 276|          break;
 277|      }
 278|
 279|      /* 桁合わせ */
 280|      if ( keta == 1 ) {
 281|        p = StdX_strchr( p, '\0' );
 282|      }
 283|      else {
 284|        int   n, plus;
 285|
 286|        pp = StdX_strchr( p, '\0' );
 287|        n = pp - p;
 288|        plus = keta - n;
 289|
 290|        if ( plus > 0 ) {
 291|          char*  p1 = p + n;    /* 元 */
 292|          char*  p2 = p + keta; /* 先 */
 293|
 294|          do {
 295|            *p2 = *p1;  p2--;  p1--;
 296|          } while ( p1 >= p );
 297|          StdX_memset( p, ( bZeroPad ? '0' : ' ' ), plus );
 298|          p += keta;
 299|        }
 300|        else
 301|          p = pp;
 302|      }
 303|
 304|      /* 次のフォーマットへ */
 305|      fmt++;
 306|    }
 307|  }
 308|  *p = '\0';
 309|
 310|  return  p - s - 1;
 311|}
 312|#endif
 313|
 314|
 315| 
 316|/***********************************************************************
 317|*  13. <<< [StdX_rand,StdX_srand] 乱数発生 >>> 
 318|*【補足】
 319|*・StdX_srand でジェネレータを初期化してから、StdX_rand で乱数を取得します。
 320|*・StdX_srand の引数は、時刻(time_t 型)にするのが一般的です。
 321|*・StdX_rand の返り値は、0〜STDX_RAND_MAX の整数です。
 322|*・0〜nまでの整数の乱数を取得するには、StdX_rand の返り値を r として、
 323|*  r % (n+1) のように計算します。
 324|*・参考:http://www.safety.genv.nagoya-u.ac.jp/hattori/program/program.htm
 325|************************************************************************/
 326|int  StdX_rand_seed = 0;
 327|
 328|void  StdX_srand( unsigned int seed )
 329|{
 330|  StdX_rand_seed = (int)seed;
 331|}
 332|
 333|int  StdX_rand()
 334|{
 335|  enum {
 336|    multi =  843314861,
 337|    add   =  453816693
 338|  };
 339|
 340|  int  n;
 341|
 342|  n = StdX_rand_seed;
 343|
 344|  n = multi * n + add;
 345|
 346|  if ( n < 0 )
 347|    n &= 0x7FFFFFFF;
 348|
 349|  StdX_rand_seed = n;
 350|
 351|  return  StdX_rand_seed = n;
 352|}
 353|
 354|
 355|
 356|
 357| 
 358|/**************************************************************************
 359|*  14. <<< GHS SDV ダミー関数 >>> 
 360|*【補足】
 361|*・undefined リンクエラーを回避します。
 362|***************************************************************************/
 363|#if 0
 364|#ifdef FOR_GHSSDV
 365|void  _exit()
 366|{
 367|  #ifdef  FOR_GHS
 368|    __asm("jal exit");
 369|  #endif
 370|  #ifdef  FOR_GNU
 371|    asm("jal exit");
 372|  #endif
 373|  #ifndef  FOR_GHS
 374|   #ifndef  FOR_GNU
 375|    ASSERT(1);
 376|   #endif
 377|  #endif
 378|}
 379|void  __gh_set_errno()
 380|{
 381|  #ifndef NDEBUG
 382|    error();
 383|  #endif
 384|}
 385|void  creat()
 386|{
 387|  #ifndef NDEBUG
 388|    error();
 389|  #endif
 390|}
 391|int  system(const char* s)
 392|{
 393|  #ifndef NDEBUG
 394|    error();
 395|  #endif
 396|}
 397|void*  memset( void* dec, int ch, size_t n )
 398|{
 399|  return  StdX_memset( dec,ch,n );
 400|}
 401|#endif
 402|#endif
 403| 
 404|