Changeset 1276 in Sophya for trunk/SophyaPI/PIext/piacmd.cc


Ignore:
Timestamp:
Nov 2, 2000, 11:18:50 AM (25 years ago)
Author:
ercodmgr
Message:

Amelioration de la syntaxe de l'interpreteur, gestion de quotes, ligne suite
Commande linkff2 (2eme groupe de link, pour utilisation par CxxExecutor
Amelioration de la gestion de TMPDIR

Reza 2/11/2000

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/PIext/piacmd.cc

    r1269 r1276  
    169169  for(int kk=1; kk<args.size(); kk++) strlist.push_back(args[kk]);
    170170  typ = BT_ForeachList;
     171  blkok = true;
    171172  }
    172173else { // This is an integer or float loop
     
    189190  if (fl) {
    190191    typ = BT_ForeachFloat;
     192    blkok = true;
    191193    f1 = atof(a1.c_str());
    192194    f2 = atof(a2.c_str());
     
    196198  else {
    197199    typ = BT_ForeachInt;
     200    blkok = true;
    198201    i1 = atoi(a1.c_str());
    199202    i2 = atoi(a2.c_str());
     
    285288bloccxx = false;
    286289bloctest = false;
     290mulinecmd = "";
     291mulinefg = false;
    287292
    288293cmdhgrp["All"] = 0;
     
    490495if (s[0] == '#') return(0); // si c'est un commentaire
    491496
     497// Logique de gestion des lignes suite
     498// un \ en derniere position indique la presence d'une ligne suite
     499if (s[l-1] == '\\' ) { // Lignes suite ...
     500  mulinefg = true;
     501  mulinecmd += s.substr(0,l-1);
     502  mImgApp->GetConsole()->SetPrompt("...? ");
     503  return(0);
     504}
     505
     506if (mulinefg) {  // Il y avait des lignes suite
     507  s = mulinecmd + s;
     508  mulinecmd = "";
     509  mulinefg = false;
     510  const char * rprompt = (curblk == NULL) ? "Cmd> " : "foreach? ";
     511  mImgApp->GetConsole()->SetPrompt(rprompt);
     512}
    492513
    493514// Removing leading blanks
    494 size_t p,q,q2;
    495 l = s.length();
    496 if (l < 1)  return(0);
     515size_t p,q;
    497516
    498517p=s.find_first_not_of(" \t");
     
    534553       }
    535554    else  {
    536       char prompt[64];
    537       sprintf(prompt, "foreach-%d? ", felevel);
    538       mImgApp->GetConsole()->SetPrompt(prompt);
     555      //      char prompt[64];
     556      //      sprintf(prompt, "foreach-%d? ", felevel);
     557      mImgApp->GetConsole()->SetPrompt("foreach? ");
    539558      }
    540559    return(0);
     
    544563
    545564// Nous ne sommes donc pas dans un bloc ....  Substitution de variables
    546 
     565string s2;
     566int rcs ;
    547567// Execution de code C++
    548568
     
    553573    return(99);
    554574  }
    555   if (s[1] == '@') { // Sans substitution des variables $
    556     return(cxxe->ExecuteCXX(s.substr(2)));
    557   } else { // Avec substitution de variables $
    558     string s2;
    559     SubstituteVars(s, s2);
     575  // Sans substitution des variables $
     576  if (s[1] == '@') return(cxxe->ExecuteCXX(s.substr(2)));
     577  else { // AVEC substitution des variables $
     578    rcs = SubstituteVars(s, s2);
     579    if (rcs) return(rcs);
    560580    return(cxxe->ExecuteCXX(s2.substr(1)));   
    561581  }
     
    563583
    564584
    565 string s2;
    566 SubstituteVars(s, s2);
     585rcs = SubstituteVars(s, s2);
     586if (rcs) return(rcs);
    567587
    568588// >>>> Separating keyword and tokens
     
    579599  p = toks.find_first_not_of(" \t",q+1); // au debut d'un token
    580600  if (p>=l) break;
    581   q = toks.find_first_of(" \t",p); // la fin du token;
     601  if ( (toks[p] == '\'') || (toks[p] == '"') ) {
     602    q = toks.find(toks[p],p+1);
     603    if (q>=l)  {
     604      cerr << "Syntax Error - Unbalenced quotes " << toks[p] << '.' << endl;
     605      return(2);
     606    }
     607    p++;
     608  }
     609  else {
     610    q = toks.find_first_of(" \t",p); // la fin du token;
     611  }
    582612  string token = toks.substr(p,q-p);
    583613  tokens.push_back(token);
     
    629659while (p < l) {
    630660  q = s.find('$',p);
     661  if (q > l) break;
     662  q2 = s.find('\'',p);
     663  if ((q2 < l) && (q2 < q)) {  // On saute la chaine delimitee par ' '
     664    q2 = s.find('\'',q2+1);
     665    if (q2 >= l) {
     666      cerr << " Syntax error - Unbalenced  quotes !!! " << endl;
     667      return(1);
     668      }
     669    s2 += s.substr(p, q2-p+1);
     670    p = q2+1;  continue; 
     671  }
    631672  //  cout << "DBG: " << s2 << " p= " << p << " q= " << q << " L= " << l << endl;
    632   if (q > l) break;
    633673  if ((q>0) && (s[q-1] == '\\')) {   // Escape character \$
    634674     s2 += (s.substr(p,q-1-p) + '$') ; p = q+1;
     
    636676     }
    637677  if (q >= l-1) {
    638       cerr << " Syntax error !!! " << endl;
    639       return(0);
     678      cerr << " Syntax error - line ending with $ !!! " << endl;
     679      return(2);
    640680      }
    641681  vn = "";
     
    643683    q2 = s.find('}',q+1);
    644684    if (q2 >= l) {
    645       cerr << " Syntax error !!! " << endl;
    646       return(0);
     685      cerr << " Syntax error -  Unbalenced  brace {} !!! " << endl;
     686      return(3);
    647687      }
    648688    vn = s.substr(q+2,q2-q-2);
     
    652692    q2 = s.find(']',q+1);
    653693    if (q2 >= l) {
    654       cerr << " Syntax error !!! " << endl;
    655       return(0);
     694      cerr << " Syntax error - Unbalenced  brace [] !!! " << endl;
     695      return(4);
    656696      }
    657697    vn = s.substr(q+2,q2-q-2);
    658698    if ( (vn.length() < 1) || (!omg.HasVar(vn)) )  {
    659699      cerr << " Error: Undefined variable " << vn << " ! " << endl;
    660       return(0);
     700      return(5);
    661701      }
    662702    vn = omg.GetVar(vn);
     
    664704    }
    665705  else {
    666     q2 = s.find_first_of(" .:/,]()$",q+1);
     706    q2 = s.find_first_of(" .:/,]()$\"'",q+1);
    667707    if (q2 > l) q2 = l;
    668708    vn = s.substr(q+1, q2-q-1);
     
    670710  if ( (vn.length() < 1) || (!omg.HasVar(vn)) )  {
    671711    cerr << " Error: Undefined variable " << vn << " ! " << endl;
    672     return(0);
     712    return(5);
    673713    }
    674714  s2 += (s.substr(p, q-p) + omg.GetVar(vn));
     
    705745    return(0);
    706746    }
    707   string xx = tokens[1];
    708   for (int kk=2; kk<tokens.size(); kk++)  xx += (' ' + tokens[kk] );
    709   omg.SetVar(tokens[0], xx);
     747  //  string xx = tokens[1];
     748  //  for (int kk=2; kk<tokens.size(); kk++)  xx += (' ' + tokens[kk] );
     749  omg.SetVar(tokens[0], tokens[1]);
    710750  }
    711751
     
    756796  }
    757797else if (kw == "echo") {
    758   for (int kk=0; kk<tokens.size(); kk++)  cout << tokens[kk] << " " ;
     798  for (int ii=0; ii<tokens.size(); ii++)
     799    cout << tokens[ii] << " " ;
    759800  cout << endl;
    760   }
    761 
     801 }
    762802else if (kw == "readstdin") {
    763803  if (tokens.size() < 1) { cout << "PIACmd::Interpret() Usage: readstdin varname" << endl;  return(0); }
     
    816856else if (kw == "shell") {
    817857  if (tokens.size() < 1) { cout << "PIACmd::Interpret() Usage: shell cmdline" << endl;  return(0); }
    818   system(toks.c_str());
    819   }
     858  string cmd;
     859  for (int ii=0; ii<tokens.size(); ii++)
     860    cmd += (tokens[ii] + ' ');
     861  system(cmd.c_str());
     862  }
     863
    820864//  Execution d'une commande enregistree
    821 // CMV c'est ici qu'il faut passer la string
    822865else rc = ExecuteCommand(kw, tokens, toks);
    823866
     
    894937// Setting $0 ... $99 variables
    895938int k;
    896 CmdVarList::iterator it;
    897939char buff[32];
    898940// First, we clear all previous values
Note: See TracChangeset for help on using the changeset viewer.