/** * @file simple_use_case_configfile_c.c * * @brief Sample code to demonstrate the Quantum Origin SDK C API. A config file is used for configuration. * System: Quantum Origin SDK * Component: Quantum Origin SDK Documentation * * Please contact Quantinuum for production license(s). * * @author Quantinuum CSE */ // clang-format off #include #include #include #include #include #include #include #include #define BUFFER_SIZE 400U // Forward declaration to ensure that the interface function is correctly defined. static tQOSDK_LOGGER_CALLBACK_FN my_qo_logger_callback; //-------------------------------------------------------------- // Logger callback //-------------------------------------------------------------- static void my_qo_logger_callback(const tQOSDK_LOGLEVEL logLevel, const char *szMsg, size_t msgLen) { // Store or present the inbound message somewhere. switch(logLevel) { case QOSDK_LOGLEVEL_NONE : break; case QOSDK_LOGLEVEL_CRITICAL : fprintf(stderr, "[QuantumOrigin] CRITICAL: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_ERROR : fprintf(stderr, "[QuantumOrigin] ERROR: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_WARNING : fprintf(stderr, "[QuantumOrigin] WARNING: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_INFO : fprintf(stderr, "[QuantumOrigin] INFO: %.*s\n", (int)msgLen, szMsg); break; case QOSDK_LOGLEVEL_DEBUG : fprintf(stderr, "[QuantumOrigin] DEBUG: %.*s\n", (int)msgLen, szMsg); break; default: case QOSDK_LOGLEVEL_TRACE : fprintf(stderr, "[QuantumOrigin] TRACE: %.*s\n", (int)msgLen, szMsg); break; } } //-------------------------------------------------------------- // Simple hex dump //-------------------------------------------------------------- static void hex_dump(const char *szTitle, const uint8_t *pData, size_t cbData) { printf("%s [%lu bytes]: ", szTitle ? szTitle : "HEXDUMP: ", (unsigned long)cbData); if (pData && cbData) { for (int ii = 0; ii < cbData; ii++) { printf("%2.2X ", pData[ii]); } } printf("\n"); } //-------------------------------------------------------------- // Main //-------------------------------------------------------------- int main(int argc, char **argv) { tQOSDK_CTX * pQuantumOrigin = NULL; uint32_t bytesRequested = 0xFFFFFFFF; size_t bytesSupplied = 0; unsigned char resultBuffer[BUFFER_SIZE]; int erc = ERC_QOSDK_UNSPECIFIED_ERROR; char * szConfigFilename = "config-sample-01.yml"; // Parse parameters for (int jj = 1; jj < argc; jj++) { if (strcmp(argv[jj], "--help") == 0) { printf("USAGE: simple_use_case_configfile_c [] // (Default = 32 bytes)\n"); return EXIT_SUCCESS; } if (bytesRequested == 0xFFFFFFFF) { if (argv[jj][0] == '-') { fprintf(stderr, "ERROR: Number of bytes requested cannot be negative\n"); return EXIT_FAILURE; } bytesRequested = (uint32_t)atol(argv[jj]); if (bytesRequested > BUFFER_SIZE) { fprintf(stderr, "ERROR: Number of bytes requested must be <= %u\n", BUFFER_SIZE); return EXIT_FAILURE; } continue; } } if (bytesRequested == 0xFFFFFFFF) { bytesRequested = 32; } // Initialise Quantum Origin Logging erc = qosdk_initialise_logging(QOSDK_LOGMODE_STDERR, QOSDK_LOGLEVEL_WARNING, NULL); if (erc) { const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to initialize logging (QuantumOriginError=%d: \"%s\")\n", erc, szQuantumOriginError?szQuantumOriginError:"Unspecified"); return EXIT_FAILURE; } // Register a Quantum Origin Logging callback erc = qosdk_set_logging_callback(my_qo_logger_callback); if (erc) { const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to set logging callback (QuantumOriginError=%d: \"%s\")\n", erc, szQuantumOriginError?szQuantumOriginError:"Unspecified"); return EXIT_FAILURE; } // Initialise Quantum Origin pQuantumOrigin = qosdk_init_from_config_file(szConfigFilename, ""); if (pQuantumOrigin == NULL) { erc = qosdk_get_error_code(); const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to initialize Quantum Origin with qosdk_init_from_config_file(\"%s\") (QuantumOriginError=%d: \"%s\")\n", szConfigFilename, erc, szQuantumOriginError?szQuantumOriginError:"Unspecified"); // Cleanup and exit qosdk_clear_logging_callback(); return EXIT_FAILURE; } // Exercise the logging callback qosdk_log_message(QOSDK_LOGLEVEL_WARNING, "This is a test warning message"); // Get randomness bytesSupplied = 0; erc = qosdk_get_randomness(pQuantumOrigin, resultBuffer, bytesRequested, &bytesSupplied); if (erc) { const char *szQuantumOriginError = qosdk_get_error_description(); fprintf(stderr, "ERROR: Failed to get randomness. (QuantumOriginError=%d: \"%s\")\n", erc, szQuantumOriginError?szQuantumOriginError:"Unspecified"); // Cleanup and exit qosdk_destroy(pQuantumOrigin); qosdk_clear_logging_callback(); return EXIT_FAILURE; } // Print results hex_dump("RESULT", resultBuffer, bytesSupplied); // Cleanup and exit qosdk_destroy(pQuantumOrigin); qosdk_clear_logging_callback(); return EXIT_SUCCESS; }