Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*F16. (5 puncte) Scrieti un program ce simuleaza comanda "wc", cu tot cu
- cazul cand specificatorul fisierului este dat ca argument in linia de
- comanda si avem optiuni. Programul va putea fi lansat astfel astfel:
- wc f ==> citeste din f si scrie la stdout
- wc -optiuni f ==> citeste din f si scrie la stdout
- wc ==> citeste de la stdin si scrie la stdout
- wc -optiuni ==> citeste de la stdin si scrie la stdout
- Optiunile pot fi orice sir nevid format din literele l,w,c.*/
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #define B_SIZE 10
- typedef struct {
- unsigned char _c;
- unsigned char _w;
- unsigned char _l;
- } opts;
- typedef struct{
- /*
- nr_c = numarul de caracter
- nr_w = numarul de cuvinte
- nr_l = numarul de linii
- fe = -1 daca fisierul nu exista
- = 0 daca s-a folosit stdin pt date
- = 1 daca fisierul exista
- */
- unsigned long long nr_c;
- unsigned long long nr_w;
- unsigned long long nr_l;
- short fe;
- char filename[256];
- } data_info;
- void cwl(char *text, int size, data_info *di){
- if(text == 0 || size == 0)
- return;
- di->nr_c = size;
- di->nr_w = 0;
- if(di->fe!=1)
- di->nr_l = 0;
- int i;
- char last_char=' ';
- for(i=0;i<size;i++){
- if(last_char == ' '){
- if(text[i] != ' ' && text[i] != '\n')
- di->nr_w++;
- }
- if(last_char == '\n'){
- if(text[i] != ' ' && text[i] != '\n')
- di->nr_w++;
- }
- last_char = text[i];
- if(text[i]=='\n')
- di->nr_l = di->nr_l+1;
- }
- }
- void cwl_file(char *filename, data_info *di){
- int sz=B_SIZE;
- int cnt=0;
- char *txt = (char*)malloc(sz+1);
- char c;
- FILE *fin = fopen(filename, "r");
- strcpy(di->filename, filename);
- if(fin==0){
- di->fe = -1;
- return;
- }
- else{
- di->fe = 1;
- while((c = fgetc(fin)) != EOF){
- if(cnt==sz)
- txt = (char*)realloc(txt, (sz+=B_SIZE)+1);
- txt[cnt++]=c;
- }
- }
- cwl(txt, cnt, di);
- }
- void print_cwl(data_info *d, opts *o){
- printf("\n##########\nDate text preluate din \"stdin\"\n");
- if(o->_c == 1)
- printf("Numar caractere: %llu\n", d->nr_c);
- if(o->_w == 1)
- printf("Numar cuvinte: %llu\n", d->nr_w);
- if(o->_l == 1)
- printf("Numar linii: %llu\n", d->nr_l);
- printf("##########\n");
- }
- void initOpts(opts * _o){
- _o->_c = 0;
- _o->_w = 0;
- _o->_l = 0;
- }
- void print_cwl_opts(char *filename, opts *o){
- if((o->_w != 1) && (o->_c != 1) && (o->_l != 1)) {
- o->_c = 1;
- o->_w = 1;
- o->_l = 1;
- }
- data_info *d = (data_info*)malloc(sizeof(data_info));
- cwl_file(filename, d);
- if(d->fe == -1){
- printf("\nFisierul \"%s\" nu exista.\n", d->filename);
- }
- if(d->fe == 1){
- printf("\n##########\nNume fisier: %s\n", d->filename);
- if(o->_c == 1)
- printf("Numar caractere: %llu\n", d->nr_c);
- if(o->_w == 1)
- printf("Numar cuvinte: %llu\n", d->nr_w);
- if(o->_l == 1)
- printf("Numar linii: %llu\n", d->nr_l);
- printf("##########\n");
- }
- }
- int main(int argc, char **argv){
- int getOptions();
- int sz=B_SIZE;
- int cnt=0;
- char *txt = (char*)malloc(sz+1);
- char c;
- int i;
- int opt_cnt=0;
- if(argc>1){
- //caut in argumente specificatori de optiuni:
- int a;
- opts *o = (opts*)malloc(sizeof(opts));
- int *f_list = (int*)malloc(sizeof(int)*argc);
- initOpts(o);
- for(a=1;a<argc;a++){
- if(argv[a][0]=='-'){
- opt_cnt++;
- int aa;
- for(aa=1; aa<strlen(argv[a]); aa++){
- switch(argv[a][aa]){
- case 'c' :
- o->_c = 1;
- break;
- case 'w' :
- o->_w = 1;
- break;
- case 'l' :
- o->_l = 1;
- break;
- default:{
- printf("Invalid option: \'%c\'\n", argv[a][aa]);
- return 0;
- }
- }
- }
- }
- else{
- f_list[a]=1;
- }
- }
- int k;
- if(opt_cnt == argc-1){
- while((c = getchar()) != EOF){
- if(cnt==sz)
- txt = (char*)realloc(txt, (sz+=B_SIZE)+1);
- txt[cnt++]=c;
- }
- data_info *d = (data_info*)malloc(sizeof(data_info));
- cwl(txt, cnt, d);
- print_cwl(d, o);
- }
- else for(k=1;k<argc;k++){
- if(f_list[k]==1){
- //printf("argv[%d] = %s\n", k, argv[k]);
- print_cwl_opts(argv[k], o);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement