comparison src/variables.cc @ 2921:64dd86522a1d

[project @ 1997-05-02 02:52:54 by jwe]
author jwe
date Fri, 02 May 1997 02:52:55 +0000
parents 057273789b87
children 66ef74ee5d9f
comparison
equal deleted inserted replaced
2920:53529870701e 2921:64dd86522a1d
316 } 316 }
317 317
318 return retval; 318 return retval;
319 } 319 }
320 320
321 string_vector
322 get_struct_elts (const string& text)
323 {
324 int n = 1;
325
326 size_t pos = 0;
327
328 size_t len = text.length ();
329
330 while ((pos = text.find ('.', pos)) != NPOS)
331 {
332 if (++pos == len)
333 break;
334
335 n++;
336 }
337
338 string_vector retval (n);
339
340 pos = 0;
341
342 for (int i = 0; i < n; i++)
343 {
344 size_t len = text.find ('.', pos);
345
346 if (len != NPOS)
347 len -= pos;
348
349 retval[i] = text.substr (pos, len);
350
351 if (len != NPOS)
352 pos += len + 1;
353 }
354
355 return retval;
356 }
357
358 string_vector
359 generate_struct_completions (const string& text, string& prefix, string& hint)
360 {
361 string_vector names;
362
363 size_t pos = text.rfind ('.');
364
365 string id;
366 string_vector elts;
367
368 if (pos == NPOS)
369 {
370 hint = text;
371 prefix = text;
372 elts.resize (1, text);
373 }
374 else
375 {
376 if (pos == text.length ())
377 hint = "";
378 else
379 hint = text.substr (pos+1);
380
381 prefix = text.substr (0, pos);
382
383 elts = get_struct_elts (prefix);
384 }
385
386 id = elts[0];
387
388 symbol_record *sr = curr_sym_tab->lookup (id);
389
390 if (! sr)
391 sr = global_sym_tab->lookup (id);
392
393 if (sr && sr->is_defined ())
394 {
395 octave_symbol *tmp = sr->def ();
396
397 octave_value vtmp;
398
399 if (tmp->is_constant ())
400 vtmp = tmp->eval ();
401
402 if (vtmp.is_map ())
403 {
404 for (int i = 1; i < elts.length (); i++)
405 {
406 vtmp = vtmp.struct_elt_val (elts[i], true);
407
408 if (! vtmp.is_map ())
409 break;
410 }
411
412 if (vtmp.is_map ())
413 {
414 Octave_map m = vtmp.map_value ();
415
416 names = m.make_name_list ();
417 }
418 }
419 }
420
421 return names;
422 }
423
424 bool
425 looks_like_struct (const string& text)
426 {
427 bool retval = true;
428
429 string_vector elts = get_struct_elts (text);
430
431 string id = elts[0];
432
433 symbol_record *sr = curr_sym_tab->lookup (id);
434
435 if (! sr)
436 sr = global_sym_tab->lookup (id);
437
438 if (sr && sr->is_defined ())
439 {
440 octave_symbol *tmp = sr->def ();
441
442 octave_value vtmp;
443
444 if (tmp->is_constant ())
445 vtmp = tmp->eval ();
446
447 if (vtmp.is_map ())
448 {
449 for (int i = 1; i < elts.length (); i++)
450 {
451 vtmp = vtmp.struct_elt_val (elts[i], true);
452
453 if (! vtmp.is_map ())
454 {
455 retval = false;
456 break;
457 }
458 }
459 }
460 else
461 retval = false;
462 }
463 else
464 retval = false;
465
466 return retval;
467 }
321 468
322 DEFUN (is_global, args, , 469 DEFUN (is_global, args, ,
323 "is_global (X): return 1 if the string X names a global variable\n\ 470 "is_global (X): return 1 if the string X names a global variable\n\
324 otherwise, return 0.") 471 otherwise, return 0.")
325 { 472 {