File:  [CSRG BSD Unix] / 43BSD / contrib / icon / operators / size.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:12:55 2018 UTC (8 years, 1 month ago) by root
Branches: MAIN, BSD
CVS tags: HEAD, BSD43
BSD 4.3

#include "../h/rt.h"
#include "../h/record.h"

/*
 * *x - return size of string or object x.
 */

size(nargs, arg1, arg0)
int nargs;
struct descrip arg1, arg0;
   {
   DclSave
   char sbuf[MAXSTRING];

   SetBound;
   /*
    * Make sure x isn't null.
    */
   DeRef(arg1)
   if (NULLDESC(arg1))
      runerr(112, &arg1);
   if (cvstr(&arg1, sbuf) != NULL) {
      /*
       * If x can be converted to a string, return the length of the string
       *  as the size of x.
       */
      arg0.type = D_INTEGER;
      INTVAL(arg0) = STRLEN(arg1);
      }
   else {
      /*
       * x isn't a string.  *x for lists and tables is the current size;
       *  *x for records is the number of fields, and *x for co-expressions
       *  is the number of results that have been produced.
       */
      switch (TYPE(arg1)) {
         case T_LIST:
            arg0.type = D_INTEGER;
            INTVAL(arg0) = BLKLOC(arg1)->list.cursize;
            break;

         case T_TABLE:
            arg0.type = D_INTEGER;
            INTVAL(arg0) = BLKLOC(arg1)->table.cursize;
            break;
#ifdef SETS
         case T_SET:
            arg0.type = D_INTEGER;
            INTVAL(arg0) = BLKLOC(arg1)->set.setsize;
            break;
#endif SETS
         case T_RECORD:
            arg0.type = D_INTEGER;
            INTVAL(arg0) = BLKLOC(arg1)->record.recptr->nfields;
            break;

         case T_ESTACK:
            arg0.type = D_INTEGER;
            INTVAL(arg0) = BLKLOC(arg1)->estack.nresults;
            break;

         default:
            /*
             * There is no notion of size for this datatype.
             */
            runerr(112, &arg1);
         }
      }
   ClearBound;
   }

Opblock(size,1,"*")

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.