Mercurial > octave-nkf
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 { |