Advertisement
naorzr

Untitled

Apr 26th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement