Repository subroutine library sample programs
The program below uses the Repository subroutine library to display a selection window. Program 2 illustrates how to traverse fields and groups in a structure.
Program 1
; This program displays a selection window containing a list of all ; structures in a repository. From that window, the user can then select ; a structure and a second selection window displays, containing a list ; of all fields in that structure. ; Script for Repository information subroutine demo .column c_select , "Select" .entry o_exit, "Exit", key(f4) .entry o_nxtpg, "Next page", key(next) .entry o_prvpg, "Previous page", key(prev) .entry s_up, "Move up", key(up) .entry s_down, "Move down", key(down) .end ; dddemo.dbl - Demo Repository information subroutines .include "RPSLIB:ddinfo.def" ;.defines and data structures .include "WND:tools.def" .include "WND:windows.def" .define SELWND_SIZE ,10 ;# rows in selection window .define MAX_PAGE ,98 ;Max pages in selection window record struct ,a30 ;A structure name structs ,SELWND_SIZE a30 ;Structure names sinfo ,SELWND_SIZE a62 ;Selection window items st_base ,MAX_PAGE a30 ;Base struct for selection page field ,a30 ;A field name fields ,SELWND_SIZE a30 ;Field names finfo ,SELWND_SIZE a49 ;Selection window items fld_base ,MAX_PAGE a30 ;Base field for selection page colid ,i4 ;Selection window column ID st_id ,i4 ;Structure selection window ID fld_id ,i4 ;Field selection window id ;Selection window titles nmstrcts ,d5 ;Number of structures nmflds ,d5 ;Number of fields ret ,d2 ;Number of items retrieved sx ,d3 ;Structure index fx ,d3 ;Field index record st_title ,a*,' Structures - Page ' st_page ,d2 ,a*,' of ' st_last ,d2 record st_info st_name ,a30 ;Structure name ,a4 st_filtyp ,a15 ;File type ,a3 st_desc ,a10 ;First 10 chars of short description record fld_title ,a*,' Fields in ' fld_sname ,a30 ,a*,' - Page ' fld_page ,d2 ,a*,' of ' fld_last ,d2 record fld_info fld_name ,a30 ;Field name ,a2 fld_type ,a1 ;Field type fld_size ,a4 ;Field size ,a2 fld_desc ,a10 ;First 10 chars of short description proc xcall u_start("dddemo") ;Start UI Toolkit xcall m_ldcol(colid, g_utlib, "c_select") ;Load selection column xcall dd_init(dcs) ;Start repository routines if (error) ;Check error state in dcs call error ;Get count of structures xcall dd_name(dcs, DDN_COUNT, DDN_STRUCT, nmstrcts) if (error) call error st_page = 1 ;Start at the beginning (novel) st_last = nmstrcts/SELWND_SIZE ;Compute last page if (st_last*SELWND_SIZE .lt. nmstrcts) incr st_last call load_structs ;Load a selection page do call process_structs ;Process selection window until (g_select) ;Unsatisfied menu entry = Exit xcall dd_exit(dcs) ;Shut down repository routines xcall u_finish ;Shut down UI Toolkit stop ; ; Description: Load the selection window for structures ; load_structs, ;Get a page full of names xcall dd_name(dcs, DDN_LIST, DDN_STRUCT, SELWND_SIZE, & structs, st_base(st_page), ret) if (error) ;Check error state call error for sx from 1 thru ret ;Get info about each structure begin st_name = structs(sx) xcall dd_struct(dcs, DDS_INFO, st_name, s_info) if (error) call error st_filtyp = si_filtyp ;Load the file type if (si_desc) then ;Is there a short description? begin xcall dd_struct(dcs, DDS_TEXT, si_desc, st_desc) if (error) call error end else ;No short description, if (si_ldesc) then ;Is there a long description? begin xcall dd_struct(dcs, DDS_TEXT, si_ldesc, st_desc) if (error) call error end else ;No short or long description, clear st_desc ; clear it sinfo(sx) = st_info ;Load array for the selection wnd end sx = 1 ;Start with the first one if (st_id) xcall u_window (D_DELETE, st_id) ;Delete any previous ; version and build the window xcall s_selbld(st_id, "STRUCTS", ret, ret, sinfo) ;Put the title on it xcall w_brdr(st_id, WB_TITLE, st_title, WB_TPOS, WBT_TOP, & WBT_CENTER) xcall u_logwnd(st_id) ;Log it with UI Toolkit xcall u_window(D_PLACE, st_id, 3, 10) ;Place it at 3,10 return ; ; Description: Process the structure selection window ; process_structs, xcall s_select(st_id, sx, struct,, sx);Let user select one if (g_select) then ;If user chose a menu entry begin case g_entnam of begincase 'O_EXIT ': return ;Exit 'O_NXTPG ': call next_struct_page ;Load next page 'O_PRVPG ': call prev_struct_page ;Load previous page endcase end ;Note that any other menu entry ; returns as well else begin ;Select the structure xcall dd_struct(dcs, DDS_INFO, struct, s_info) if (error) call error nmflds = si_nmflds ;Load number of fields fld_page = 1 ;Start at the first page clear fld_base(1) fld_last = nmflds/SELWND_SIZE ;Compute last page if (fld_last*SELWND_SIZE .lt. nmflds) incr fld_last fld_sname = struct ;Load structure name in title call load_fields ;Load a selection window page do call process_fields ;Process selection window until (g_select) ;Until unsatisfied menu entry if (g_entnam .eq. "O_EXIT ") ;Exit only one level clear g_select xcall u_window(D_DELETE, fld_id) ;Delete fields window end return ; ; Description: Go to the next page of structures ; next_struct_page, if (st_page .ge. st_last) then ;Check for overflow call ding else begin incr st_page st_base(st_page) = structs(SELWND_SIZE ;Start w/ last ; structure on prev page call load_structs ;Load the window end clear g_select ;Menu entry satisfied return ; ; Description: Go to the previous page of structures ; prev_struct_page, if (st_page .le. 1) then ;Avoid underflow call ding else begin decr st_page call load_structs ;Load the window end clear g_select ;Menu entry satisfied return ; ; Description: Load a page of fields into a selection window ; load_fields, ;Load a page of field names xcall dd_field(dcs, DDF_LIST, SELWND_SIZE, fields, & fld_base(fld_page), ret) if (error) call error for fx from 1 thru ret ;For each field loaded begin fld_name = fields(fx) ;Get field information xcall dd_field(dcs, DDF_INFO, fld_name, f_info) if (error) call error fld_type = fi_type fld_size = fi_size [left] if (fi_desc) then ;Is there a short description? begin xcall dd_field(dcs, DDF_TEXT, fi_desc, fld_desc) if (error) call error end else if (fi_ldesc) then ;No, is there a long description? begin xcall dd_field(dcs, DDF_TEXT, fi_ldesc, fld_desc) if (error) call error end else clear fld_desc finfo(fx) = fld_info ;Load selection window array end fx = 1 ;So we start with the first one if (fld_id) xcall u_window (D_DELETE, fld_id) ;Delete any prev version ;and build the window xcall s_selbld(fld_id, "FIELDS", ret, ret, finfo) ;Put the title on it xcall w_brdr(fld_id, WB_TITLE, fld_title, WB_TPOS, WBT_TOP, & WBT_CENTER) xcall u_logwnd(fld_id) ;Log it with UI Toolkit xcall u_window(D_PLACE, fld_id, 5, 20) ;Place it at 5,20 return ; ; Description: Process the field selection window ; process_fields, xcall s_select(fld_id, fx, field,, fx) ;Let user select one if (g_select) then ;If user chose a menu entry begin case g_entnam of begincase 'O_EXIT ': return ;Exit 'O_NXTPG ': call next_field_page ;Load next page 'O_PRVPG ': call prev_field_page ;Load previous page endcase end ;Note that any other menu entry ; returns also else begin ;Select the structure xcall dd_field(dcs, DDF_INFO, field, f_info) if (error) call error end return ; ; Description: Go to the next page of fields ; next_field_page, if (fld_page .ge. fld_last) then ;Check for overflow call ding else begin incr fld_page fld_base(fld_page) = fields(SELWND_SIZE) call load_fields ;Load the window end clear g_select ;Menu entry satisfied return ; ; Description: Go to the previous page of fields ; prev_field_page, if (fld_page .le. 1) then ;Avoid underflow call ding else begin decr fld_page call load_fields ;Load the window end clear g_select ;Menu entry satisfied return ; ; Description: Abort on a repository access error. This ; routine is called to provide a full traceback of where ; the error occurred. ; error, xcall u_abort("Error in Repository info routines", %a(error)) ; ; Description: Ring the terminal bell ; ding, display (g_terminal, 7) return .end
; This program traverses all fields and groups in a structure. It assumes ; all groups are explicit groups. ; .include "RPSLIB:ddinfo.def" .define MAX_FLDS ,99 .define MAX_LVLS ,10 .define PUTOUT(msg) writes(chan, (msg)) .define ERROUT(msg) PUTOUT("Error # " + %string(error) + " " + (msg)) common chan ,i4 proc xcall u_start xcall u_open(chan, "o:s", "TST:output.txt") xcall dd_init(dcs, "TST:testmain.ism", "TST:testtext.ism") if (error) begin xcall u_message("Cannot open repository file due to error " + & %string(error)) xcall u_finish stop end xcall dd_struct(dcs, DDS_INFO, "COMPANY", s_info) if (error) then ERROUT("Cannot load COMPANY") else PUTOUT("Structure COMPANY") ; Traverse the structure xcall check_level(dcs) xcall u_close(chan) xcall u_finish stop .end subroutine check_level, reentrant, stack a_dcs ,a .include "RPSLIB:ddinfo.def" common chan ,i4 record clear_a ix ,d4 ;Loop index num_fields ,d3 ;Number of fields returned field_names ,MAX_FLDS a30 ;Array of field names name ,a30 ;Current name for optimization static record level ,i4 ;Group level (1 = main structure) proc clear clear_a dcs = a_dcs incr level xcall dd_field(dcs, DDF_SLIST, MAX_FLDS, field_names(1),, num_fields) if (error) ERROUT("Cannot load level " + %string(level)) for ix from 1 thru num_fields begin name = field_names(ix) xcall dd_field(dcs, DDF_INFO, name, f_info) if (fi_group) then begin PUTOUT("Group " + (name)) xcall dd_field(dcs, DDF_GROUP, name) xcall check_level(dcs) ;Recurse to its members xcall dd_field(dcs, DDF_ENDGROUP) PUTOUT("Endgroup") end else PUTOUT("Field " + (name)) end decr level a_dcs = dcs xreturn endsubroutine