コード例 #1
0
ファイル: arscan.c プロジェクト: Eliminater74/remake
int
ar_member_touch (const char *arname, const char *memname)
{
  long int pos = ar_scan (arname, ar_member_pos, memname);
  int fd;
  struct ar_hdr ar_hdr;
  int i;
  unsigned int ui;
  struct stat statbuf;

  if (pos < 0)
    return (int) pos;
  if (!pos)
    return 1;

  fd = open (arname, O_RDWR, 0666);
  if (fd < 0)
    return -3;
  /* Read in this member's header */
  if (lseek (fd, pos, 0) < 0)
    goto lose;
  if (AR_HDR_SIZE != read (fd, &ar_hdr, AR_HDR_SIZE))
    goto lose;
  /* Write back the header, thus touching the archive file.  */
  if (lseek (fd, pos, 0) < 0)
    goto lose;
  if (AR_HDR_SIZE != write (fd, &ar_hdr, AR_HDR_SIZE))
    goto lose;
  /* The file's mtime is the time we we want.  */
  EINTRLOOP (i, fstat (fd, &statbuf));
  if (i < 0)
    goto lose;
#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG) || defined(WINDOWS32)
  /* Advance member's time to that time */
  for (ui = 0; ui < sizeof ar_hdr.ar_date; ui++)
    ar_hdr.ar_date[ui] = ' ';
  sprintf (TOCHAR (ar_hdr.ar_date), "%ld", (long int) statbuf.st_mtime);
#ifdef AIAMAG
  ar_hdr.ar_date[strlen (ar_hdr.ar_date)] = ' ';
#endif
#else
  ar_hdr.ar_date = statbuf.st_mtime;
#endif
  /* Write back this member's header */
  if (lseek (fd, pos, 0) < 0)
    goto lose;
  if (AR_HDR_SIZE != write (fd, &ar_hdr, AR_HDR_SIZE))
    goto lose;
  close (fd);
  return 0;

 lose:
  i = errno;
  close (fd);
  errno = i;
  return -3;
}
コード例 #2
0
ファイル: pousse.c プロジェクト: dbkang/icfp1998
void
printboard(struct config *bp)
{
	int i, j, c;

	fprintf(stderr, "                  +");
	for (i = 0; i < bsize; i++)
		fprintf(stderr, "-");
	fprintf(stderr, "+\n");
	for (i = 0; i < bsize; i++) {
		fprintf(stderr, "%2d: %4d:%d/%4d:%d |", i+1, 
			ROW(bp,i).xscore, ROW(bp,i).xfull, 
			ROW(bp,i).oscore, ROW(bp,i).ofull);
		for (j = 0; j < bsize; j++) {
			c = getpos(bp->board, i*bsize+j);
			fprintf(stderr, "%c", TOCHAR(c));
		}
		fprintf(stderr, "|\n");
	}
	fprintf(stderr, "                  +");
	for (i = 0; i < bsize; i++)
		fprintf(stderr, "-");
	fprintf(stderr, "+\n");
	fprintf(stderr, "                   ");
	for (i = 0; i < bsize; i++)
		fprintf(stderr, "%d", (i+1)%10);
	fprintf(stderr, "\n\n");
	for (i = 0; i < bsize; i++) {
		fprintf(stderr, "%2d: %4d:%d/%4d:%d\n", i+1, 
			COL(bp, i).xscore, COL(bp, i).xfull, 
			COL(bp,i).oscore, COL(bp, i).ofull);
	}
	fprintf(stderr, "score x=%d:%d o=%d:%d\n",
		bp->xscore, bp->xfull,
		bp->oscore, bp->ofull);
}
コード例 #3
0
ファイル: arscan.c プロジェクト: Eliminater74/remake
long int
ar_scan (const char *archive, ar_member_func_t function, const void *arg)
{
#ifdef AIAMAG
  FL_HDR fl_header;
# ifdef AIAMAGBIG
  int big_archive = 0;
  FL_HDR_BIG fl_header_big;
# endif
#endif
  char *namemap = 0;
  int desc = open (archive, O_RDONLY, 0);
  if (desc < 0)
    return -1;
#ifdef SARMAG
  {
    char buf[SARMAG];
    register int nread = read (desc, buf, SARMAG);
    if (nread != SARMAG || memcmp (buf, ARMAG, SARMAG))
      {
        (void) close (desc);
        return -2;
      }
  }
#else
#ifdef AIAMAG
  {
    register int nread = read (desc, &fl_header, FL_HSZ);

    if (nread != FL_HSZ)
      {
        (void) close (desc);
        return -2;
      }
#ifdef AIAMAGBIG
    /* If this is a "big" archive, then set the flag and
       re-read the header into the "big" structure. */
    if (!memcmp (fl_header.fl_magic, AIAMAGBIG, SAIAMAG))
      {
        big_archive = 1;

        /* seek back to beginning of archive */
        if (lseek (desc, 0, 0) < 0)
          {
            (void) close (desc);
            return -2;
          }

        /* re-read the header into the "big" structure */
        nread = read (desc, &fl_header_big, FL_HSZ_BIG);
        if (nread != FL_HSZ_BIG)
          {
            (void) close (desc);
            return -2;
          }
      }
    else
#endif
       /* Check to make sure this is a "normal" archive. */
      if (memcmp (fl_header.fl_magic, AIAMAG, SAIAMAG))
        {
          (void) close (desc);
          return -2;
        }
  }
#else
  {
#ifndef M_XENIX
    int buf;
#else
    unsigned short int buf;
#endif
    register int nread = read (desc, &buf, sizeof (buf));
    if (nread != sizeof (buf) || buf != ARMAG)
      {
        (void) close (desc);
        return -2;
      }
  }
#endif
#endif

  /* Now find the members one by one.  */
  {
#ifdef SARMAG
    register long int member_offset = SARMAG;
#else
#ifdef AIAMAG
    long int member_offset;
    long int last_member_offset;

#ifdef AIAMAGBIG
    if ( big_archive )
      {
        sscanf (fl_header_big.fl_fstmoff, "%20ld", &member_offset);
        sscanf (fl_header_big.fl_lstmoff, "%20ld", &last_member_offset);
      }
    else
#endif
      {
        sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset);
        sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset);
      }

    if (member_offset == 0)
      {
        /* Empty archive.  */
        close (desc);
        return 0;
      }
