Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.78 KB | None | 0 0
  1. /*F16. (5 puncte) Scrieti un program ce simuleaza comanda "wc", cu tot cu
  2. cazul cand specificatorul fisierului este dat ca argument in linia de
  3. comanda si avem optiuni. Programul va putea fi lansat astfel astfel:
  4. wc f ==> citeste din f si scrie la stdout
  5. wc -optiuni f ==> citeste din f si scrie la stdout
  6. wc ==> citeste de la stdin si scrie la stdout
  7. wc -optiuni ==> citeste de la stdin si scrie la stdout
  8. Optiunile pot fi orice sir nevid format din literele l,w,c.*/
  9.  
  10.  
  11.  
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15.  
  16. #define B_SIZE 10
  17.  
  18. typedef struct {
  19. unsigned char _c;
  20. unsigned char _w;
  21. unsigned char _l;
  22. } opts;
  23.  
  24. typedef struct{
  25.  
  26. /*
  27. nr_c = numarul de caracter
  28. nr_w = numarul de cuvinte
  29. nr_l = numarul de linii
  30. fe = -1 daca fisierul nu exista
  31. = 0 daca s-a folosit stdin pt date
  32. = 1 daca fisierul exista
  33. */
  34.  
  35. unsigned long long nr_c;
  36. unsigned long long nr_w;
  37. unsigned long long nr_l;
  38. short fe;
  39. char filename[256];
  40. } data_info;
  41.  
  42. void cwl(char *text, int size, data_info *di){
  43. if(text == 0 || size == 0)
  44. return;
  45. di->nr_c = size;
  46. di->nr_w = 0;
  47. if(di->fe!=1)
  48. di->nr_l = 0;
  49. int i;
  50. char last_char=' ';
  51.  
  52. for(i=0;i<size;i++){
  53. if(last_char == ' '){
  54. if(text[i] != ' ' && text[i] != '\n')
  55. di->nr_w++;
  56. }
  57. if(last_char == '\n'){
  58. if(text[i] != ' ' && text[i] != '\n')
  59. di->nr_w++;
  60. }
  61. last_char = text[i];
  62. if(text[i]=='\n')
  63. di->nr_l = di->nr_l+1;
  64. }
  65. }
  66.  
  67. void cwl_file(char *filename, data_info *di){
  68. int sz=B_SIZE;
  69. int cnt=0;
  70. char *txt = (char*)malloc(sz+1);
  71. char c;
  72. FILE *fin = fopen(filename, "r");
  73. strcpy(di->filename, filename);
  74. if(fin==0){
  75. di->fe = -1;
  76. return;
  77. }
  78. else{
  79. di->fe = 1;
  80. while((c = fgetc(fin)) != EOF){
  81. if(cnt==sz)
  82. txt = (char*)realloc(txt, (sz+=B_SIZE)+1);
  83. txt[cnt++]=c;
  84. }
  85. }
  86. cwl(txt, cnt, di);
  87. }
  88.  
  89. void print_cwl(data_info *d, opts *o){
  90. printf("\n##########\nDate text preluate din \"stdin\"\n");
  91. if(o->_c == 1)
  92. printf("Numar caractere: %llu\n", d->nr_c);
  93. if(o->_w == 1)
  94. printf("Numar cuvinte: %llu\n", d->nr_w);
  95. if(o->_l == 1)
  96. printf("Numar linii: %llu\n", d->nr_l);
  97. printf("##########\n");
  98. }
  99.  
  100. void initOpts(opts * _o){
  101. _o->_c = 0;
  102. _o->_w = 0;
  103. _o->_l = 0;
  104. }
  105.  
  106. void print_cwl_opts(char *filename, opts *o){
  107. if((o->_w != 1) && (o->_c != 1) && (o->_l != 1)) {
  108. o->_c = 1;
  109. o->_w = 1;
  110. o->_l = 1;
  111. }
  112. data_info *d = (data_info*)malloc(sizeof(data_info));
  113. cwl_file(filename, d);
  114. if(d->fe == -1){
  115. printf("\nFisierul \"%s\" nu exista.\n", d->filename);
  116. }
  117. if(d->fe == 1){
  118. printf("\n##########\nNume fisier: %s\n", d->filename);
  119. if(o->_c == 1)
  120. printf("Numar caractere: %llu\n", d->nr_c);
  121. if(o->_w == 1)
  122. printf("Numar cuvinte: %llu\n", d->nr_w);
  123. if(o->_l == 1)
  124. printf("Numar linii: %llu\n", d->nr_l);
  125. printf("##########\n");
  126. }
  127. }
  128.  
  129.  
  130. int main(int argc, char **argv){
  131. int getOptions();
  132. int sz=B_SIZE;
  133. int cnt=0;
  134. char *txt = (char*)malloc(sz+1);
  135. char c;
  136. int i;
  137. int opt_cnt=0;
  138. if(argc>1){
  139. //caut in argumente specificatori de optiuni:
  140. int a;
  141. opts *o = (opts*)malloc(sizeof(opts));
  142. int *f_list = (int*)malloc(sizeof(int)*argc);
  143. initOpts(o);
  144.  
  145. for(a=1;a<argc;a++){
  146. if(argv[a][0]=='-'){
  147. opt_cnt++;
  148. int aa;
  149. for(aa=1; aa<strlen(argv[a]); aa++){
  150. switch(argv[a][aa]){
  151. case 'c' :
  152. o->_c = 1;
  153. break;
  154. case 'w' :
  155. o->_w = 1;
  156. break;
  157. case 'l' :
  158. o->_l = 1;
  159. break;
  160. default:{
  161. printf("Invalid option: \'%c\'\n", argv[a][aa]);
  162. return 0;
  163. }
  164. }
  165. }
  166. }
  167. else{
  168. f_list[a]=1;
  169. }
  170. }
  171. int k;
  172. if(opt_cnt == argc-1){
  173. while((c = getchar()) != EOF){
  174. if(cnt==sz)
  175. txt = (char*)realloc(txt, (sz+=B_SIZE)+1);
  176. txt[cnt++]=c;
  177. }
  178. data_info *d = (data_info*)malloc(sizeof(data_info));
  179. cwl(txt, cnt, d);
  180. print_cwl(d, o);
  181. }
  182. else for(k=1;k<argc;k++){
  183. if(f_list[k]==1){
  184. //printf("argv[%d] = %s\n", k, argv[k]);
  185. print_cwl_opts(argv[k], o);
  186. }
  187. }
  188. }
  189. return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement