naorzr

Untitled

Apr 26th, 2017
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.77 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <stdarg.h>
  3. // The functions available from stdio.h are implemented here.
  4. //#include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <sys/syscall.h>
  8.  
  9. #ifdef NULL
  10. #undef NULL
  11. #endif
  12.  
  13. #define NULL 0
  14. #define EOF (-1)
  15. #define BUFSIZ 1024
  16. #define OPEN_MAX 20 /* max # files open at once */
  17.  
  18. struct flags{
  19.     unsigned int _read : 1;
  20.     unsigned int _write : 1;
  21.     unsigned int _unbuf : 1;
  22.     unsigned int _eof : 1;
  23.     unsigned int _err : 1;
  24. };
  25. typedef struct _iobuf {
  26.     int cnt;        /* characters left */
  27.     char *ptr;      /* next character position */
  28.     char *base;     /* location of the buffer */
  29.     struct flags flag;       /* mode of the file access */
  30.     int fd;         /* file descriptor */
  31. } FILE;
  32.  
  33. extern FILE _iob[OPEN_MAX];
  34.  
  35. #define stdin   (&_iob[0])
  36. #define stdout  (&_iob[1])
  37. #define stderr  (&_iob[2])
  38.  
  39. enum _flags {
  40.     _READ = 01,     /* file open for reading */  /* binary 1 */
  41.     _WRITE = 02,    /* file open for writing */  /* binary 10 */
  42.     _UNBUF = 03,    /* file is unbuffered */     /* binary 11 */
  43.     _EOF = 010,     /* EOF has occurred on this file */ /* binary 1000 */
  44.     _ERR = 020,     /* error occurred on this file */ /* binary 10000*/
  45. };
  46.  
  47. int _fillbuf(FILE *);
  48. int _flushbuf(int, FILE *);
  49.  
  50. #define feof(p)     (((p)->flag._eof) != 0)
  51. #define ferror(p)   (((p)->flag._err) != 0)
  52. #define fileno(p)   ((p)->fd)
  53.  
  54. #define getc(p) (--(p)->cnt >= 0 \
  55.                 ? (unsigned char) *(p)->ptr++ : _fillbuf(p))
  56.  
  57. #define putc(x, p) (--(p)->cnt >= 0 \
  58.                 ? *(p)->ptr++ = (x) : _flushbuf((x), p))
  59.  
  60. #define getchar()   getc(stdin)
  61. #define putchar(x)  putc((x), stdout)
  62.  
  63. #define PERMS 0666  /* RW for owner, group and others */
  64.  
  65. /* fopen: open file, return file ptr */
  66.  
  67. FILE *fopen(char *name,char *mode){
  68.     int fd;
  69.     FILE *fp;
  70.  
  71.     if(*mode != 'r' && *mode != 'w' && *mode != 'a')
  72.         return NULL;
  73.     for(fp = _iob; fp<_iob + OPEN_MAX; fp++)
  74.         if(fp->flag._read == 0 && fp->flag._write == 0)
  75.             break;
  76.     if( fp >= _iob + OPEN_MAX)
  77.         return NULL;
  78.  
  79.     if(*mode == 'w')
  80.         fd = creat(name, PERMS);
  81.     else if(*mode == 'a') {
  82.         if ((fd = open(name, O_WRONLY, 0)) == -1)
  83.             fd = creat(name, PERMS);
  84.         lseek(fd, 0L, 2);
  85.     } else
  86.         fd = open(name, O_RDONLY, 0);
  87.     if(fd == -1)
  88.         return NULL;
  89.     fp->fd = fd;
  90.     fp->cnt = 0;
  91.     fp->base = NULL;
  92.     if (*mode == 'r')
  93.         fp->flag._read = 1,fp->flag._write = 0,fp->flag._unbuf = 0,fp->flag._eof = 0,fp->flag._err = 0;
  94.     else
  95.          fp->flag._read = 0,fp->flag._write = 1,fp->flag._unbuf = 0,fp->flag._eof = 0,fp->flag._err = 0;
  96.     return fp;
  97. }
  98.  
  99. int _fillbuf(FILE *fp){
  100.     int bufsize;
  101.  
  102.     if(fp->flag._read != 1 || fp->flag._eof == 1 || fp->flag._err == 1)
  103.         return EOF;
  104.     bufsize = (fp->flag._unbuf) ? 1: BUFSIZ;
  105.     if(fp->base == NULL)
  106.         if((fp->base = (char *) malloc(bufsize)) == NULL)
  107.             return EOF; /* cant get buffer */
  108.     fp->ptr = fp->base;
  109.     fp->cnt = read(fp->fd,fp->ptr,bufsize);
  110.     if(--fp->cnt < 0) {
  111.         if (fp->cnt == -1)
  112.             fp->flag._eof = 1;
  113.         else
  114.             fp->flag._err = 1;
  115.         fp->cnt = 0;
  116.         return EOF;
  117.     }
  118.     return (unsigned char) *fp->ptr++;
  119. }
  120.  
  121. int _flushbuf(int c,FILE *fp){
  122.  
  123.     int num_written, bufsize;
  124.     unsigned char uc = c;
  125.  
  126.     if(fp->flag._write != 1  || fp->flag._eof == 1 || fp->flag._err == 1)
  127.         return EOF;
  128.     if(fp->base == NULL && (fp->flag._unbuf)==0) {
  129.         if ((fp->base = malloc(BUFSIZ)) == NULL)
  130.             fp->flag._unbuf = 1;
  131.         else{
  132.             fp->ptr = fp->base;
  133.             fp->cnt = BUFSIZ-1;
  134.         }
  135.     }
  136.  
  137.     if(fp->flag._unbuf){
  138.         fp->ptr=fp->base=NULL;
  139.         fp->cnt=0;
  140.         if(c==EOF)
  141.             return EOF;
  142.         num_written = write(fp->fd,&uc,1);
  143.         bufsize = 1;
  144.     } else {
  145.         bufsize = (int)(fp->ptr - fp->base);
  146.         num_written = write(fp->fd,fp->base,bufsize);
  147.         fp->ptr = fp->base;
  148.         fp->cnt = BUFSIZ-1;
  149.     }
  150.  
  151.     if(num_written==bufsize)
  152.         return c;
  153.     else
  154.     {
  155.         fp->flag._err = 1;
  156.         return EOF;
  157.     }
  158. }
  159.  
  160. int fflush(FILE *fp){
  161.      int num_written, bufsize;
  162.     unsigned char uc = 's';
  163.  
  164.     if(fp->flag._write != 1  || fp->flag._eof == 1 || fp->flag._err == 1)
  165.         return EOF;
  166.     if(fp->base == NULL && (fp->flag._unbuf)==0) {
  167.         if ((fp->base = malloc(BUFSIZ)) == NULL)
  168.             fp->flag._unbuf = 1;
  169.         else{
  170.             fp->ptr = fp->base;
  171.             fp->cnt = BUFSIZ-1;
  172.         }
  173.     }
  174.  
  175.     if(fp->flag._unbuf){
  176.         return EOF;
  177.     } else {
  178.         bufsize = (int)(fp->ptr - fp->base);
  179.         num_written = write(fp->fd,fp->base,bufsize);
  180.         fp->ptr = fp->base;
  181.         fp->cnt = BUFSIZ-1;
  182.     }
  183.  
  184.     if(num_written==bufsize)
  185.         return uc;
  186.     else
  187.     {
  188.         fp->flag._err = 1;
  189.         return EOF;
  190.     }
  191. }
  192.  
  193. int fclose(FILE *fp){
  194.     fflush(fp);
  195.     fp->cnt = 0;
  196.     fp->ptr = NULL;
  197.     fp->base = NULL;
  198.     fp->flag._read = 0,fp->flag._write = 0,fp->flag._unbuf = 0,fp->flag._eof = 0,fp->flag._err = 0;
  199.     fp->fd = EOF;
  200. }
  201.  
  202. int fseek(FILE *fp, long offset, int origin){
  203.     int c,i = 1;
  204.     FILE *temp = fp;
  205.     c = lseek(fp->fd,offset,origin);
  206.     if(offset<0)
  207.         i *= -1;
  208.     fp->cnt -= (c*i);
  209.     return c;
  210. }
  211.  
  212. FILE _iob[OPEN_MAX] = {
  213.         {0 , (char *) 0, (char *) 0 , (struct flags){1,0,0,0,0}, 0},
  214.         {0 , (char *) 0, (char *) 0 , (struct flags){0,1,0,0,0}, 1},
  215.         {0 , (char *) 0, (char *) 0 , (struct flags){0,1,1,0,0}, 2}
  216. };
  217.  
  218.  
  219.  
  220. int main(int argc, char *argv[]) {
  221.     int c , a = 0;
  222.     FILE *fp = fopen(argv[1],"r");
  223.     fseek(fp,3,0);
  224.     while(a++ < 3){
  225.     c = getc(fp);
  226.     putc(c,stdout);
  227.     }
  228.     fclose(stdout);
  229.     return 0;
  230. }
Add Comment
Please, Sign In to add comment