OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

[/] [plasma/] [trunk/] [kernel/] [libc.c] - Blame information for rev 245

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 138 rhoads
/*--------------------------------------------------------------------
2
 * TITLE: ANSI C Library
3
 * AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
 * DATE CREATED: 12/17/05
5 171 rhoads
 * FILENAME: libc.c
6 138 rhoads
 * PROJECT: Plasma CPU core
7
 * COPYRIGHT: Software placed into the public domain by the author.
8
 *    Software 'as is' without warranty.  Author liable for nothing.
9
 * DESCRIPTION:
10
 *    Subset of the ANSI C library
11
 *--------------------------------------------------------------------*/
12
#define NO_ELLIPSIS
13
#include "rtos.h"
14
 
15
 
16
char *strcpy(char *dst, const char *src)
17
{
18
   int c;
19
   do
20
   {
21
      c = *dst++ = *src++;
22
   } while(c);
23
   return dst;
24
}
25
 
26
 
27
char *strncpy(char *dst, const char *src, int count)
28
{
29
   int c=1;
30
   while(count-- > 0 && c)
31
      c = *dst++ = *src++;
32
   *dst = 0;
33
   return dst;
34
}
35
 
36
 
37
char *strcat(char *dst, const char *src)
38
{
39
   int c;
40
   while(*dst)
41
      ++dst;
42
   do
43
   {
44
      c = *dst++ = *src++;
45
   } while(c);
46
   return dst;
47
}
48
 
49
 
50
char *strncat(char *dst, const char *src, int count)
51
{
52
   int c=1;
53
   while(*dst && --count > 0)
54
      ++dst;
55
   while(--count > 0 && c)
56
      c = *dst++ = *src++;
57
   *dst = 0;
58
   return dst;
59
}
60
 
61
 
62
int strcmp(const char *string1, const char *string2)
63
{
64
   int diff, c;
65
   for(;;)
66
   {
67
      diff = *string1++ - (c = *string2++);
68
      if(diff)
69
         return diff;
70
      if(c == 0)
71
         return 0;
72
   }
73
}
74
 
75
 
76
int strncmp(const char *string1, const char *string2, int count)
77
{
78
   int diff, c;
79
   while(count-- > 0)
80
   {
81
      diff = *string1++ - (c = *string2++);
82
      if(diff)
83
         return diff;
84
      if(c == 0)
85
         return 0;
86
   }
87
   return 0;
88
}
89
 
90
 
91 149 rhoads
char *strstr(const char *string, const char *find)
92 138 rhoads
{
93
   int i;
94
   for(;;)
95
   {
96
      for(i = 0; string[i] == find[i] && find[i]; ++i) ;
97
      if(find[i] == 0)
98 149 rhoads
         return (char*)string;
99 138 rhoads
      if(*string++ == 0)
100
         return NULL;
101
   }
102
}
103
 
104
 
105
int strlen(const char *string)
106
{
107
   const char *base=string;
108
   while(*string++) ;
109
   return string - base - 1;
110
}
111
 
112
 
113
void *memcpy(void *dst, const void *src, unsigned long bytes)
114
{
115
   uint8 *Dst = (uint8*)dst;
116
   uint8 *Src = (uint8*)src;
117
   while((int)bytes-- > 0)
118
      *Dst++ = *Src++;
119
   return dst;
120
}
121
 
122
 
123 144 rhoads
void *memmove(void *dst, const void *src, unsigned long bytes)
124
{
125
   uint8 *Dst = (uint8*)dst;
126
   uint8 *Src = (uint8*)src;
127
   if(Dst < Src)
128
   {
129
      while((int)bytes-- > 0)
130
         *Dst++ = *Src++;
131
   }
132
   else
133
   {
134
      Dst += bytes;
135
      Src += bytes;
136
      while((int)bytes-- > 0)
137
         *--Dst = *--Src;
138
   }
139
   return dst;
140
}
141
 
142
 
143 138 rhoads
int memcmp(const void *cs, const void *ct, unsigned long bytes)
144
{
145
   uint8 *Dst = (uint8*)cs;
146
   uint8 *Src = (uint8*)ct;
147
   int diff;
148
   while((int)bytes-- > 0)
149
   {
150
      diff = *Dst++ - *Src++;
151
      if(diff)
152
         return diff;
153
   }
154
   return 0;
155
}
156
 
157
 
158
void *memset(void *dst, int c, unsigned long bytes)
159
{
160
   uint8 *Dst = (uint8*)dst;
161
   while((int)bytes-- > 0)
162
      *Dst++ = (uint8)c;
163
   return dst;
164
}
165
 
