manpagez: man pages & more
info gawk
Home | html | info | man

File: gawk.info,  Node: Namespace Example,  Next: Namespace And Features,  Prev: Internal Name Management,  Up: Namespaces

15.7 Namespace Example
======================

The following example is a revised version of the suite of routines
developed in *note Passwd Functions::.  See there for an explanation of
how the code works.

   The formulation here, due mainly to Andrew Schorr, is rather elegant.
All of the implementation functions and variables are in the 'passwd'
namespace, whereas the main interface functions are defined in the 'awk'
namespace.

     # ns_passwd.awk --- access password file information

     @namespace "passwd"

     BEGIN {
         # tailor this to suit your system
         Awklib = "/usr/local/libexec/awk/"
     }

     function Init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
     {
         if (Inited)
             return

         oldfs = FS
         oldrs = RS
         olddol0 = $0
         using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
         using_fpat = (PROCINFO["FS"] == "FPAT")
         FS = ":"
         RS = "\n"

         pwcat = Awklib "pwcat"
         while ((pwcat | getline) > 0) {
             Byname[$1] = $0
             Byuid[$3] = $0
             Bycount[++Total] = $0
         }
         close(pwcat)
         Count = 0
         Inited = 1
         FS = oldfs
         if (using_fw)
             FIELDWIDTHS = FIELDWIDTHS
         else if (using_fpat)
             FPAT = FPAT
         RS = oldrs
         $0 = olddol0
     }

     function awk::getpwnam(name)
     {
         Init()
         return Byname[name]
     }

     function awk::getpwuid(uid)
     {
         Init()
         return Byuid[uid]
     }

     function awk::getpwent()
     {
         Init()
         if (Count < Total)
             return Bycount[++Count]
         return ""
     }

     function awk::endpwent()
     {
         Count = 0
     }

   As you can see, this version also follows the convention mentioned in
*note Library Names::, whereby global variable and function names start
with a capital letter.

   Here is a simple test program.  Since it's in a separate file,
unadorned identifiers are sought for in the 'awk' namespace:

     BEGIN {
         while ((p = getpwent()) != "")
             print p
     }


   Here's what happens when it's run:

     $ gawk -f ns_passwd.awk -f testpasswd.awk
     -| root:x:0:0:root:/root:/bin/bash
     -| daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     -| bin:x:2:2:bin:/bin:/usr/sbin/nologin
     -| sys:x:3:3:sys:/dev:/usr/sbin/nologin
     ...

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.