#include <perms.h>
void Impstrcat(unsigned char *Dst, unsigned char *Src, int Len) {
  int I;
  int Count;
  unsigned char Dlen;
  unsigned char Slen;
  unsigned char *Srcx;
  unsigned char *Dstx;
  if (Len == 0) Len = Maxlenimpstring;
  Dlen = *Dst;
  Slen = *Src;
  if (Slen + Dlen > Len) _imp_signal(6, 1, 1, _imp_str_literal(""));
  Count = Slen;
  Dlen += Count;
  Dstx = Byteinteger(Addr(*Dst));
  *Dstx = Dlen;
  for (I = 1; I <= Count; I++) {
    Srcx = Byteinteger(Addr(*Src) + I);
    Dstx = Byteinteger(Addr(*Dst) + (Dlen - Count) + I);
    *Dstx = *Srcx;
  }
}
int Impstrcmp(unsigned char *L, unsigned char *R) {
  int Lcount;
  int Rcount;
  int Index;
  unsigned char Lx;
  unsigned char Rx;
  Lcount = *L;
  Rcount = *R;
  Index = 1;
  while ((Lcount > 0) && (Rcount > 0)) {
    Lx = *Byteinteger(Addr(*L) + Index);
    Rx = *Byteinteger(Addr(*R) + Index);
    if (Lx > Rx) return (1);
    if (Rx > Lx) return (-1);
    Index++;
    Lcount--;
    Rcount--;
  }
  if (Lcount > 0) return (1);
  if (Rcount > 0) return (-1);
  return (0);
}
void Impstrcpy(unsigned char *Dst, unsigned char *Src, int Len) {
  int I;
  int Count;
  unsigned char Dlen;
  unsigned char Slen;
  unsigned char *Srcx;
  unsigned char *Dstx;
  if (Len == 0) Len = Maxlenimpstring;
  Dlen = 0;
  Slen = *Src;
  if (Slen > Len) _imp_signal(6, 1, 2, _imp_str_literal(""));
  Count = Slen;
  Dlen += Count;
  Dstx = Byteinteger(Addr(*Dst));
  *Dstx = Dlen;
  for (I = 1; I <= Count; I++) {
    Srcx = Byteinteger(Addr(*Src) + I);
    Dstx = Byteinteger(Addr(*Dst) + I);
    *Dstx = *Srcx;
  }
}
void Impstrjam(unsigned char *Dst, unsigned char *Src, int Len) {
  int I;
  int Count;
  unsigned char Slen;
  unsigned char Dlen;
  unsigned char *Srcx;
  unsigned char *Dstx;
  if (Len == 0) Len = Maxlenimpstring;
  Dlen = *Dst;
  Slen = *Src;
  if (Slen > Len)
    Count = Len;
  else
    Count = Slen;
  Dlen = Count;
  Dstx = Byteinteger(Addr(*Dst));
  *Dstx = Dlen;
  for (I = 1; I <= Count; I++) {
    Srcx = Byteinteger(Addr(*Src) + I);
    Dstx = Byteinteger(Addr(*Dst) + I);
    *Dstx = *Srcx;
  }
}
void Impstrjcat(unsigned char *Dst, unsigned char *Src, int Len) {
  int I;
  int Count;
  unsigned char Dlen;
  unsigned char Slen;
  unsigned char *Srcx;
  unsigned char *Dstx;
  if (Len == 0) Len = Maxlenimpstring;
  Dlen = *Dst;
  Slen = *Src;
  if ((Dlen + Slen) > Len)
    Count = Len - Dlen;
  else
    Count = Slen;
  Dlen += Count;
  Dstx = Byteinteger(Addr(*Dst));
  *Dstx = Dlen;
  for (I = 1; I <= Count; I++) {
    Srcx = Byteinteger(Addr(*Src) + I);
    Dstx = Byteinteger(Addr(*Dst) + (Dlen - Count) + I);
    *Dstx = *Srcx;
  }
}
int Impstrres(unsigned char *C, unsigned char *B, unsigned char *A,
              unsigned char *S) {
  int Index;
  int Count;
  int I;
  unsigned char Slen;
  unsigned char Alen;
  unsigned char Blen;
  unsigned char Clen;
  unsigned char *Sx;
  unsigned char *Ax;
  unsigned char *Bx;
  unsigned char *Cx;
  Sx = Byteinteger(Addr(*S));
  Bx = Byteinteger(Addr(*B));
  Slen = *S;
  Blen = *B;
  Alen = 0;
  if (Addr(*A) != 0) {
    Ax = Byteinteger(Addr(*A));
    *Ax = Alen;
  }
  Clen = 0;
  if (Addr(*C) != 0) {
    Cx = Byteinteger(Addr(*C));
    *Cx = Clen;
  }
  if (Blen > Slen) return (0);
  Index = 1;
  while ((Index + Blen) <= Slen + 1) {
    Count = 0;
    while (Count <= Blen) {
      Sx = Byteinteger(Addr(*S) + Index + Count);
      Bx = Byteinteger(Addr(*B) + 1 + Count);
      if (*Sx != *Bx) break;
      Count++;
    }
    if (Count == Blen) {
      if (Addr(*A) != 0) {
        Alen = Index - 1;
        Ax = Byteinteger(Addr(*A));
        *Ax = Alen;
        for (I = 1; I <= Alen; I++) {
          Sx = Byteinteger(Addr(*S) + I);
          Ax = Byteinteger(Addr(*A) + I);
          *Ax = *Sx;
        }
      }
      if (Addr(*C) != 0) {
        Clen = (Slen - (Alen + Blen));
        Cx = Byteinteger(Addr(*C));
        *Cx = Clen;
        for (I = 1; I <= Clen; I++) {
          Sx = Byteinteger(Addr(*S) + I + Alen + Blen);
          Cx = Byteinteger(Addr(*C) + I);
          *Cx = *Sx;
        }
      }
      return (1);
    }
    Index++;
  }
  if (Addr(*A) != 0)
    for (Count = 0; Count <= Slen; Count++) {
      Sx = Byteinteger(Addr(*S) + Count);
      Ax = Byteinteger(Addr(*A) + Count);
      *Ax = *Sx;
    }
  return (0);
}
