IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 16355


Ignore:
Timestamp:
Feb 7, 2008, 1:45:56 PM (18 years ago)
Author:
Paul Price
Message:

Adding functions pmFPAfileSelect and pmFPAfileSelectSingle to return ('select') particular files from the list. Re-implementing pmFPAfileActivate using these.

Location:
trunk/psModules/src/camera
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/camera/pmFPAfile.c

    r16343 r16355  
    482482  return ("NONE");
    483483}
     484
     485
     486psArray *pmFPAfileSelect(psMetadata *files, const char *name)
     487{
     488    PS_ASSERT_PTR_NON_NULL(files, NULL);
     489
     490    psList *list = psListAlloc(NULL);   // List of files selected
     491
     492    psString regex = NULL;              // Regular expression
     493    if (name) {
     494        psStringAppend(&regex, "^%s$", name);
     495    }
     496    psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
     497    psFree(regex);
     498    psMetadataItem *item;               // Item from iteration
     499    while ((item = psMetadataGetAndIncrement(iter))) {
     500        pmFPAfile *file = item->data.V; // File of iterest
     501        psListAdd(list, PS_LIST_TAIL, file);
     502    }
     503    psFree(iter);
     504
     505    psArray *array = psListToArray(list); // Array generated from list
     506    psFree(list);
     507
     508    return array;
     509}
     510
     511pmFPAfile *pmFPAfileSelectSingle(psMetadata *files, const char *name, int num)
     512{
     513    PS_ASSERT_PTR_NON_NULL(files, NULL);
     514    PS_ASSERT_INT_NONNEGATIVE(num, NULL);
     515
     516    psString regex = NULL;              // Regular expression
     517    if (name) {
     518        psStringAppend(&regex, "^%s$", name);
     519    }
     520
     521    psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
     522    psFree(regex);
     523    psMetadataItem *item;               // Item from iteration
     524    int i = 0;                          // Counter
     525    while ((item = psMetadataGetAndIncrement(iter))) {
     526        if (i++ == num) {
     527            return item->data.V;
     528        }
     529    }
     530    psFree(iter);
     531
     532    psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unable to find instance %d of file %s", num, name);
     533    return NULL;
     534}
  • trunk/psModules/src/camera/pmFPAfile.h

    r16343 r16355  
    44 * @author EAM, IfA
    55 *
    6  * @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
    7  * @date $Date: 2008-02-07 00:08:53 $
     6 * @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
     7 * @date $Date: 2008-02-07 23:45:56 $
    88 * Copyright 2004-2005 Institute for Astronomy, University of Hawaii
    99 */
     
    128128const char *pmFPAfileStringFromType(pmFPAfileType type);
    129129
     130/// Select files with the same name from the list of files
     131///
     132/// Returns all files if name is NULL.
     133psArray *pmFPAfileSelect(psMetadata *files, ///< All files
     134                         const char *name ///< Name of file(s) to return, or NULL for all
     135    );
     136
     137/// Select a specific instance of a file from the list of files
     138///
     139/// Returns the num-th instance of all files if name is NULL.
     140pmFPAfile *pmFPAfileSelectSingle(psMetadata *files, ///< All files
     141                                 const char *name, ///< Name of file
     142                                 int num ///< Instance number of specific instance
     143    );
     144
     145
     146
    130147/// @}
    131148# endif
  • trunk/psModules/src/camera/pmFPAfileIO.c

    r16344 r16355  
    912912}
    913913
    914 // set the state of the specified pmFPAfile to active (state == true) or inactive
     914
     915// set the state of the specified pmFPAfile(s) to active (state == true) or inactive
    915916// if name is NULL, set the state for all pmFPAfiles
    916 bool pmFPAfileActivate (psMetadata *files, bool state, const char *name)
     917bool pmFPAfileActivate(psMetadata *files, bool state, const char *name)
    917918{
    918919    PS_ASSERT_PTR_NON_NULL(files, false);
    919920
    920     // Do this as an iteration rather than a lookup, since we may want to turn on/off multiple files at once
    921     // (if there are multiple files defined with the same name).
    922 
    923     if (!name) {
    924         psMetadataItem *item = NULL;
    925         psMetadataIterator *iter = psMetadataIteratorAlloc (files, PS_LIST_HEAD, NULL);
    926         while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
    927             pmFPAfile *file = item->data.V;
    928             if (state) {
    929                 file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
    930             } else {
    931                 file->state |= PM_FPA_STATE_INACTIVE;
    932             }
    933         }
    934         psFree (iter);
    935         return true;
    936     }
    937 
    938     if (!psMetadataLookup(files, name)) {
    939         // We activated every example of that file that we could find.
    940         return true;
    941     }
    942 
    943     psString regex = NULL;              // Regular expression for psMetadataIteratorAlloc
    944     if (name) {
    945         psStringAppend(&regex, "^%s$", name);
    946     }
    947 
    948     int num = 0;                        // Number of files activated
    949     psMetadataItem *item = NULL;        // Item from iteration
    950     psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
    951     while ((item = psMetadataGetAndIncrement(iter))) {
    952         pmFPAfile *file = item->data.V; // File of interest
     921    psArray *selected = pmFPAfileSelect(files, name);
     922    if (!selected) {
     923        psError(PS_ERR_UNKNOWN, false, "Unable to select files with name %s", name);
     924        return false;
     925    }
     926    for (int i = 0; i < selected->n; i++) {
     927        pmFPAfile *file = selected->data[i]; // File of interest
     928        if (!file) {
     929            continue;
     930        }
    953931        if (state) {
    954932            file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
     
    956934            file->state |= PM_FPA_STATE_INACTIVE;
    957935        }
    958         num++;
    959     }
    960     psFree(iter);
    961     psFree(regex);
     936    }
     937    psFree(selected);
    962938
    963939    return true;
     
    971947    PS_ASSERT_INT_NONNEGATIVE(num, NULL);
    972948
    973     psString regex = NULL;              // Regular expression for psMetadataIteratorAlloc
    974     psStringAppend(&regex, "^%s$", name);
    975 
    976     int i = 0;                          // Counter
    977     psMetadataItem *item = NULL;        // Item from iteration
    978     psMetadataIterator *iter = psMetadataIteratorAlloc(files, PS_LIST_HEAD, regex); // Iterator
    979     psFree(regex);
    980     while ((item = psMetadataGetAndIncrement(iter))) {
    981         if (i++ == num) {
    982             pmFPAfile *file = item->data.V; // File of interest
    983             if (state) {
    984                 file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
    985             } else {
    986                 file->state |= PM_FPA_STATE_INACTIVE;
    987             }
    988             psFree(iter);
    989             return file;
    990         }
    991     }
    992     psFree(iter);
    993     return NULL;
    994 }
     949    pmFPAfile *file = pmFPAfileSelectSingle(files, name, num);
     950    if (!file) {
     951        psError(PS_ERR_UNKNOWN, false, "Unable to select instance %d of file %s", num, name);
     952        return NULL;
     953    }
     954    if (state) {
     955        file->state &= PS_NOT_U8(PM_FPA_STATE_INACTIVE);
     956    } else {
     957        file->state |= PM_FPA_STATE_INACTIVE;
     958    }
     959
     960    return file;
     961}
Note: See TracChangeset for help on using the changeset viewer.