[Api] typo correction
authorJaeyun <jy1210.jung@samsung.com>
Mon, 13 Jan 2020 04:24:14 +0000 (13:24 +0900)
committerjaeyun-jung <39614140+jaeyun-jung@users.noreply.github.com>
Mon, 20 Jan 2020 06:15:21 +0000 (15:15 +0900)
typo correction in C-Api headers.

Signed-off-by: Jaeyun Jung <jy1210.jung@samsung.com>
12 files changed:
Documentation/nnstreamer_capi.md
api/capi/doc/nnstreamer_doc.h
api/capi/include/nnstreamer-capi-private.h
api/capi/include/nnstreamer-single.h
api/capi/include/nnstreamer-tizen-internal.h
api/capi/include/nnstreamer.h
api/capi/include/platform/tizen_error.h
api/capi/src/README.md
api/capi/src/nnstreamer-capi-pipeline.c
api/capi/src/nnstreamer-capi-single.c
api/capi/src/nnstreamer-capi-tizen.c
api/capi/src/nnstreamer-capi-util.c

index 9b86d05..dfcf380 100644 (file)
@@ -10,16 +10,16 @@ The main features of the Machine Learning Inference API include:
   You can compose the data stream pipeline through Machine Learning Inference with various elements of GStreamer and NNStreamer.
 
 - [Single](#single-api) API and [Pipeline](#pipeline-api) API
-  
+
   There are two types of Machine Learning Inference API - Single API and Pipeline API.
 
   Single API is useful for a simple usage scenario of neural network models. It allows invoking a neural network model with a single instance of input data for the model directly. It is useful if you have the input data pre-processed with the application itself and there are no complex interactions between neural network models, data processors, or data stream paths.
 
   Pipeline API allows developers to construct and execute pipelines with multiple neural network models, multiple inputs and output nodes, multiple data processors, pre-and-post processors, and various data path manipulators. Besides, if the input is online data or streamed data, Pipeline API simplifies your application and improves its performance.
 
-  
+
 - Support various neural network frameworks (NNFW)
-  
+
   TensorFlow, TensorFlow-Lite, Caffe2, and PyTorch are the supported neural network frameworks. Neural network model files trained by such frameworks can be imported as filters of pipelines directly.
   Custom filters, which are neural network models implemented directly with programming languages including C/C++ and Python, maybe imported as filters of pipelines directly as well.
 
@@ -47,7 +47,7 @@ To enable your application to use the machine learning functionality:
 ## Single API
 
 This section shows how to load a model without the construction of pipelines.
+
 1. Open a model file:
 
     ```c
@@ -79,7 +79,7 @@ This section shows how to load a model without the construction of pipelines.
     ml_single_invoke (single, input, &output);
     ```
 
-4. close the opened handle:
+4. Close the opened handle:
 
     ```c
     ml_single_close (single);
index 81488be..73514e0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 36d7cd7..1ab6394 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -300,7 +300,7 @@ int ml_tensors_info_initialize (ml_tensors_info_s *info);
  * @since_tizen 6.0
  * @param[in] info1 The handle of tensors information to be compared.
  * @param[in] info2 The handle of tensors information to be compared.
- * @param[out] equal @c true if given tensors information is equal, @c false if if it's not equal.
+ * @param[out] equal @c true if given tensors information is equal, @c false if it's not equal.
  * @return @c 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
@@ -326,7 +326,7 @@ void ml_tensors_info_copy_from_gst (ml_tensors_info_s *ml_info, const GstTensors
 void ml_tensors_info_copy_from_ml (GstTensorsInfo *gst_info, const ml_tensors_info_s *ml_info);
 
 /**
- * @brief Creates a tensor data frame wihout buffer with the given tensors information.
+ * @brief Creates a tensor data frame without buffer with the given tensors information.
  * @details If @a info is null, this allocates data handle with empty tensor data.
  * @param[in] info The handle of tensors information for the allocation.
  * @param[out] data The handle of tensors data.
index 406c87a..cfefe5b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -101,7 +101,7 @@ int ml_single_close (ml_single_h single);
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
  * @retval #ML_ERROR_INVALID_PARAMETER Fail. The parameter is invalid.
- * @retval #ML_ERROR_STREAMS_PIPE Cannot push a buffer into source element.
+ * @retval #ML_ERROR_STREAMS_PIPE Failed to push a buffer into source element.
  * @retval #ML_ERROR_TIMED_OUT Failed to get the result from sink element.
  *
  */
@@ -121,7 +121,7 @@ int ml_single_invoke (ml_single_h single, const ml_tensors_data_h input, ml_tens
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
  * @retval #ML_ERROR_INVALID_PARAMETER Fail. The parameter is invalid.
- * @retval #ML_ERROR_STREAMS_PIPE Cannot push a buffer into source element.
+ * @retval #ML_ERROR_STREAMS_PIPE Failed to push a buffer into source element.
  * @retval #ML_ERROR_TIMED_OUT Failed to get the result from sink element.
  *
  */
@@ -134,7 +134,7 @@ int ml_single_invoke_dynamic (ml_single_h single, const ml_tensors_data_h input,
 /**
  * @brief Gets the information (tensor dimension, type, name and so on) of required input data for the given model.
  * @details Note that a model may not have such information if its input type is flexible.
- *          The name of tensors are sometimes unavailable (optional), while its dimensions and types are always available.
+ *          The names of tensors are sometimes unavailable (optional), while its dimensions and types are always available.
  * @since_tizen 5.5
  * @param[in] single The model handle.
  * @param[out] info The handle of input tensors information. The caller is responsible for freeing the information with ml_tensors_info_destroy().
@@ -148,7 +148,7 @@ int ml_single_get_input_info (ml_single_h single, ml_tensors_info_h *info);
 /**
  * @brief Gets the information (tensor dimension, type, name and so on) of output data for the given model.
  * @details Note that a model may not have such information if its output type is flexible and output type is not determined statically.
- *          The name of tensors are sometimes unavailable (optional), while its dimensions and types are always available.
+ *          The names of tensors are sometimes unavailable (optional), while its dimensions and types are always available.
  * @since_tizen 5.5
  * @param[in] single The model handle.
  * @param[out] info The handle of output tensors information. The caller is responsible for freeing the information with ml_tensors_info_destroy().
@@ -168,7 +168,7 @@ int ml_single_get_output_info (ml_single_h single, ml_tensors_info_h *info);
  * @return @c 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED This implies that the given framework does not support dynamic dimensions.
- *         Use ml_single_set_input_info/ml_single_get_output_info APIs instead for this framework.
+ *         Use ml_single_get_input_info() and ml_single_get_output_info() instead for this framework.
  * @retval #ML_ERROR_INVALID_PARAMETER Fail. The parameter is invalid.
  */
 int ml_single_set_input_info (ml_single_h single, const ml_tensors_info_h info);
@@ -183,7 +183,7 @@ int ml_single_set_input_info (ml_single_h single, const ml_tensors_info_h info);
  * @return @c 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED This implies that the given framework does not support dynamic dimensions.
- *         Use ml_single_set_input_info/ml_single_get_output_info APIs instead for this framework.
+ *         Use ml_single_get_input_info() and ml_single_get_output_info() instead for this framework.
  * @retval #ML_ERROR_INVALID_PARAMETER Fail. The parameter is invalid.
  */
 int ml_single_update_info (ml_single_h single, const ml_tensors_info_h in_info, ml_tensors_info_h *out_info);
index 3e341ca..a531a72 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index f62a486..bd1d0ac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -123,7 +123,7 @@ typedef enum {
   ML_NNFW_TYPE_CUSTOM_FILTER = 1,     /**< Custom filter (Independent shared object). */
   ML_NNFW_TYPE_TENSORFLOW_LITE = 2,   /**< Tensorflow-lite (.tflite). */
   ML_NNFW_TYPE_TENSORFLOW = 3,        /**< Tensorflow (.pb). */
-  ML_NNFW_TYPE_NNFW = 4,              /**< Neural Network Inference framework, which is developed by SR */
+  ML_NNFW_TYPE_NNFW = 4,              /**< Neural Network Inference framework, which is developed by Samsung Research. */
   ML_NNFW_TYPE_MVNC = 5,              /**< Intel NCSDK (libmvnc). */
   ML_NNFW_TYPE_OPENVINO = 6,          /**< Intel openVINO. */
   ML_NNFW_TYPE_VIVANTE = 7,           /**< VeriSilicon's Vivante (TBD) */
@@ -150,7 +150,7 @@ typedef enum {
 } ml_nnfw_hw_e;
 
 /**
- * @brief Possible data element types of Tensor in NNStreamer.
+ * @brief Possible data element types of tensor in NNStreamer.
  * @since_tizen 5.5
  */
 typedef enum _ml_tensor_type_e
@@ -169,13 +169,13 @@ typedef enum _ml_tensor_type_e
 } ml_tensor_type_e;
 
 /**
- * @brief Enumeration for the error codes of NNStreamer Pipelines.
+ * @brief Enumeration for the error codes of NNStreamer.
  * @since_tizen 5.5
  */
 typedef enum {
   ML_ERROR_NONE                 = TIZEN_ERROR_NONE, /**< Success! */
   ML_ERROR_INVALID_PARAMETER    = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
-  ML_ERROR_STREAMS_PIPE         = TIZEN_ERROR_STREAMS_PIPE, /**< Cannot create or access GStreamer pipeline. */
+  ML_ERROR_STREAMS_PIPE         = TIZEN_ERROR_STREAMS_PIPE, /**< Cannot create or access the pipeline. */
   ML_ERROR_TRY_AGAIN            = TIZEN_ERROR_TRY_AGAIN, /**< The pipeline is not ready, yet (not negotiated, yet) */
   ML_ERROR_UNKNOWN              = TIZEN_ERROR_UNKNOWN,  /**< Unknown error */
   ML_ERROR_TIMED_OUT            = TIZEN_ERROR_TIMED_OUT,  /**< Time out */
@@ -210,7 +210,7 @@ typedef enum {
 
 /**
  * @brief Enumeration for switch types.
- * @details This designates different GStreamer filters, "GstInputSelector"/"GetOutputSelector".
+ * @details This designates different GStreamer filters, "GstInputSelector"/"GstOutputSelector".
  * @since_tizen 5.5
  */
 typedef enum {
@@ -224,7 +224,7 @@ typedef enum {
  * @since_tizen 5.5
  * @remarks The @a data can be used only in the callback. To use outside, make a copy.
  * @remarks The @a info can be used only in the callback. To use outside, make a copy.
- * @param[out] data The handle of the tensor output (a single frame. tensor/tensors). Number of tensors is determined by ml_tensors_info_get_count() with the handle 'info'. Note that max num_tensors is 16 (#ML_TENSOR_SIZE_LIMIT).
+ * @param[out] data The handle of the tensor output (a single frame. tensor/tensors). Number of tensors is determined by ml_tensors_info_get_count() with the handle 'info'. Note that the maximum number of tensors is 16 (#ML_TENSOR_SIZE_LIMIT).
  * @param[out] info The handle of tensors information (cardinality, dimension, and type of given tensor/tensors).
  * @param[out] user_data User application's private data.
  */
@@ -277,7 +277,7 @@ int ml_pipeline_construct (const char *pipeline_description, ml_pipeline_state_c
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
  * @retval #ML_ERROR_INVALID_PARAMETER The parameter is invalid (Pipeline is not negotiated yet.)
- * @retval #ML_ERROR_STREAMS_PIPE Cannot access the pipeline status.
+ * @retval #ML_ERROR_STREAMS_PIPE Failed to access the pipeline state.
  *
  * @pre The pipeline state should be #ML_PIPELINE_STATE_PLAYING or #ML_PIPELINE_STATE_PAUSED.
  * @post The pipeline state will be #ML_PIPELINE_STATE_NULL.
@@ -311,7 +311,7 @@ int ml_pipeline_get_state (ml_pipeline_h pipe, ml_pipeline_state_e *state);
  * @return @c 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
- * @retval #ML_ERROR_INVALID_PARAMETER Given parameter is invalid. (NPipeline is not negotiated yet.)
+ * @retval #ML_ERROR_INVALID_PARAMETER Given parameter is invalid. (Pipeline is not negotiated yet.)
  * @retval #ML_ERROR_STREAMS_PIPE Failed to start the pipeline.
  *
  * @pre The pipeline state should be #ML_PIPELINE_STATE_PAUSED.
@@ -352,7 +352,7 @@ int ml_pipeline_stop (ml_pipeline_h pipe);
  * @return @c 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
- * @retval #ML_ERROR_INVALID_PARAMETER Given parameter is invalid. (Not negotiated, sink_name is not found, or sink_name has an invalid type.)
+ * @retval #ML_ERROR_INVALID_PARAMETER Given parameter is invalid. (Not negotiated, @a sink_name is not found, or @a sink_name has an invalid type.)
  * @retval #ML_ERROR_STREAMS_PIPE Failed to connect a signal to sink element.
  * @retval #ML_ERROR_OUT_OF_MEMORY Failed to allocate required memory.
  *
@@ -384,7 +384,7 @@ int ml_pipeline_sink_unregister (ml_pipeline_sink_h sink_handle);
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
  * @retval #ML_ERROR_INVALID_PARAMETER Given parameter is invalid.
- * @retval #ML_ERROR_STREAMS_PIPE Fail to get SRC element.
+ * @retval #ML_ERROR_STREAMS_PIPE Failed to get src element.
  * @retval #ML_ERROR_TRY_AGAIN The pipeline is not ready yet.
  * @retval #ML_ERROR_OUT_OF_MEMORY Failed to allocate required memory.
  */
@@ -407,19 +407,19 @@ int ml_pipeline_src_release_handle (ml_pipeline_src_h src_handle);
  * @param[in] src_handle The source handle returned by ml_pipeline_src_get_handle().
  * @param[in] data The handle of input tensors, in the format of tensors info given by ml_pipeline_src_get_tensors_info().
  *                 This function takes ownership of the data if @a policy is #ML_PIPELINE_BUF_POLICY_AUTO_FREE.
- * @param[in] policy The policy of buf deallocation.
+ * @param[in] policy The policy of buffer deallocation.
  * @return 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
  * @retval #ML_ERROR_INVALID_PARAMETER Given parameter is invalid.
- * @retval #ML_ERROR_STREAMS_PIPE The pipeline has inconsistent padcaps. (Pipeline is not negotiated yet.)
+ * @retval #ML_ERROR_STREAMS_PIPE The pipeline has inconsistent pad caps. (Pipeline is not negotiated yet.)
  * @retval #ML_ERROR_TRY_AGAIN The pipeline is not ready yet.
  */
 int ml_pipeline_src_input_data (ml_pipeline_src_h src_handle, ml_tensors_data_h data, ml_pipeline_buf_policy_e policy);
 
 /**
  * @brief Gets a handle for the tensors information of given src node.
- * @details If the mediatype is not other/tensor or other/tensors, @a info handle may not be correct. If want to use other media types, you MUST set the correct properties.
+ * @details If the media type is not other/tensor or other/tensors, @a info handle may not be correct. If want to use other media types, you MUST set the correct properties.
  * @since_tizen 5.5
  * @remarks If the function succeeds, @a info handle must be released using ml_tensors_info_destroy().
  * @param[in] src_handle The source handle returned by ml_pipeline_src_get_handle().
@@ -428,7 +428,7 @@ int ml_pipeline_src_input_data (ml_pipeline_src_h src_handle, ml_tensors_data_h
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
  * @retval #ML_ERROR_INVALID_PARAMETER Given parameter is invalid.
- * @retval #ML_ERROR_STREAMS_PIPE The pipeline has inconsistent padcaps. (Pipeline is not negotiated yet.)
+ * @retval #ML_ERROR_STREAMS_PIPE The pipeline has inconsistent pad caps. (Pipeline is not negotiated yet.)
  * @retval #ML_ERROR_TRY_AGAIN The pipeline is not ready yet.
  */
 int ml_pipeline_src_get_tensors_info (ml_pipeline_src_h src_handle, ml_tensors_info_h *info);
@@ -438,7 +438,7 @@ int ml_pipeline_src_get_tensors_info (ml_pipeline_src_h src_handle, ml_tensors_i
  ****************************************************/
 
 /**
- * @brief Gets a handle to operate a "GstInputSelector / GstOutputSelector" node of NNStreamer pipelines.
+ * @brief Gets a handle to operate a "GstInputSelector"/"GstOutputSelector" node of NNStreamer pipelines.
  * @details Refer to https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-input-selector.html for input selectors.
  *          Refer to https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-output-selector.html for output selectors.
  * @since_tizen 5.5
@@ -547,7 +547,7 @@ int ml_pipeline_switch_get_pad_list (ml_pipeline_switch_h switch_handle, char **
 
 /**
  * @brief Gets a handle to operate a "GstValve" node of NNStreamer pipelines.
- * @details Refer to https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-valve.html for more info.
+ * @details Refer to https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-valve.html for more information.
  * @since_tizen 5.5
  * @remarks If the function succeeds, @a valve_handle handle must be released using ml_pipeline_valve_release_handle().
  * @param[in] pipe The pipeline to be managed.
@@ -612,10 +612,10 @@ int ml_tensors_info_destroy (ml_tensors_info_h info);
 
 /**
  * @brief Validates the given tensors information.
- * @details If the function returns an error, @a valid is not changed.
+ * @details If the function returns an error, @a valid may not be changed.
  * @since_tizen 5.5
  * @param[in] info The handle of tensors information to be validated.
- * @param[out] valid @c true if it's valid, @c false if if it's invalid.
+ * @param[out] valid @c true if it's valid, @c false if it's invalid.
  * @return @c 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
@@ -807,13 +807,13 @@ int ml_tensors_data_set_tensor_data (ml_tensors_data_h data, unsigned int index,
 
 /**
  * @brief Checks the availability of the given execution environments.
- * @details If the function returns an error, @a available is not changed.
+ * @details If the function returns an error, @a available may not be changed.
  * @since_tizen 5.5
  * @param[in] nnfw Check if the nnfw is available in the system.
  *               Set #ML_NNFW_TYPE_ANY to skip checking nnfw.
  * @param[in] hw Check if the hardware is available in the system.
  *               Set #ML_NNFW_HW_ANY to skip checking hardware.
- * @param[out] available @c true if it's available, @c false if if it's not available.
+ * @param[out] available @c true if it's available, @c false if it's not available.
  * @return @c 0 on success. Otherwise a negative error value.
  * @retval #ML_ERROR_NONE Successful and the environments are available.
  * @retval #ML_ERROR_NOT_SUPPORTED Not supported.
index cb5f6c9..164bce7 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 3562712..6446da8 100644 (file)
@@ -3,7 +3,7 @@
 ## Files
 - nnstreamer-capi-pipeline.c - API to make pipeline with NNStreamer
 - nnstreamer-capi-single.c - API to run a single model with NNStreamer, independent of GStreamer
-- nnstreamer-capi-util.c - Utility functions for capi
+- nnstreamer-capi-util.c - Utility functions for CAPI
 - tensor\_filter\_single.c - Tensor\_filter independent of GStreamer
 
 ## Comparison of Single API
index e71d048..2bdea07 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 9610d53..405f4e3 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 90a8734..f7edf09 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index d2d41e6..5106e0e 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public