Enviado em 16/11/2019 - 08:04h
Saberiam me dizer se em alguma pasta do Linux há os fontes das ferramentas do bash, que imagino, tenham sido escritas em C?Enviado em 17/11/2019 - 00:04h
apt-get source coreuils
Enviado em 17/11/2019 - 06:41h
Obrigado pela pronta resposta. Segundo esse livro, é um pouco complicado escrever um programa em C que faça uso de expressões regulares. Tanto que pensei em usar o C++, que parece ser bem mais simples.Enviado em 17/11/2019 - 16:42h
Bom, o C é uma linguagem simples sintaticamente e em termos das construções que oferece. Essa simplicidade essencial se reflete no poder de expressividade que está à disposição dos programadores, que não é muito grande.# Perl: Faz o parsing de uma linha válida no formato de /etc/passwd. if($str=~/^([^#+-]?[^:]+):([^:]):([+-]?\d+):([+-]?\d+):([^:]*):([^:]*):([^:]*)$/){ ($username, $password, $uid, $gid, $gecos, $homedir, $shell)=($1, $2, 0+$3, 0+$4, $5, $6, $7); }
/* C: Faz o parsing de uma linha válida no formato de /etc/passwd. */ // (Supõe que os tipos de str, username, password, gecos, home dir e shell sejam char * // e os de uid e gid sejam uid_t e gid_t, respectivamente). regex_t re; if(regcomp(&re, "^([^#+-]?[^:]+):([^:]):([+-]?[[:digit:]]+):([+-]?[[:digit:]]+):([^:]*):([^:]*):([^:]*)$", REG_EXTENDED)==0){ regmatch_t parts[8]; if(regexec(&re, str, 8, parts, 0)==0){ char *part_str[8]={NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; for(int p=0; p<8; ++p){ ssize_t len=parts[p].rm_eo-parts[p].rm_so; if(parts[p].rm_so>=0 && len>0){ if((parts_str[p]=malloc(1+len))!=NULL){ strncpy(parts_str[p], str+parts[p].rm_so, len); parts_tr[p][len]='\0'; } else{ perror("Não foi possível alocar memória para armazenar parte da expressão regular"); abort(); } } else parts_str[p]=strdup(""); } username=strdup(parts_str[1]); password=strdup(parts_str[2]); uid=atoll(parts_str[3]); gid=atoll(parts_str[4]); gecos=strdup(parts_str[5]); homedir=strdup(parts_str[6]); shell=strdup(parts_str[7]); for(int p=0; p<8; ++p) free(parts_str[p]); } regfree(&re); }
// C++: Parsing de uma linha no formato do /etc/passwd usando a classe std::regex. // (Supõe que os tipos de str, username, password, gecos, home dir e shell sejam std::string // e os de uid e gid sejam uid_t e gid_t, respectivamente). std::smatch parts; if(regex_match(str, parts, std::regex("^([^#+-]?[^:]+):([^:]):([+-]?\\d+):([+-]?\\d+):([^:]*):([^:]*):([^:]*)$"))){ username=parts[1]; password=parts[2]; uid=stoll(parts[3]); gid=stoll(parts[4]); gecos=parts[5]; homedir=parts[6]; shell=parts[7]; }
Enviado em 17/11/2019 - 19:51h
Obrigado novamente.Enviado em 17/11/2019 - 21:35h
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Descritores de Arquivos e Swappiness
Como converter imagens PNG/JPEG para SVG em linha de comando
Fez porcaria no teu repositório Git? Aprenda a restaurar uma versão anterior do seu código!
Restaurando Fontes de Download do Hydra no Linux
Atualizando "na marra" o YT-DLP quando começa a dar erro de downloads
Como instalar o WPS com interface e corretor ortográfico em PT-BR no Arch Linux
Bluetooth CSR 4.0 Dongle (Alternativo) (4)
Controle do PS5 no Linux Mint funciona? [RESOLVIDO] (6)