166
 
167
int abs(int n)
168
{
169
   return n>=0 ? n : -n;
170
}
171
 
172
 
173
static uint32 Rand1=0x1f2bcda3, Rand2=0xdeafbeef, Rand3=0xc5134306;
174 149 rhoads
int rand(void)
175 138 rhoads
{
176
   int shift;
177
   Rand1 += 0x13423123 + Rand2;
178
   Rand2 += 0x2312fdea + Rand3;
179
   Rand3 += 0xf2a12de1;
180
   shift = Rand3 & 31;
181
   Rand1 = (Rand1 << (32 - shift)) | (Rand1 >> shift);
182
   Rand3 ^= Rand1;
183
   shift = (Rand3 >> 8) & 31;
184
   Rand2 = (Rand2 << (32 - shift)) | (Rand2 >> shift);
185
   return Rand1;
186
}
187
 
188
 
189
void srand(unsigned int seed)
190
{
191
   Rand1 = seed;
192
}
193
 
194
 
195
long strtol(const char *s, const char **end, int base)
196
{
197
   int i;
198
   unsigned long ch, value=0, neg=0;
199
 
200
   if(s[0] == '-')
201
   {
202
      neg = 1;
203
      ++s;
204
   }
205
   if(s[0] == '0' && s[1] == 'x')
206
   {
207
      base = 16;
208
      s += 2;
209
   }
210
   for(i = 0; i <= 8; ++i)
211
   {
212
      ch = *s++;
213
      if('0' <= ch && ch <= '9')
214
         ch -= '0';
215
      else if('A' <= ch && ch <= 'Z')
216
         ch = ch - 'A' + 10;
217
      else if('a' <= ch && ch <= 'z')
218
         ch = ch - 'a' + 10;
219
      else
220
         break;
221
      value = value * base + ch;
222
   }
223
   if(end)
224
      *end = s - 1;
225
   if(neg)
226
      value = -(int)value;
227
   return value;
228
}
229
 
230
 
231
int atoi(const char *s)
232
{
233
   return strtol(s, NULL, 10);
234
}
235
 
236
 
237 149 rhoads
char *itoa(int num, char *dst, int base)
238 138 rhoads
{
239 149 rhoads
   int digit, negate=0, place;
240
   char c, text[20];
241 138 rhoads
 
242
   if(base == 10 && num < 0)
243
   {
244
      num = -num;
245
      negate = 1;
246
   }
247 149 rhoads
   text[16] = 0;
248
   for(place = 15; place >= 0; --place)
249 138 rhoads
   {
250 187 rhoads
      digit = (unsigned int)num % (unsigned int)base;
251 149 rhoads
      if(num == 0 && place < 15 && base == 10 && negate)
252 138 rhoads
      {
253 149 rhoads
         c = '-';
254 138 rhoads
         negate = 0;
255
      }
256
      else if(digit < 10)
257
         c = (char)('0' + digit);
258
      else
259
         c = (char)('a' + digit - 10);
260 149 rhoads
      text[place] = c;
261
      num = (unsigned int)num / (unsigned int)base;
262
      if(num == 0 && negate == 0)
263
         break;
264 138 rhoads
   }
265 149 rhoads
   strcpy(dst, text + place);
266
   return dst;
267 138 rhoads
}
268
 
269
 
270
int sprintf(char *s, const char *format,
271
            int arg0, int arg1, int arg2, int arg3,
272
            int arg4, int arg5, int arg6, int arg7)
