Précédent Index

C  La commande quote

La commande quote lit sur son entrée standard des lignes de mots. Les mots sont séparés par des espaces. On utilise les guillements (dits anglais) " pour inclure des espaces dans des mots. quote produit ces mêmes lignes sur sa sortie standard mais assure que tous les mots sont entre quote '.

Exemple :
% cat foo.txt 
foo bar gee
baz "qux corge" grault 
garply    waldo "" plugh " thud" "" 
% quote < foo.txt 
'foo' 'bar' 'gee'
'baz' 'qux corge' 'grault'
'garply'    'waldo' '' 'plugh' ' thud' ''  
Le code C de la commande quote est le suivant :
#include <stdio.h>

#define QUOTECHAR '\''

main (void) {

  int c ;
  enum state {OUTWORD, INQUOTE, INWORD} s = OUTWORD ;
  while ((c=getchar()) != EOF) {
    switch (c) {
      case ' ':
        switch (s) {
          case OUTWORD: case INQUOTE:
            putchar(c) ; break ;
          case INWORD:
            putchar(QUOTECHAR) ; putchar(c) ; s=OUTWORD ; break ;
        }
        break ;
      case '"':
        switch (s) {
          case OUTWORD:
            putchar(QUOTECHAR) ; s=INQUOTE ; break ;
          case INQUOTE:
            putchar(QUOTECHAR) ; s=OUTWORD ; break ;
          case INWORD:
            putchar(QUOTECHAR) ; break ;
        }
        break ;
      case '\n':
        switch (s) {
          case OUTWORD: case INQUOTE:
            putchar(c) ; break ;
          case INWORD:
            putchar(QUOTECHAR) ; putchar(c) ; s=OUTWORD ; break ;
        }          
        break ;
      case QUOTECHAR:
        switch (s) {
          case OUTWORD: 
            printf ("%s", "'\\'") ; s=INWORD ; break ;
          case INQUOTE:
          case INWORD:
            printf ("%s", "\\'") ; break ;
        }
        break ;         
      default:
        if (s == OUTWORD) { s=INWORD ; putchar(QUOTECHAR) ;}
        putchar(c) ;
    }
  }
  if ((s == INQUOTE) || (s == INWORD)) putchar(QUOTECHAR) ;
}
Pour construire la commande quote, sauver le source C dans un fichier quote.c puis executer la commande
% make quote

Précédent Index