#else
#ifndef M_XENIX
    register long int member_offset = sizeof (int);
#else   /* Xenix.  */
    register long int member_offset = sizeof (unsigned short int);
#endif  /* Not Xenix.  */
#endif
#endif

    while (1)
      {
        register int nread;
        struct ar_hdr member_header;
#ifdef AIAMAGBIG
        struct ar_hdr_big member_header_big;
#endif
#ifdef AIAMAG
        char name[256];
        int name_len;
        long int dateval;
        int uidval, gidval;
        long int data_offset;
#else
        char namebuf[sizeof member_header.ar_name + 1];
        char *name;
        int is_namemap;         /* Nonzero if this entry maps long names.  */
        int long_name = 0;
#endif
        long int eltsize;
        int eltmode;
        long int fnval;

        if (lseek (desc, member_offset, 0) < 0)
          {
            (void) close (desc);
            return -2;
          }

#ifdef AIAMAG
#define       AR_MEMHDR_SZ(x) (sizeof(x) - sizeof (x._ar_name))

#ifdef AIAMAGBIG
        if (big_archive)
          {
            nread = read (desc, &member_header_big,
                          AR_MEMHDR_SZ(member_header_big) );

            if (nread != AR_MEMHDR_SZ(member_header_big))
              {
                (void) close (desc);
                return -2;
              }

            sscanf (member_header_big.ar_namlen, "%4d", &name_len);
            nread = read (desc, name, name_len);

            if (nread != name_len)
              {
                (void) close (desc);
                return -2;
              }

            name[name_len] = 0;

            sscanf (member_header_big.ar_date, "%12ld", &dateval);
            sscanf (member_header_big.ar_uid, "%12d", &uidval);
            sscanf (member_header_big.ar_gid, "%12d", &gidval);
            sscanf (member_header_big.ar_mode, "%12o", &eltmode);
            sscanf (member_header_big.ar_size, "%20ld", &eltsize);

            data_offset = (member_offset + AR_MEMHDR_SZ(member_header_big)
                           + name_len + 2);
          }
        else
#endif
          {
            nread = read (desc, &member_header,
                          AR_MEMHDR_SZ(member_header) );

            if (nread != AR_MEMHDR_SZ(member_header))
              {
                (void) close (desc);
                return -2;
              }

            sscanf (member_header.ar_namlen, "%4d", &name_len);
            nread = read (desc, name, name_len);

            if (nread != name_len)
              {
                (void) close (desc);
                return -2;
              }

            name[name_len] = 0;

            sscanf (member_header.ar_date, "%12ld", &dateval);
            sscanf (member_header.ar_uid, "%12d", &uidval);
            sscanf (member_header.ar_gid, "%12d", &gidval);
            sscanf (member_header.ar_mode, "%12o", &eltmode);
            sscanf (member_header.ar_size, "%12ld", &eltsize);

            data_offset = (member_offset + AR_MEMHDR_SZ(member_header)
                           + name_len + 2);
          }
        data_offset += data_offset % 2;

        fnval =
          (*function) (desc, name, 0,
                       member_offset, data_offset, eltsize,
                       dateval, uidval, gidval,
                       eltmode, arg);

#else   /* Not AIAMAG.  */
        nread = read (desc, &member_header, AR_HDR_SIZE);
        if (nread == 0)
          /* No data left means end of file; that is OK.  */
          break;

        if (nread != AR_HDR_SIZE
#if defined(ARFMAG) || defined(ARFZMAG)
            || (
# ifdef ARFMAG
                memcmp (member_header.ar_fmag, ARFMAG, 2)
# else
                1
# endif
                &&
# ifdef ARFZMAG
                memcmp (member_header.ar_fmag, ARFZMAG, 2)
# else
                1
# endif
               )
#endif
            )
          {
            (void) close (desc);
            return -2;
          }

        name = namebuf;
        memcpy (name, member_header.ar_name, sizeof member_header.ar_name);
        {
          register char *p = name + sizeof member_header.ar_name;
          do
            *p = '\0';
          while (p > name && *--p == ' ');

#ifndef AIAMAG
          /* If the member name is "//" or "ARFILENAMES/" this may be
             a list of file name mappings.  The maximum file name
             length supported by the standard archive format is 14
             characters.  This member will actually always be the
             first or second entry in the archive, but we don't check
             that.  */
          is_namemap = (!strcmp (name, "//")
                        || !strcmp (name, "ARFILENAMES/"));
#endif  /* Not AIAMAG. */
          /* On some systems, there is a slash after each member name.  */
          if (*p == '/')
            *p = '\0';

#ifndef AIAMAG
          /* If the member name starts with a space or a slash, this
             is an index into the file name mappings (used by GNU ar).
             Otherwise if the member name looks like #1/NUMBER the
             real member name appears in the element data (used by
             4.4BSD).  */
          if (! is_namemap
              && (name[0] == ' ' || name[0] == '/')
              && namemap != 0)
            {
              name = namemap + atoi (name + 1);
              long_name = 1;
            }
          else if (name[0] == '#'
                   && name[1] == '1'
                   && name[2] == '/')
            {
              int namesize = atoi (name + 3);

              name = alloca (namesize + 1);
              nread = read (desc, name, namesize);
              if (nread != namesize)
                {
                  close (desc);
                  return -2;
                }
              name[namesize] = '\0';

              long_name = 1;
            }
#endif /* Not AIAMAG. */
        }

#ifndef M_XENIX
        sscanf (TOCHAR (member_header.ar_mode), "%o", &eltmode);
        eltsize = atol (TOCHAR (member_header.ar_size));
#else   /* Xenix.  */
        eltmode = (unsigned short int) member_header.ar_mode;
        eltsize = member_header.ar_size;
#endif  /* Not Xenix.  */

        fnval =
          (*function) (desc, name, ! long_name, member_offset,
                       member_offset + AR_HDR_SIZE, eltsize,
#ifndef M_XENIX
                       atol (TOCHAR (member_header.ar_date)),
                       atoi (TOCHAR (member_header.ar_uid)),
                       atoi (TOCHAR (member_header.ar_gid)),
#else   /* Xenix.  */
                       member_header.ar_date,
                       member_header.ar_uid,
                       member_header.ar_gid,
#endif  /* Not Xenix.  */
                       eltmode, arg);

#endif  /* AIAMAG.  */

        if (fnval)
          {
            (void) close (desc);
            return fnval;
          }

#ifdef AIAMAG
        if (member_offset == last_member_offset)
          /* End of the chain.  */
          break;

#ifdef AIAMAGBIG
        if (big_archive)
         sscanf (member_header_big.ar_nxtmem, "%20ld", &member_offset);
        else
#endif
          sscanf (member_header.ar_nxtmem, "%12ld", &member_offset);

        if (lseek (desc, member_offset, 0) != member_offset)
          {
            (void) close (desc);
            return -2;
          }
#else

        /* If this member maps archive names, we must read it in.  The
           name map will always precede any members whose names must
           be mapped.  */
        if (is_namemap)
          {
            char *clear;
            char *limit;

            namemap = alloca (eltsize);
            nread = read (desc, namemap, eltsize);
            if (nread != eltsize)
              {
                (void) close (desc);
                return -2;
              }

            /* The names are separated by newlines.  Some formats have
               a trailing slash.  Null terminate the strings for
               convenience.  */
            limit = namemap + eltsize;
            for (clear = namemap; clear < limit; clear++)
              {
                if (*clear == '\n')
                  {
                    *clear = '\0';
                    if (clear[-1] == '/')
                      clear[-1] = '\0';
                  }
              }

            is_namemap = 0;
          }

        member_offset += AR_HDR_SIZE + eltsize;
        if (member_offset % 2 != 0)
          member_offset++;
#endif
      }
  }

  close (desc);
  return 0;
}
コード例 #4
0
ファイル: new.c プロジェクト: hckjsnzf/selflib
int multi_string(char *out, char *sbase, int squarn)
{
	int i,j,k,l, m;
	
	int base_length,tmp_begin;
	int mul,up,leave, imiddle;

	int begin;
	
	char stmp[MAXLENGTH+1];
	char matrix[6][MAXLENGTH+1];
	
	base_length=strlen(sbase);
	memset(stmp, ' ', MAXLENGTH);
	stmp[MAXLENGTH] = '\0';
	
	for(i=base_length-1; i>=0; i--) {
		stmp[MAXLENGTH-(base_length-i)]=sbase[i];
	}
	for(i=1; i<squarn; i++) {
		/* double string  stmpXsbase, result save in stmp */
		for(j=MAXLENGTH; j>=0; j--) {
			if(stmp[j] == ' ') {
				tmp_begin = j+1;
				break;
			}
		}
		
		memset(matrix, ' ', sizeof(matrix));
		for(j=base_length-1; j>=0; j--) {
			up = 0;
			mul = 0;
			leave = 0;
			if( TOINT(sbase[j]) == 0)
				continue;
			
			for(k=MAXLENGTH-1; k>=tmp_begin; k--) {
				mul= TOINT(sbase[j])*TOINT(stmp[k]) +up;
				up=mul/10;
				leave=mul%10;
				matrix[j][k-(base_length-j-1)] = TOCHAR(leave);
			}
			if( up !=0 ) {
				matrix[j][tmp_begin-(base_length-j)] = TOCHAR(up);
			}
		}
		if(up!=0) 
			tmp_begin=tmp_begin-base_length;
		else
			tmp_begin=tmp_begin-base_length+1;
		
		for(l=base_length-1; l>=0; l--){
			for(m=0; m<MAXLENGTH; m++) {
			}
		}
				
		/* count the matrix */

		up = 0;
		for(k=MAXLENGTH-1; k>=tmp_begin; k--) {
			mul = 0;
			leave = 0;
			for(j=base_length-1; j>=0; j--) {
				if(matrix[j][k] == ' ')
					imiddle=0;
				else
					imiddle = TOINT(matrix[j][k]);
				mul += imiddle;
			}
			mul += up;
			up = mul/10;
			leave = mul%10;
			stmp[k] = TOCHAR(leave);
		}
		if( up != 0) {
			stmp[k] = TOCHAR(up);
		}
	}
	
	for(i=0; i<MAXLENGTH; i++) {
		if(stmp[i] != ' ') {
			begin = i;
			break;
		}
	}
	memcpy(out, stmp, MAXLENGTH+1);
	return begin;
}