273
{
274
   int argv[8];
275
   int argc=0, width, length;
276 187 rhoads
   char f, text[20], fill;
277 138 rhoads
 
278
   argv[0] = arg0; argv[1] = arg1; argv[2] = arg2; argv[3] = arg3;
279
   argv[4] = arg4; argv[5] = arg5; argv[6] = arg6; argv[7] = arg7;
280
 
281
   for(;;)
282
   {
283
      f = *format++;
284
      if(f == 0)
285
         return argc;
286
      else if(f == '%')
287
      {
288
         width = 0;
289 187 rhoads
         fill = ' ';
290 138 rhoads
         f = *format++;
291 187 rhoads
         while('0' <= f && f <= '9')
292 138 rhoads
         {
293 187 rhoads
            width = width * 10 + f - '0';
294 138 rhoads
            f = *format++;
295
         }
296 187 rhoads
         if(f == '.')
297
         {
298
            fill = '0';
299
            f = *format++;
300
         }
301
         if(f == 0)
302
            return argc;
303 138 rhoads
 
304
         if(f == 'd')
305 149 rhoads
         {
306 187 rhoads
            memset(s, fill, width);
307 149 rhoads
            itoa(argv[argc++], text, 10);
308
            length = (int)strlen(text);
309
            if(width < length)
310
               width = length;
311
            strcpy(s + width - length, text);
312
         }
313 138 rhoads
         else if(f == 'x' || f == 'f')
314 149 rhoads
         {
315
            memset(s, '0', width);
316
            itoa(argv[argc++], text, 16);
317
            length = (int)strlen(text);
318
            if(width < length)
319
               width = length;
320
            strcpy(s + width - length, text);
321
         }
322 138 rhoads
         else if(f == 'c')
323
         {
324
            *s++ = (char)argv[argc++];
325
            *s = 0;
326
         }
327
         else if(f == 's')
328
         {
329
            length = strlen((char*)argv[argc]);
330
            if(width > length)
331
            {
332
               memset(s, ' ', width - length);
333
               s += width - length;
334
            }
335
            strcpy(s, (char*)argv[argc++]);
336
         }
337
         s += strlen(s);
338
      }
339
      else if(f == '\\')
340
      {
341
         f = *format++;
342
         if(f == 0)
343
            return argc;
344
         else if(f == 'n')
345
            *s++ = '\n';
346
         else if(f == 'r')
347
            *s++ = '\r';
348
         else if(f == 't')
349
            *s++ = '\t';
350
      }
351
      else
352
      {
353
         *s++ = f;
354
      }
355
      *s = 0;
356
   }
357
}
358
 
359
 
360
int sscanf(const char *s, const char *format,
361
           int arg0, int arg1, int arg2, int arg3,
362
           int arg4, int arg5, int arg6, int arg7)
363
{
364
   int argv[8];
365 187 rhoads
   int argc=0;
366
   char f, *ptr;
367 138 rhoads
 
368
   argv[0] = arg0; argv[1] = arg1; argv[2] = arg2; argv[3] = arg3;
369
   argv[4] = arg4; argv[5] = arg5; argv[6] = arg6; argv[7] = arg7;
370
 
371
   for(;;)
372
   {
373
      if(*s == 0)
374
         return argc;
375
      f = *format++;
376
      if(f == 0)
377
         return argc;
378
      else if(f == '%')
379
      {
380
         while(isspace(*s))
381
            ++s;
382
         f = *format++;
383
         if(f == 0)
384
            return argc;
385
         if(f == 'd')
386
            *(int*)argv[argc++] = strtol(s, &s, 10);
387
         else if(f == 'x')
388
            *(int*)argv[argc++] = strtol(s, &s, 16);
389
         else if(f == 'c')
390
            *(char*)argv[argc++] = *s++;
391
         else if(f == 's')
392
         {
393 207 rhoads
            ptr = (char*)argv[argc++];
394 187 rhoads
            while(!isspace(*s))
395
               *ptr++ = *s++;
396
            *ptr = 0;
397 138 rhoads
         }
398
      }
399
      else
400
      {
401
         if(f == '\\')
402
         {
403
            f = *format++;
404
            if(f == 0)
405
               return argc;
406
            else if(f == 'n')
407
               f = '\n';
408
            else if(f == 'r')
409
               f = '\r';
410
            else if(f == 't')
411
               f = '\t';
412
         }
413
         while(*s && *s != f)
414
            ++s;
415
         if(*s)
416
            ++s;
417
      }
418
   }
419
}
420
 
421 149 rhoads
 
422 171 rhoads
#ifdef INCLUDE_DUMP
423
/*********************** dump ***********************/
424 149 rhoads
void dump(const unsigned char *data, int length)
425
{
426
   int i, index=0, value;
427
   char string[80];
428
   memset(string, 0, sizeof(string));
429
   for(i = 0; i < length; ++i)
430
   {
431
      if((i & 15) == 0)
432
      {
433
         if(strlen(string))
434
            printf("%s\n", string);
435
         printf("%4x ", i);
436
         memset(string, 0, sizeof(string));
437
         index = 0;
438
      }
439
      value = data[i];
440
      printf("%2x ", value);
441
      if(isprint(value))
442
         string[index] = (char)value;
443
      else
444
         string[index] = '.';
445
      ++index;
446
   }
447
   for(; index < 16; ++index)
448
      printf("   ");
449
   printf("%s\n", string);
450
}
451 171 rhoads
#endif //INCLUDE_DUMP
452 149 rhoads
 
453
 
