Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define exit_on_null(s,m) if(s == NULL) { perror(m); exit(1); }
- //print f
- char strf(char *a, char *b)
- {
- if(!b[0] || !a[0]) // se b nao existir ou a nao existir retorna 0
- return 0;
- char *c;
- for(;;)
- {
- if(!*a) //fim da a
- break;
- c=a;
- for(;;)
- {
- if(!*b) //fim da b
- return 1;
- if(*c++ != *b++) //se nao forem iguais entao nao encontrou ainda, tem de reiniciar a procura na 2ª string
- break;
- }
- b-=(int)c; // subtrai a posição do c
- b+=(int)a; // adiciona a posiçao onde estava a para repor no inicio o b
- a++; //adiciona apenas um para pesquisar caracter a caracter
- }
- return 0;
- }
- int linhas(FILE *f)
- {
- char *line = NULL;
- ssize_t n=0;
- int l=0;
- while((n = getline(&line, &n, f)) != -1)
- if(strf(line,"printf"))
- l++;
- if(line) free(line);
- return l;
- }
- int words(FILE *f)
- {
- char *line = NULL;
- ssize_t n=0;
- int w=0, i;
- char flag=0;
- while((n = getline(&line, &n, f)) != -1)
- {
- i=0;
- while(line[i] != '\0')
- {
- if(line[i] == ' ' && flag)
- {
- w++;
- flag=0;
- }
- else if(line[i] != ' ' && !flag)
- flag = 1;
- i++;
- }
- if(flag)
- {
- w++;
- flag = 0;
- }
- }
- if(line) free(line);
- return w;
- }
- int chars(FILE *f)
- {
- char *line = NULL;
- ssize_t n=0;
- int c=0;
- while((n = getline(&line, &n, f)) != -1)
- c+=strlen(line)-1;
- if(line) free(line);
- return c;
- }
- int main (int argc, char *argv[])
- {
- FILE *fp;
- int c;
- /* Usage */
- if (argc<=1)
- {
- printf("Usage: %s <flags> <file name>\n",argv[0]);
- exit(1);
- }
- fp=fopen(argv[1],"r");/*Abre ficheiro para leitura*/
- exit_on_null(fp,"Erro na abertura");
- /*Leitura linha a linha*/
- while((c=getopt(argc,argv,":lwc"))!=-1)
- {
- fseek(fp,0,SEEK_SET);
- switch(c)
- {
- case 'l': printf("%d linhas (com a palavra printf)\n",linhas(fp));
- break;
- case 'w': printf("%d palavras\n",words(fp));
- break;
- case 'c': printf("%d caracteres\n",chars(fp));
- break;
- default: printf("Not c l or w\nwill use -l as default:\n"); printf("%d\n",linhas(fp)); break;
- }
- }
- fclose(fp);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment