view s.h @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
line wrap: on
line source

/* Copyright 1990-2011, Jsoftware Inc.  All rights reserved. */
/* License in license.txt.                                   */
/*                                                                         */
/* For Symbol Tables aka Locales                                           */


#define LOCPATH(g)      ((*AV(g)+jt->sympv)->val )
#define LOCNAME(g)      ((*AV(g)+jt->sympv)->name)
#define NMHASH(p,s)     (*(s)+(p)+99991L*(UC)(s)[(p)-1])


/* macro to define a function that walks through a symbol table */
/* f - name of derived function                                 */
/* T       - for z, C datatype                                  */
/* TYPE    - for z, J datatype                                  */
/* COUNT   - for z, # of initial items for z                    */
/* COL     - for z, # columns                                   */
/* SELECT  - selection function on a name                       */
/* PROCESS - processing on a selected name                      */

#define SYMWALK(f,T,TYPE,COUNT,COL,SELECT,PROCESS)  \
 F1(f){A z;I*e,i,j,k,m=0,n;L*d;T*zv;                         \
  RZ(w);                                                     \
  n=AN(w); e=1+AV(w); k=*e;                                  \
  GA(z,(TYPE),(COUNT)*(COL),(1<(COL))?2:1,0);                \
  if(1<(COL)){*AS(z)=(COUNT); *(1+AS(z))=(COL);}             \
  zv=(T*)AV(z);                                              \
  for(i=1;i<n;++i,k=*++e)while(j=k){                         \
   d=j+jt->sympv;                                            \
   k=d->next;                                                \
   if((d->name)&&(SELECT)){                                  \
    if(m==*AS(z)){RZ(z=ext(0,z)); zv=(m*(COL))+(T*)AV(z);}   \
    {PROCESS;}                                               \
    ++m;                                                     \
  }}                                                         \
  AN(z)=m*(COL); *AS(z)=m;                                   \
  R z;                                                       \
 }