454 171 rhoads
#ifdef INCLUDE_QSORT
455 187 rhoads
#define QSORT_SIZE 256
456 171 rhoads
/*********************** qsort ***********************/
457
static void QsortSwap(char *base, long left, long right, long size)
458
{
459 187 rhoads
   char buffer[QSORT_SIZE];
460 171 rhoads
   memcpy(buffer, &base[left*size], size);
461
   memcpy(&base[left*size], &base[right*size], size);
462
   memcpy(&base[right*size], buffer, size);
463
}
464 149 rhoads
 
465 171 rhoads
 
466
//Modified from K&R
467
static void qsort2(void *base, long left, long right, long size,
468
      int (*cmp)(const void *,const void *))
469
{
470
   int i, last;
471 187 rhoads
   char *base2=(char*)base, *pivot;
472 171 rhoads
   if(left >= right)
473
      return;
474
   QsortSwap(base2, left, (left + right)/2, size);
475
   last = left;
476 187 rhoads
   pivot = &base2[left*size];
477 171 rhoads
   for(i = left + 1; i <= right; ++i)
478
   {
479 187 rhoads
      if(cmp(&base2[i*size], pivot) < 0)
480 171 rhoads
         QsortSwap(base2, ++last, i, size);
481
   }
482
   QsortSwap(base2, left, last, size);
483
   qsort2(base, left, last-1, size, cmp);
484
   qsort2(base, last+1, right, size, cmp);
485
}
486
 
487
 
488
void qsort(void *base,
489
           long n,
490
           long size,
491
           int (*cmp)(const void *,const void *))
492
{
493 187 rhoads
   if(size > QSORT_SIZE)
494
   {
495
      printf("qsort_error");
496
      return;
497
   }
498 171 rhoads
   qsort2(base, 0, n-1, size, cmp);
499
}
500
 
501
 
502
void *bsearch(const void *key,
503
              const void *base,
504
              long n,
505
              long size,
506
              int (*cmp)(const void *,const void *))
507
{
508
   long cond, low=0, high=n-1, mid;
509
   char *base2=(char*)base;
510
   while(low <= high)
511
   {
512
      mid = (low + high)/2;
513
      cond = cmp(key, &base2[mid*size]);
514
      if(cond < 0)
515
         high = mid - 1;
516
      else if(cond > 0)
517
         low = mid + 1;
518
      else
519
         return &base2[mid * size];
520
   }
521 187 rhoads
   return NULL;
522 171 rhoads
}
523
#endif //INCLUDE_QSORT
524
 
525
 
526
#ifdef INCLUDE_TIMELIB
527
/************************* time.h ***********************/
528
#define SEC_PER_YEAR (365L*24*60*60)
529
#define SEC_PER_DAY (24L*60*60)
530
//typedef unsigned long time_t;  //start at 1/1/80
531
//struct tm {
532
//   int tm_sec;      //(0,59)
533
//   int tm_min;      //(0,59)
534
//   int tm_hour;     //(0,23)
535
//   int tm_mday;     //(1,31)
536
//   int tm_mon;      //(0,11)
537 187 rhoads
//   int tm_year;     //(0,n) from 1900
538 171 rhoads
//   int tm_wday;     //(0,6)     calculated
539
//   int tm_yday;     //(0,365)   calculated
540 199 rhoads
//   int tm_isdst;    //hour adjusted for day light savings
541 171 rhoads
//};
542
static const unsigned short DaysUntilMonth[]=
543
   {0,31,59,90,120,151,181,212,243,273,304,334,365};
544
static const unsigned short DaysInMonth[]=
545
   {31,28,31,30,31,30,31,31,30,31,30,31};
546 187 rhoads
static time_t DstTimeIn, DstTimeOut;
547 171 rhoads
 
548 199 rhoads
 
549
/* Leap year if divisible by 4.  Centenary years should only be
550
   leap-years if they were divisible by 400. */
