- /* strlen: return length of s */
- int strlen(char s[])
- {
- int i;
- while (s[i] != '/0')
- ++i;
- return i;
- }
- /* strlen: return length of string s */
- int strlen(char *s)
- {
- int n;
- for (n = 0; *s != '/0', s++)
- n++;
- return n;
- }
- /* strcpy: copy t to s; array subscript version */
- void strcpy(char *s, char *t)
- {
- int i;
- i = 0;
- while ((s[i] = t[i]) != '/0')
- i++;
- }
- /* strcpy: copy t to s; pointer version */
- void strcpy(char *s, char *t)
- {
- int i;
- i = 0;
- while ((*s = *t) != '/0') {
- s++;
- t++;
- }
- }
- /* strcpy: copy t to s; pointer version 2 */
- void strcpy(char *s, char *t)
- {
- while ((*s++ = *t++) != '/0')
- ;
- }
- /* strcmp: return <0 if s<t, 0 if s==t, >0 if s>t */
- int strcmp(char *s, char *t)
- {
- int i;
- for (i = 0; s[i] == t[i]; i++)
- if (s[i] == '/0')
- return 0;
- return s[i] - t[i];
- }
- /* strcmp: return <0 if s<t, 0 if s==t, >0 if s>t */
- int strcmp(char *s, char *t)
- {
- for ( ; *s == *t; s++, t++)
- if (*s == '/0')
- return 0;
- return *s - *t;
- }
- /* squeeze: delete all c from s */
- void squeeze(char s[], int c)
- {
- int i, j;
- for (i = j = 0; s[i] != '/0'; i++)
- if (s[i] != c)
- s[j++] = s[i];
- s[j] = '/0';
- }
- /* strcat: concatenate t to end of s; s must be big enough */
- void strcat(char s[], char t[])
- {
- int i, j;
- i = j = 0;
- while (s[i] != '/0') /* find end of s */
- i++;
- while ((s[i++] = t[j++]) != '/0') /* copy t */
- ;
- }
- // returns the (right adjusted) n-bit field of x that begins at position p
- /* getbits: get n bits from position p */
- unsigned getbits(unsigned x, int p, int n)
- {
- return (x >> (p+1-n)) & ~(~0 << n);
- }
- /* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */
- int binsearch(int x, int v[], int n)
- {
- int low, high, mid;
- low = 0;
- high = n - 1;
- while (low <= high) {
- mid = (low+high)/2;
- if (x < v[mid])
- high = mid + 1;
- else if (x > v[mid])
- low = mid + 1;
- else /* found match */
- return mid;
- }
- return -1; /* no match */
- }
- #include <ctype.h>
- /* atoi: convert s to integer; version 2 */
- int atoi(char s[])
- {
- int i, n, sign;
- for (i = 0; isspace(s[i]); i++) /* skip white space */
- ;
- sign = (s[i] == '-') ? -1 : 1;
- if (s[i] == '+' || s[i] == '-') /* skip sign */
- i++;
- for (n = 0; isdigit(s[i]); i++)
- n = 10 * n + (s[i] - '0');
- return sign * n;
- }
- /* shellsort: sort v[0]...v[n-1] into increasing order */
- void shellsort(int v[], int n)
- {
- int gap, i, j, temp;
- for (gap = n/2; gap > 0; gap /= 2)
- for (i = gap; i < n; i++)
- for (j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) {
- temp = v[j];
- v[j] = v[j+gap];
- v[j+gap] = temp;
- }
- }
- #include <string.h>
- /* reverse: reverse string s in place */
- void reverse(char s[])
- {
- int c, i, j;
- for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
- }
- /* itoa: convert n to characters in s */
- void itoa(int n, char s[])
- {
- int i, sign;
- if ((sign = n) < 0) /* record sign */
- n = -n; /* make n positive */
- i = 0;
- do { /* generate digits in reverse order */
- s[i++] = n % 10 + '0'; /* get next digit */
- } while ((n /= 10) > 0); /* delete it */
- if (sign < 0)
- s[i++] = '-';
- s[i] = '/0';
- reverse(s);
- }
- #include <ctype.h>
- /* atof: convert string s to double */
- double atof(char s[])
- {
- double val, power;
- int i, sign;
- for (i = 0; isspace(s[i]); i++) /* skip white space */
- ;
- sign = (s[i] == '-') ? -1 : 1;
- if (s[i] == '+' || s[i] == '-')
- i++;
- for (val = 0.0; isdigit(s[i]); i++)
- val = 10.0 * val + (s[i] - '0');
- if (s[i] == '.')
- i++;
- for (power = 1.0; isdigit(s[i]); i++) {
- val = 10.0 * val + (s[i] - '0');
- power *= 10;
- }
- return sign * val / power;
- }
- /* qsort: sort v[left]...v[right] into increasing order */
- void qsort(int v[], int left, int right)
- {
- int i, last;
- void swap(int v[], int i, int j);
- if (left >= right) /* do nothing if array contains */
- return; /* fewer than two elements */
- swap(v, left, (left + right)/2); /* move partition elem */
- last = left; /* to v[0] */
- for (i = left + 1; i <= right; i++) /* partition */
- if (v[i] < v[left])
- swap(v, ++last, i);
- swap(v, left, last); /* restore partition elem */
- qsort(v, left, last-1);
- qsort(v, last+1, right);
- }
- /* swap: interchange v[i] and v[j] */
- void swap(int v[], int i, int j)
- {
- int temp;
- temp = v[i];
- v[i] = v[j];
- v[j] = temp;
- }
- /* trim: remove trailing blanks, tabs, newlines */
- int trim(char s[])
- {
- int n;
- for (n = strlen(s)-1; n >= 0; n--)
- if (s[n] != ' ' && s[n] != '/t' && s[n] != '/n')
- break;
- s[n+1] = '/0';
- return n;
- }
- void itob(int n, char s[], int b)
- {
- int i = 0, j , sign;
- if( ( sign = n ) < 0 )
- n = - n;
- do
- {
- j = n % b;
- s[i++] = ( j <= 9 )?j+'0':j-10+'a';
- }while( ( n/=b ) > 0 );
- if( sign < 0 )
- s[i++]='-';
- s[i] = '/0';
- reverse(s);
- }