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

Subversion Repositories plasma

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

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

powered by: WebSVN 2.1.0

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