551 171 rhoads
static int IsLeapYear(int year)
552
{
553
   return(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
554
}
555
 
556
time_t mktime(struct tm *tp)
557
{
558
   time_t seconds;
559
   unsigned long days, y, year;
560
 
561
   days = tp->tm_mday - 1 + DaysUntilMonth[tp->tm_mon] +
562
      365 * (tp->tm_year - 80);
563
   seconds = (unsigned long)tp->tm_sec + 60L * (tp->tm_min +
564
      60L * (tp->tm_hour + 24L * days));
565 199 rhoads
   if(tp->tm_isdst)
566
      seconds -= 60 * 60;
567 171 rhoads
   year = 1900 + tp->tm_year - (tp->tm_mon < 2);
568
   for(y = 1980; y <= year; y += 4)
569
   {
570
      if(y % 100 != 0 || y % 400 == 0)
571
         seconds += SEC_PER_DAY;
572
   }
573
   return seconds;
574
}
575
 
576 187 rhoads
 
577 171 rhoads
void gmtime_r(const time_t *tp, struct tm *out)
578
{
579 187 rhoads
   time_t seconds, delta, secondsIn=*tp;
580
   int isLeapYear;
581 171 rhoads
   unsigned long year, month;
582
 
583 187 rhoads
   out->tm_isdst = 0;
584
   if(DstTimeIn <= secondsIn && secondsIn < DstTimeOut)
585
   {
586 199 rhoads
      secondsIn += 60 * 60;
587 187 rhoads
      out->tm_isdst = 1;
588
   }
589
   seconds = secondsIn;
590 171 rhoads
   for(year = 0; ; ++year)
591
   {
592
      delta = SEC_PER_YEAR + IsLeapYear(1980 + year) * SEC_PER_DAY;
593
      if(seconds >= delta)
594
         seconds -= delta;
595
      else
596
         break;
597
   }
598 187 rhoads
   out->tm_year = year + 80;
599 171 rhoads
   isLeapYear = IsLeapYear(1980 + year);
600
   for(month = 0; ; ++month)
601
   {
602
      delta = SEC_PER_DAY * (DaysInMonth[month] + (isLeapYear && (month == 1)));
603
      if(seconds >= delta)
604
         seconds -= delta;
605
      else
606
         break;
607
   }
608
   out->tm_mon = month;
609
   out->tm_mday = seconds / SEC_PER_DAY;
610 187 rhoads
   out->tm_yday = DaysUntilMonth[month] + out->tm_mday;
611 171 rhoads
   seconds -= out->tm_mday * SEC_PER_DAY;
612 187 rhoads
   ++out->tm_mday;
613 171 rhoads
   out->tm_hour = seconds / (60 * 60);
614
   seconds -= out->tm_hour * (60 * 60);
615
   out->tm_min = seconds / 60;
616
   seconds -= out->tm_min * 60;
617
   out->tm_sec = seconds;
618 187 rhoads
   seconds = secondsIn % (SEC_PER_DAY * 7);
619
   out->tm_wday = (seconds / SEC_PER_DAY + 2) % 7; /* 1/1/80 is a Tue */
620
   //printf("%4.d/%2.d/%2.d:%2.d:%2.d:%2.d\n", 
621
   //         out->tm_year+1900, out->tm_mon+1, out->tm_mday,
622
   //         out->tm_hour, out->tm_min, out->tm_sec);
623
}
624 171 rhoads
 
625 187 rhoads
 
626
void gmtimeDst(time_t dstTimeIn, time_t dstTimeOut)
627
{
628
   DstTimeIn = dstTimeIn;
629
   DstTimeOut = dstTimeOut;
630 171 rhoads
}
631 199 rhoads
 
632
 
633
//DST from 2am on the second Sunday in March to 2am first Sunday in November
634
void gmtimeDstSet(time_t *tp, time_t *dstTimeIn, time_t *dstTimeOut)
635
{
636
   time_t seconds, timeIn, timeOut;
637
   struct tm tmDate;
638
   int year, days;
639
 
640
   DstTimeIn = 0;
641
   DstTimeOut = 0;
642
   gmtime_r(tp, &tmDate);
643
   year = tmDate.tm_year;
644
 
645
   //March 1, year, 2AM -> second Sunday
646
   tmDate.tm_year = year;
647
   tmDate.tm_mon = 2;
648
   tmDate.tm_mday = 1;
649
   tmDate.tm_hour = 2;
650
   tmDate.tm_min = 0;
651
   tmDate.tm_sec = 0;
652
   seconds = mktime(&tmDate);
653
   gmtime_r(&seconds, &tmDate);
654
   days = 7 - tmDate.tm_wday + 7;
655
   *dstTimeIn = timeIn = seconds + days * SEC_PER_DAY;
656
 
657
   //November 1, year, 2AM -> first Sunday
658
   tmDate.tm_year = year;
659
   tmDate.tm_mon = 10;
660
   tmDate.tm_mday = 1;
661
   tmDate.tm_hour = 2;
662
   tmDate.tm_min = 0;
663
   tmDate.tm_sec = 0;
664
   seconds = mktime(&tmDate);
665
   gmtime_r(&seconds, &tmDate);
666
   days = 7 - tmDate.tm_wday;
667
   *dstTimeOut = timeOut = seconds + days * SEC_PER_DAY;
668
 
669
   DstTimeIn = timeIn;
670
   DstTimeOut = timeOut;
671
}
672 171 rhoads
#endif //INCLUDE_TIMELIB
673
 

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.